mpu9250 подключенный через tca9548a к ESP32
- Войдите на сайт для отправки комментариев
Пт, 08/10/2021 - 13:19
Подключил 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 адрес на мультиплексор.
А модуль умеет от 3.3 ? Зачем в тесте мультиплексор ?
Мне нужно затестить работу с мультиплексором, т.к. планирую еще 4 датчика подключить. Модуль умеет от 3.3В, я подключал напрямую к ESP32, так он работает. А через мультиплексор нет почему то
Вот библиотека: https://github.com/rupin/SparkFun_MPU-9250-DMP_Arduino_Library
Вы подключили аксель к мультиплексору с адресом 0х70. А библиотека об этом знает? Она может ищет модуль по его старому адресу.
Какой адрес у самого модуля?
Я также подумал, но не понял, как адресоваться по 0х70->0х68(Адрес у модуля 0х68)
Да и вообще, у всех гайдов по использованию tca9548a, просто используется функция tcaselect(uint i), а дальше все рабоатет само. Я руководствовался этим: https://randomnerdtutorials.com/tca9548a-i2c-multiplexer-esp32-esp8266-arduino/
Я также подумал, но не понял, как адресоваться по 0х70->0х68(Адрес у модуля 0х68)
Адресоваться на 0х70.
для этого переписать библиотеку, указав в ней адрес 0х70
В библиотеке только адреса регистров, адреса самого модуля не нашел. Вряд ли в даташите будет инфа по регистрам с подключением через мультиплексор. Почему тогда, к примеру, BMX055 и ардуино уно работают через этот мультиплексор?
В библиотеке только адреса регистров, адреса самого модуля не нашел. Вряд ли в даташите будет инфа по регистрам с подключением через мультиплексор.
Не путайте теплое с мягким.
Регистры - свойство самого чипа, от того работает он через мултиплексор или нет - адреса регистров не зависят
Посмотрел примеры - был неправ, адрес сенсора менять не надо
Про регистры инфы не знал, извиняюсь.
Я вот тоже думаю, что если у меня BMX055 работал с кривой библиотекой от iarduino через мультиплексор более менее, то mpu9250 с тонной библиотек должен работать и без всяких танцев с бубном.
Это в файле "inv_mpu.c" проставить значения? Или уже в самом скетче структуру прописать?
если я правильно понял даташит к tca9548. он работает как прозрачный мост между внешней шиной i2c и одной из своих slave-шин. То есть абсолютно все запросы с любыми адресами просто перекидываются из мастер шины в текущую выбранную славе.
Из этого следует, что отдельно настраивать адрес акселерометра не нужно, должно работать со стандартным.
Вот в этом и проблема состоит: не работает при подключении через tca9548, но когда напрямую подключаю - все работает, данные обновляются нормально. Причем esp32 будто не видит этот датчик, тест на соединение не проходит в void setup()
Без прибора не ответить на вопрос. Мож не тот комплект пинов выбираешь на мультиплексоре.
Либо, как вариант, MPU делает сlock stretching, а TCA с ним не умеет работать.
С пинами мне кажется все норм, а вот какие то прерывания может быть, которые вроде как используются в FIFO тормозят tca(просто догадки). В любом случае, спасибо за ответы.
Тут гадать нечего. Логический анализатор взял, без TCA присел на ноги... Если между запросом и ответом есть пауза длительная - сенсор делает сlock stretching. А TCA его не умеет пропускать, судя по картинке в даташите.
Вы были правы насчет clock stretching, я теперь подкинул все датчики на одну шину I2C, на контакт AD0 подаю высокий сигнал, если нужно выключить датчик, низкий - если включить, пока что данная схема работает.