Несколько датчиков I2C с одинаковым адресом
Я пытаюсь найти самый простой способ подключения нескольких (желательно около 10-20) датчиков IMU к одному контроллеру. Есть два ограничения: выборка на частоте 60 Гц и достаточно простая проводка, так как я хочу надеть ее на одежду.
Я новичок в мире Arduino, пожалуйста, дайте мне знать, какую еще информацию я должен предоставить.
Кажется, что наличие нескольких IMU на шине I2C будет отличным решением, но обычно все они имеют один и тот же адрес.
Итак, решения, которые я нашел на данный момент:
- Использование нескольких разных IMU от разных компаний — трудно найти 20 из них
- Использование мультиплексора — требуется звездообразная топология проводки.
- Использование нескольких контроллеров — неэффективно и кажется неправильным.
На данный момент решение с мультиплексором кажется мне наиболее разумным, но есть ли какой-то другой способ, который я упускаю? Могу ли я как-то создать IMU, скажем, с 16 разными адресами и подключить их все вместе к одному I2C?
Спасибо за помощь!
3 ответа
Лучший ответ:
Если вы используете IMU MPU6050, есть простой прием: поместите их все на шину I2C и подключите контакт AD0
каждого IMU к отдельному цифровому контакту на Arduino[*]. Если вы хотите читать из определенного IMU, установите для всех AD0
значение HIGH
, кроме того, которое вы хотите прочитать, на LOW
. Все IMU с AD0
, установленным на HIGH
, имеют I2C-адрес 0x69, тогда как единственный IMU с LOW
будет иметь адрес 0x68.
Если вы хотите прочитать их все, вы просто выполняете цикл и устанавливаете для одного из них значение LOW
, для остальных значение HIGH
, и все готово. .
[*] Если вы хотите 20 IMU, вам лучше приобрести Mega, а еще лучше Maple. Небольшой форм-фактор, довольно много возможностей, много контактов и флэш-памяти, а некоторые клоны почти ничего не стоят; например, Itead продает клоны Maple за 6 баксов. ElecFreaks продает их по 9 баксов. Вы можете использовать 16 контактов внизу для AD0
.
Этот трюк работает с любым устройством I2C, имеющим настраиваемую схему адресации через один или несколько контактов. Я делаю это с AT24Cxx EEPROMS, которые имеют диапазон адресов 0x50-57. Если вы хотите иметь более восьми чипов, установка всех, кроме одного, на 0x50 и одного на 0x51 решает проблему быстро.
Ссылка: https://github.com/PaulStoffregen /FreeIMU_original/blob/master/documents/PS-MPU-6000A-00v3.4.pdf
Это довольно умная идея!, @Nick Gammon
И это приятный комплимент от тебя, Ник!, @dda
Небольшое расширение — для добавления дополнительных устройств с использованием регистра сдвига, такого как 74HC595, для «управления» выводами A0. При гирляндном подключении вы можете получить 32 (а возможно и больше) всего за 3 контакта на микроконтроллере — с SDA и SCL всего 5 контактов uC для управления 32 микропроцессорами., @Shaun Vince
Вы также можете приобрести мультиплексоры I2C, такие как TCA9545A, которые могут разделить одну линию I2C на 4 шины. Я подключил до 9 MPU9150 на одну линию.
Еще один способ — использовать программную эмуляцию интерфейса I2C, чтобы любой из цифровых выводов ввода-вывода мог действовать как вывод I2C. Для этого можно использовать хорошо написанную библиотеку SoftWire
Стивена Марпла. Его можно установить с помощью диспетчера библиотек Arduino или напрямую из репозитория GitHub здесь.
При этом вы можете выбрать произвольные пары контактов, которые будут действовать как SDA и SCL для каждого устройства I2C, а затем вы сможете взаимодействовать с каждым устройством по отдельности.
Обратите внимание, что при использовании этого метода вам потребуется два цифровых контакта для каждого устройства I2C. В этом смысле я считаю, что ответ @dda является лучшим в отношении рассматриваемых IMU.
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- Лазерный датчик ToF (VL53L0X) не работает
- MAX30100 не работает
- Использование библиотеки емкостных датчиков с мультиплексором 74HC4067
- Как включать и выключать датчики I2C с помощью Arduino Mega 2560?
- Считывание значений с емкостного сенсорного датчика TTP229 на arduino
- Подключение двух Arduino через I2C, когда контакты I2C A4/A5 уже используются.
- Подключение нескольких MAX30100/30102 через I2C
См. также http://arduinoprosto.ru/q/18790/how-to-set-address-for-using-more-than-mpu9250/18793#18793., @Mikael Patel