Можно ли подключить 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?

, 👍0

Обсуждение

Возможный дубликат [Управляйте несколькими MPU9250, чтобы начать сбор данных одновременно](https://arduinoprosto.ru/q/31679/control-multiple-mpu9250-to-start-collecting-data-at-the-same -время), @Juraj


1 ответ


Лучший ответ:

0

Похоже, что у 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