Несколько mpu9250 с использованием tca9548a с esp32

Я использую ESP32 и 1 датчик mpu9250(только для тестирования) с tca9548a, соединения:

TCA <-> ESP

VIN - VCC

GND - GND

ПДД - GPIO21

SCL - GPIO22

TCA <-> MPU

SD2 - ПДД

SC2 - SCL

ВИН - ВИН

GND - GND

И мой код здесь:

#include <SparkFunMPU9250-DMP.h>
#include <Wire.h>

#define TCAADDR 0x70
void tcaselect(uint8_t i) {
  if (i > 7) return;
 
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();  
}

MPU9250_DMP imu;

void setup() 
{
  Serial.begin(115200);
  Wire.begin();
  tcaselect(2);
  if (imu.begin() != INV_SUCCESS)
  {
    while (1)
    {
      Serial.println("Unable to communicate with MPU-9250");
      Serial.println("Check connections, and try again.");
      Serial.println();
      delay(5000);
    }
  }
  
  imu.dmpBegin(DMP_FEATURE_6X_LP_QUAT | // Enable 6-axis quat
               DMP_FEATURE_GYRO_CAL, // Use gyro calibration
              10); // Set DMP FIFO rate to 10 Hz
              delay(10000);
}

void loop() 
{
  tcaselect(2);
    imu.dmpUpdateFifo();
  float q0 = imu.calcQuat(imu.qw);
  float q1 = imu.calcQuat(imu.qx);
  float q2 = imu.calcQuat(imu.qy);
  float q3 = imu.calcQuat(imu.qz);
  Serial.println("Q: " + String(q0, 4) + ", " +
                    String(q1, 4) + ", " + String(q2, 4) + 
                    ", " + String(q3, 4));delay(10);
}

Мне нужно получить кватернионы от датчика MPU, но я получаю только нули на выходе.

Библиотека, которую я использовал: https://github.com/rupin/SparkFun_MPU-9250-DMP_Arduino_Library

Что может быть не так, моя связь или библиотека?

, 👍0

Обсуждение

вы читали ответ на этот вопрос? https://arduinoprosto.ru/q/70834/multiple-mpu9250-synced, @Juraj

Вы можете попробовать адаптировать скетч сканера I2C для использования TCA9548a, как вы это делаете. Затем вы можете проверить, действительно ли MPU виден на автобусе. Я бы подумал, что Arduino не может достичь MPUn, поэтому выдает только нули, @chrisl

@Juraj да, я попробую этот метод позже. Но теперь я хотел бы выяснить, почему мой метод не работает, @TryHack Channel

@Juraj Это работает, спасибо!, @TryHack Channel

@chrisl Это правда, сканер TCA не может найти никаких адресов MPU9250. Похоже на растяжение часов(idk). Но теперь я использую метод изменения адреса MPU, который я использую в 1 тике., @TryHack Channel


1 ответ


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

0

Решение заключается в том, что я просто удалил tca9548a из схемы. Затем я подключил каждый вывод AD0 к соответствующим выводам GPIO ESP32, чтобы включить датчик, я посылаю ему низкий сигнал и высокий сигнал всем остальным. Таким образом, библиотека работает только с датчиком, адрес которого равен 0x68.

Есть пример функции из моего скетча:

#include <SparkFunMPU9250-DMP.h>

/*INIT SENSORS*/
MPU9250_DMP imu;
MPU9250_DMP imu1;
const int sensor1 = 18;
const int sensor2 = 19;

String IMU_1Update(){
  String res;
    digitalWrite(sensor1, LOW); // 1st sensor enable - 0x68
    digitalWrite(sensor2, HIGH); // 2nd sensor disable - 0x69
  if ( imu1.fifoAvailable() ){
    if ( imu1.dmpUpdateFifo() == INV_SUCCESS){
      float q0 = imu1.calcQuat(imu1.qw);
      float q1 = imu1.calcQuat(imu1.qx);
      float q2 = imu1.calcQuat(imu1.qy);
      float q3 = imu1.calcQuat(imu1.qz);
      Serial.print("G1|");
      Serial.print(q0);
      Serial.print("|");
      Serial.print(q1);
      Serial.print("|");
      Serial.print(q2);
      Serial.print("|");
      Serial.print(q3);
      Serial.println("|");
    }
  }
  return res;
}
,