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 и ардуино уно работают через этот мультиплексор?
В библиотеке только адреса регистров, адреса самого модуля не нашел. Вряд ли в даташите будет инфа по регистрам с подключением через мультиплексор.
Не путайте теплое с мягким.
Регистры - свойство самого чипа, от того работает он через мултиплексор или нет - адреса регистров не зависят
Посмотрел примеры - был неправ, адрес сенсора менять не надо
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 };Про регистры инфы не знал, извиняюсь.
Я вот тоже думаю, что если у меня 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 подаю высокий сигнал, если нужно выключить датчик, низкий - если включить, пока что данная схема работает.