Несколько датчиков I2C с одинаковым адресом

Я пытаюсь найти самый простой способ подключения нескольких (желательно около 10-20) датчиков IMU к одному контроллеру. Есть два ограничения: выборка на частоте 60 Гц и достаточно простая проводка, так как я хочу надеть ее на одежду.

Я новичок в мире Arduino, пожалуйста, дайте мне знать, какую еще информацию я должен предоставить.

Кажется, что наличие нескольких IMU на шине I2C будет отличным решением, но обычно все они имеют один и тот же адрес.

Итак, решения, которые я нашел на данный момент:

  • Использование нескольких разных IMU от разных компаний — трудно найти 20 из них
  • Использование мультиплексора — требуется звездообразная топология проводки.
  • Использование нескольких контроллеров — неэффективно и кажется неправильным.

На данный момент решение с мультиплексором кажется мне наиболее разумным, но есть ли какой-то другой способ, который я упускаю? Могу ли я как-то создать IMU, скажем, с 16 разными адресами и подключить их все вместе к одному I2C?

Спасибо за помощь!

, 👍7

Обсуждение

См. также http://arduinoprosto.ru/q/18790/how-to-set-address-for-using-more-than-mpu9250/18793#18793., @Mikael Patel


3 ответа


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

13

Если вы используете 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


3

Вы также можете приобрести мультиплексоры I2C, такие как TCA9545A, которые могут разделить одну линию I2C на 4 шины. Я подключил до 9 MPU9150 на одну линию.

,

1

Еще один способ — использовать программную эмуляцию интерфейса I2C, чтобы любой из цифровых выводов ввода-вывода мог действовать как вывод I2C. Для этого можно использовать хорошо написанную библиотеку SoftWire Стивена Марпла. Его можно установить с помощью диспетчера библиотек Arduino или напрямую из репозитория GitHub здесь.

При этом вы можете выбрать произвольные пары контактов, которые будут действовать как SDA и SCL для каждого устройства I2C, а затем вы сможете взаимодействовать с каждым устройством по отдельности.

Обратите внимание, что при использовании этого метода вам потребуется два цифровых контакта для каждого устройства I2C. В этом смысле я считаю, что ответ @dda является лучшим в отношении рассматриваемых IMU.

,