Считывание нескольких датчиков MPU 9250 с помощью мультиплексора TCA9548A

Я пытаюсь считывать несколько датчиков MPU 9250 с помощью мультиплексора TCA9548A в ESP 32 и Arduino IDE. Кто-нибудь сделал это успешно?

Я новичок в области кодирования Arduino. Я пытаюсь отредактировать код в этом руководстве для MPU 9250 (https://www.bluedot.space/tutorials/connect-multiple-sensors-using-i2c-multiplexer /). Я сталкиваюсь с проблемами с библиотеками и командами при переходе с BME 280 на MPU 9250. Как только я перехожу на MPU 9250 и пытаюсь вызвать экземпляр MPU9250 IMU_0, я получаю сообщение об ошибке "нет соответствующей функции для вызова 'MPU9250", которое, как я понимаю, связано с тем, что библиотека, которую я использовал, не поддерживает вызов. Я не могу найти альтернативную библиотеку или команду. Как с этим можно разобраться?

#include <Wire.h>
#include <MPU9250.h>
MPU9250 mpu_0;
MPU9250 mpu_1;
MPU9250 mpu_2;
MPU9250 mpu_3;

#define TCAADDR 0x70
void tcaselect(uint8_t i) {
  if (i > 7) return;
 
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();  
}
void setup() {
  Serial.begin(9600);
  Wire.begin();
  Serial.println(F("##############################"));            
  Serial.println(F("Starting Initialization"));
  Serial.println(F("##############################"));       
 
  //*************INITIALIZING FIRST SENSOR*******************************   
  tcaselect(0);
    
  if (mpu_0.begin() != 0x68)
  { Serial.print(F("MPU.1 detected?\t")); Serial.println(F("No"));}
  else
  { Serial.print(F("MPU.1 detected?\t")); Serial.println(F("Yes"));}
  //**********************************************************************
  //*************INITIALIZING SECOND SENSOR*******************************  
  tcaselect(1);  
    
  if (mpu_1.begin() != 0x68)
  { Serial.print(F("MPU Nr.2 detected?\t")); Serial.println(F("No"));}
  else
  { Serial.print(F("MPU Nr.2 detected?\t")); Serial.println(F("Yes"));}
  //*********************************************************************      
  //**********************************************************************  
  Serial.println();
  Serial.println(F("##############################"));            
  Serial.println(F("Initialization Finished"));
  Serial.println(F("##############################"));            
  Serial.println();
  Serial.println();
}

, 👍2

Обсуждение

"Я сталкиваюсь с * проблемами *". Какие проблемы?, @timemage

Ваш код почти невозможно прочитать. Вы можете рассмотреть возможность редактирования своего вопроса и использования средств форматирования кода на странице., @jwh20

Какую библиотеку MPU9250 вы используете? Вы смотрели на его примеры, чтобы исправить свой код?, @Mat

Я не вижу никакого вопроса, который был бы задан, @jsotola

Я использую библиотеку MPU 9250 из системы bolder-flights. В руководстве по мультиплексору они использовали BME280 и BlueDot_BME280library. Как только я перехожу на MPU 9250 и пытаюсь вызвать экземпляр MPU9250 IMU_0, я получаю сообщение об ошибке "нет соответствующей функции для вызова 'MPU9250", которое, как я понимаю, связано с тем, что библиотека, которую я использовал, не поддерживает вызов. Я не могу найти альтернативную библиотеку или команду. Какие альтернативы я могу использовать или как я могу добиться одновременного снятия показаний с нескольких MPU9250 с помощью мультиплексора? Спасибо, @Ajay Raj


1 ответ


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

1

Вам нужно адаптировать пример, которому вы следуете, чтобы следить за тем, как библиотека MPU выполняет свою конструкцию и настройку.

Просматривая документацию для библиотеки MPU, которую вы используете, вы должны изменить определения на:

MPU9250 mpu_0(Wire, 0x68);  // 0x69, если вы подняли AD0 высоко

Затем, если вы прочтете дальше раздел "Общие функции настройки", вы увидите, что функция настройки этой библиотеки имеет следующее поведение:

Эта функция возвращает положительное значение при успешной инициализации и возвращает отрицательное значение при неудачной инициализации

Так что вам тоже нужно это адаптировать:

Serial.print(F("MPU.1 detected?\t"));
if (mpu_0.begin() < 0) { // в примерах предполагается, что ноль тоже в порядке
  Serial.println(F("No"));
} else {
  Serial.println(F("Yes"));
}

Вы избавите себя от некоторых проблем, если тоже будете использовать массив для своих датчиков.

MPU9250 mpus[] = { MPU9250(Wire, 0x68), MPU9250(Wire, 0x68) }; 
const int num_mpus = sizeof(mpus)/sizeof(mpus[0]);

Затем ваша инициализация может быть выполнена с помощью цикла:

for (int i = 0; i < num_mpus; ++i) {
   tcaselect(i);
   if (mpus[i].begin() < 0) {
     // ...
   }
 }

И вы можете делать аналогичные вещи для взаимодействия с датчиком. например:

for (int i = 0; i < num_mpus; ++i) {
   tcaselect(i);
   mpus[i].readSensor();
   Serial.println(mpus[i].getAccelX_mss());
   // ...
 }
,

Большое вам спасибо... Я бы попробовал их реализовать.., @Ajay Raj