Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
Как подключить четыре акселерометра (adafruit) MMA8451 (с использованием протокола I2C) с помощью одного Arduino Mega? Что меня смущает, так это то, что у меня, очевидно, есть только один SDA и SCL на Arduino Mega. Так как же мне все это соединить? Мультиплексор? Мне нужно четыре, потому что у меня по одному на каждой ноге робота. Или, может быть, нецелесообразно ставить акселерометр на каждую ногу робота? Я немного новичок в электронике, поэтому, пожалуйста, объясните подробно, если можете. Спасибо.
Примечание для модераторов: мне бы очень хотелось получить ответ на этот вопрос, даже если он не соответствует сверхстрогим правилам вопросов. Кажется, каждый раз, когда я пишу здесь, всегда находится один человек, который удаляет это по множеству тривиальных причин. Пожалуйста, дайте мне хотя бы получить ответ. Спасибо!
@masque, 👍0
Обсуждение4 ответа
Краткое объяснение: когда вы разговариваете с подчиненным устройством через I2C, вы начинаете с адреса (подчиненного) устройства. Затем вы отправляете сообщение. Это все равно, что позвонить своему коллеге в офис вместе со многими другими людьми. Вы говорите: «Джон», и когда он это понимает, продолжаете сообщение, типа «пойдем попьем кофе».
Такая схема позволяет добавить до 127 устройств на одну шину I2C. У каждого устройства должен быть свой адрес (извините, в офисе нельзя иметь двух Иванов, это приведет к конфликту). Обычно два разных типа устройств будут иметь разные адреса I2C, но может случиться так, что вам придется использовать два (или более) одинаковых адреса (как в вашем примере). В этом случае см. ниже.
Многие устройства с интерфейсом I2C допускают изменение адреса. Используя это средство, вы можете общаться со многими одними и теми же устройствами через одну и ту же пару кабелей.
Вы можете проверить, есть ли у выбранного вами акселерометра возможность изменения адреса: на рисунке ниже показан акселерометр с вкладкой «Адрес». Если перемычка не установлена, вы получите один адрес, если установлена, адрес этого устройства будет другим, что позволяет использовать два таких акселерометра на одной шине I2C. К сожалению, в этом примере возможно использование максимум двух одинаковых устройств.
Конечно, существуют устройства с более чем двумя возможными адресами, их нужно поискать.
И да, можно использовать один Arduino для связи со многими устройствами I2C.
РЕДАКТИРОВАТЬ:
Просматривая некоторые акселерометры Adafruit, я нашел эту страницу: https://learn.adafruit.com/i2c-addresses
И небольшое примечание не по теме: если вам сложно найти I2C с более чем двумя адресами, проверьте, проще ли использовать протокол SPI. В этом случае вам понадобятся (отредактированные для исправления названий линий шины после комментария пользователя CrossRoads) провода MISO, MOSI, SCK и CS (выбор чипа). Выбор чипа индивидуально подключается к каждому подчиненному устройству. Это позволяет выбрать конкретное устройство, не решая проблему.
SPI также будет быстрее опрашивать все устройства. SPI использует SCK, MISO, MOSI и уникальный выбор чипа для каждого устройства. Связь с Mega может осуществляться на тактовой частоте до 8 МГц, что в 20 раз быстрее, чем 400 кГц I2C., @CrossRoads
Говорим о протоколе I2C. Адрес подчиненного устройства имеет 7 бит, что означает, что один I2c может обрабатывать 127 подчиненных устройств I2C с разными адресами. Таким образом, вы можете подключить 127 устройств к одному порту I2C, просто убедитесь, что адреса подчиненных устройств отличаются друг от друга.
Некоторые устройства I2C имеют возможность выбора вспомогательного адреса путем установки высокого и низкого уровня некоторых контактов. Если вы используете несколько одинаковых датчиков, их подчиненный адрес устанавливается по-разному.
Общий метод адресации нескольких устройств I2C:
- Если устройства имеют только один адрес: используйте мультиплексор шины I2C.
- Если устройство(а) имеет два адреса, управляемых адресным контактом: используйте цифровые выходные контакты Arduino, чтобы выбрать, к какому устройству обращаться, например, установите управляющий контакт для выбранного устройства на низкий уровень, а для других — на высокий, и используйте соответствующие адрес для обращения к устройству.
При заводской настройке MMA8451Q он имеет два разных адреса I2C 0x1C и 0x1D, управляемых контактом SA0. Используйте цифровые выходные контакты на Arduino Mega для адреса выбранного устройства (адрес 0x1C), установив соответствующий выходной контакт на низкий уровень для выбранное устройство и вывод управления для остальных на высокий уровень (адрес 0x1D). Используйте адрес 0x1C для взаимодействия с выбранным устройством.
Удачи!
Просто соедините все линии акселерометров SCK и SDL вместе, а затем вам просто нужно получить конкретный кодовый адрес, который вы используете, чтобы получать данные от любого из акселерометров.
- Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?
- у меня возникают странные проблемы при попытке прочитать форму последовательного соединения gps
- OVF в последовательном мониторе вместо данных
- Путаница между SPI и I2C для SSD1306 OLED
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Arduino и 2 модуля Adafruit Fingerprint работающие вместе
- Наилучший метод проектирования схемы с 20 кнопками
Глядя на таблицу данных MMA8451Q, заводские настройки по умолчанию имеют два отдельных адреса I2C 0x1C и 0x1D, которые можно выбрать с помощью контакта SA0, но если вы хотите, чтобы шина использовалась совместно, они могут запрограммировать на заводе другие идентификаторы, чтобы вы могли разделить 4 на один. автобус, если бы вы могли купить пару фишек не по умолчанию. В противном случае вам понадобятся две шины, чтобы различать 4 чипа., @Dave X