Можно ли подключить 3 MPU9250 к Node MCU без мультиплексора?
Является ли идея подключения контактов AD0 MPU9250 актуальной, как и второй ответ на этот вопрос? - Как изменить адрес i2c для mpu9250?
Я подключил 2 датчика для проверки. SCL и усилитель; SDA обоих параллельно с D1 и amp; D2 узла mcu. Затем подключил AD0 обоих датчиков к разным выводам ввода-вывода узла mcu, но это не сработало. Каким может быть решение?
Код для управления 1 датчиком: — Он сработал, когда я установил AD0 на высокий уровень и изменил адрес на 0x69
#include "MPU9250.h"
// объект MPU9250 с датчиком MPU-9250 на шине I2C 0 с адресом 0x68
MPU9250 IMU(Wire,0x68);
int status;
void setup() {
// серийный номер для отображения данных
Serial.begin(115200);
while(!Serial) {}
// начинаем связь с IMU
status = IMU.begin();
if (status < 0) {
Serial.println("IMU initialization unsuccessful");
Serial.println("Check IMU wiring or try cycling power");
Serial.print("Status: ");
Serial.println(status);
while(1) {}
}
}
void loop() {
// читаем датчик
IMU.readSensor();
// отображаем данные
Serial.print(IMU.getAccelX_mss(),6);
Serial.print("\t");
Serial.print(IMU.getAccelY_mss(),6);
Serial.print("\t");
Serial.print(IMU.getAccelZ_mss(),6);
Serial.print("\t");
Serial.print(IMU.getGyroX_rads(),6);
Serial.print("\t");
Serial.print(IMU.getGyroY_rads(),6);
Serial.print("\t");
Serial.print(IMU.getGyroZ_rads(),6);
Serial.print("\t");
Serial.print(IMU.getMagX_uT(),6);
Serial.print("\t");
Serial.print(IMU.getMagY_uT(),6);
Serial.print("\t");
Serial.print(IMU.getMagZ_uT(),6);
Serial.print("\t");
Serial.println(IMU.getTemperature_C(),6);
delay(100);
}
Код для управления двумя датчиками:-
#include "MPU9250.h"
// объект MPU9250 с датчиком MPU-9250 на шине I2C 0 с адресом 0x68
MPU9250 IMU1(Wire,0x68);
MPU9250 IMU2(Wire,0x68);
int status;
void setup() {
// серийный номер для отображения данных
Serial.begin(115200);
pinMode(D7, OUTPUT);
pinMode(D8, OUTPUT);
}
void IMU_1() {
digitalWrite(D7, LOW);
digitalWrite(D8, HIGH);
IMU1.begin();
IMU1.readSensor();
Serial.print("IMU 1 is active: "); Serial.print(IMU1.getAccelX_mss(),6);
digitalWrite(D8, LOW);
}
void IMU_2() {
digitalWrite(D7, HIGH);
digitalWrite(D8, LOW);
IMU2.begin();
IMU2.readSensor();
Serial.println("IMU 2 is active: "); Serial.print(IMU2.getAccelX_mss(),6);
digitalWrite(D7, LOW);
}
void loop() {
IMU_1();
IMU_2();
delay(500);
}
Результат: — Показания одного датчика отображаются, но второй датчик каждый раз показывает «0».
Как лучше всего использовать 3 датчика I2C, когда есть только 1 шина I2C?
@suu, 👍0
Обсуждение1 ответ
Лучший ответ:
Похоже, что у MPU9250 есть вывод AD0, который позволяет переключать устройство между двумя фиксированными адресами I2C.
Это дает вам простое решение, если вам нужно использовать два из них.
Более того, в сообщении, на которое вы ссылаетесь, предлагается сохранить их все в одном и том же состоянии AD0, кроме того, с которым вы хотите поговорить. Вы переключите этот вывод AD0 в другое состояние, что приведет к присвоению ему адреса I2C, а затем обратитесь к нему по этому адресу, который будет уникальным на шине I2C.
Этот подход должен сработать, но это своего рода хак.
Вы говорите: «Я подключил 2 датчика в качестве теста. SCL и SDA обоих параллельны D1 и D2 узла mcu. Затем подключили AD0 обоих датчиков к разным контактам ввода-вывода узла mcu, но этого не произошло. работа." Что не сработало? Что происходит? Какой вывод вы получаете. Какие контакты вашего микроконтроллера подключены к AD0 на трех разных модулях MPU9250? Где находится код, который манипулирует цифровыми выводами, чтобы выбрать для чтения один и только один из ваших модулей MPU9250?
Вам необходимо подробно объяснить вашу настройку, включая различные назначения контактов и то, как они должны работать. Не позволяйте нам читать ваш код и пытаться выяснить ваши намерения.
Глядя на ваш код, кажется, что вы используете D7 и D8 на своем микроконтроллере, чтобы попытаться контролировать, какой MPU9250 активен. Однако я не вижу никакого кода, устанавливающего D7 и D8 в качестве выходных данных.
Почему вы не хотите использовать чип сопоставления адресов I2C? Они легко доступны, и те, которые я видел, позволяют адресовать до 8 устройств I2C, жестко подключенных к одному и тому же адресу.
спасибо, обновил код и ошибки :) . Это не работает, даже когда я обновил код. Я хочу изменить адрес на 0x69 и посмотреть, но у моего узла mcu возникла проблема., @suu
Вероятно, вам потребуется настроить два устройства IMU, IMU1 и IMU2, оба по адресу 0x68. Настройте контакты D7 и D8 так, чтобы первый из них находился по адресу 0X68, и введите команду IMU1.begin(). Затем переключите контакты так, чтобы второй находился по адресу 0x68, и выполните IMU2.begin()
., @Duncan C
А как насчет приведенного выше кода? Я обновил его, но он показывает показания второго датчика как ноль. Еще меня беспокоит блок питания. Похоже, что микроконтроллер узла может выдавать максимальный ток 550 мА, в то время как оба чипа IMU потребляют ток 740 мА, может ли эта проблема быть связана с нехваткой тока?, @suu
Да, это проблема. Если один IMU может потреблять больше, чем общая мощность вашего источника питания, у вас есть проблема только с одним IMU. Я нашел в Интернете несколько недорогих блоков питания на 5 В, 2 А. Я использую их для своего проекта. Я предлагаю вам сделать то же самое., @Duncan C
Спасибо, Дункан :), @suu
И последнее: какой метод быстрее получит данные imu? Используя вышеуказанный метод или используя мультиплексор? (за исключением использования узла mcu на каждом датчике). Поскольку я хочу управлять манипулятором робота в реальном времени с помощью этих датчиков, поэтому мне нужно как можно скорее извлечь данные из IMU., @suu
Я сомневаюсь, что вы сможете обнаружить разницу в скорости между двумя методами. Программный метод добавляет несколько инструкций для управления выводами перед выдачей команд I2C, что приводит к дополнительной задержке в несколько микросекунд. Эффект от использования аппаратного мультиплексора будет зависеть от того, какую задержку распространения мультиплексор добавляет к командам I2C, передаваемым туда и обратно на «нисходящие» устройства. Если вы используете его, сначала выбрав одно из мультиплексированных устройств I2C, оно, вероятно, маршрутизирует сообщения с наносекундной задержкой, но вам придется запустить код для управления мультиплексором I2C., @Duncan C
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Датчик помех I2C (SCL+SDA) и связь MasterSlave
- Проблема с отображением времени Ntp на oled с использованием библиотеки U8G2.
- Wire1' was not declared in this scope в библиотеке I2C_MPU6886
- Протокол I2C не работает должным образом
Возможный дубликат [Управляйте несколькими MPU9250, чтобы начать сбор данных одновременно](https://arduinoprosto.ru/q/31679/control-multiple-mpu9250-to-start-collecting-data-at-the-same -время), @Juraj