mpu9250 подключенный через tca9548a к ESP32

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Подключил 1 mpu через мультиплексор(для теста) к ESP32, мне нужно получить кватернионы. Написал такой скетч:

#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);
  tcaselect(2);
  imu.begin();
  
  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
}

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));
}

Вывод по нулям

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
Q: 0.0000, 0.0000, 0.0000, 0.0000
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 
Что может быть не так, неисправность мультиплексора или несовместимость библиотеки? I2C Scanner показывает 0х70 адрес на мультиплексор.
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А модуль умеет от 3.3 ? Зачем в тесте мультиплексор ?

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Мне нужно затестить работу с мультиплексором, т.к. планирую еще 4 датчика подключить. Модуль умеет от 3.3В, я подключал напрямую к ESP32, так он работает. А через мультиплексор нет почему то

SadZhaba
Offline
Зарегистрирован: 06.04.2018
b707
Offline
Зарегистрирован: 26.05.2017

Вы подключили аксель к мультиплексору с адресом 0х70. А библиотека об этом знает? Она может ищет модуль по его старому адресу.

Какой адрес у самого модуля?

 

 

 

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Я также подумал, но не понял, как адресоваться по 0х70->0х68(Адрес у модуля 0х68)

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Да и вообще, у всех гайдов по использованию tca9548a, просто используется функция tcaselect(uint i), а дальше все рабоатет само. Я руководствовался этим: https://randomnerdtutorials.com/tca9548a-i2c-multiplexer-esp32-esp8266-arduino/

b707
Offline
Зарегистрирован: 26.05.2017

SadZhaba пишет:

Я также подумал, но не понял, как адресоваться по 0х70->0х68(Адрес у модуля 0х68)

Адресоваться на 0х70.

для этого переписать библиотеку, указав в ней адрес 0х70

SadZhaba
Offline
Зарегистрирован: 06.04.2018

В библиотеке только адреса регистров, адреса самого модуля не нашел. Вряд ли в даташите будет инфа по регистрам с подключением через мультиплексор. Почему тогда, к примеру, BMX055 и ардуино уно работают через этот мультиплексор?

 

b707
Offline
Зарегистрирован: 26.05.2017

SadZhaba пишет:

В библиотеке только адреса регистров, адреса самого модуля не нашел. Вряд ли в даташите будет инфа по регистрам с подключением через мультиплексор.

Не путайте теплое с мягким.

Регистры - свойство самого чипа, от того работает он через мултиплексор или нет - адреса регистров не зависят

 

Посмотрел примеры - был неправ, адрес сенсора менять не надо

sadman41
Offline
Зарегистрирован: 19.10.2016
const struct hw_s hw = {
    .addr           = 0x68,
    .max_fifo       = 1024,
    .num_reg        = 128,
    .temp_sens      = 321,
    .temp_offset    = 0,
    .bank_size      = 256
#if defined AK89xx_SECONDARY
    ,.compass_fsr    = AK89xx_FSR
#endif
};

 

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Про регистры инфы не знал, извиняюсь.

Я вот тоже думаю, что если у меня BMX055 работал с кривой библиотекой от iarduino через мультиплексор более менее, то mpu9250 с тонной библиотек должен работать и без всяких танцев с бубном.

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Это в файле "inv_mpu.c" проставить значения? Или уже в самом скетче структуру прописать?

b707
Offline
Зарегистрирован: 26.05.2017

если я правильно понял даташит к tca9548. он работает как прозрачный мост между внешней шиной i2c и одной из своих slave-шин. То есть абсолютно все запросы с любыми адресами просто перекидываются из мастер шины в текущую выбранную славе.

Из этого следует, что отдельно настраивать адрес акселерометра не нужно, должно работать со стандартным.

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Вот в этом и проблема состоит: не работает при подключении через tca9548, но когда напрямую подключаю - все работает, данные обновляются нормально. Причем esp32 будто не видит этот датчик, тест на соединение не проходит в void setup()

sadman41
Offline
Зарегистрирован: 19.10.2016

Без прибора не ответить на вопрос. Мож не тот комплект пинов выбираешь на мультиплексоре.

Либо, как вариант, MPU делает сlock stretching, а TCA с ним не умеет работать.

SadZhaba
Offline
Зарегистрирован: 06.04.2018

С пинами мне кажется все норм, а вот какие то прерывания может быть, которые вроде как используются в FIFO тормозят tca(просто догадки). В любом случае, спасибо за ответы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Тут гадать нечего. Логический анализатор взял, без TCA присел на ноги... Если между запросом и ответом есть пауза длительная - сенсор делает сlock stretching. А TCA его не умеет пропускать, судя по картинке в даташите.

SadZhaba
Offline
Зарегистрирован: 06.04.2018

Вы были правы насчет clock stretching, я теперь подкинул все датчики на одну шину I2C, на контакт AD0 подаю высокий сигнал, если нужно выключить датчик, низкий - если включить, пока что данная схема работает.