Последовательная связь между несколькими устройствами (или ардуино)
Из моего поиска в Интернете я узнал, что для протоколов SPI и I2C для связи между несколькими устройствами требуется мастер, который инициирует связь, и подчиненные устройства, которые отвечают на запрос мастера. Обычно ведомые устройства не могут инициировать передачу.
Есть ли способ заставить разные устройства обмениваться данными по их желанию? Я не уверен насчет UART, но думаю, что здесь та же история. Но я знаю, что можно использовать USB-концентратор для подключения нескольких USB-устройств к одному порту компьютера. Как это сделать? Могу ли я использовать тот же принцип с Arduino?
Чтобы прояснить, что я хочу сделать, учтите, что у меня разные модули (могут быть Arduino) с разными характеристиками. Я хочу подключить их по шине к мастеру Arduino. Соединения модуля должны быть безразличными, чтобы пользователю не приходилось беспокоиться о том, какой порт следует использовать для подключения модуля. По этой причине использование Arduino Mega с большим количеством последовательных интерфейсов не решает проблему, поскольку мы не знаем, какое устройство к какому порту подключено.
@Sepehr.e, 👍1
Обсуждение3 ответа
Лучший ответ:
Почти любую систему последовательной связи можно преобразовать в систему с несколькими ведущими устройствами. Самая большая проблема, с которой вы сталкиваетесь, — это обнаружение и обработка столкновений.
Однако, если вы можете обойтись без системы ведущий->подчиненный(-и), в которой один узел на вашей шине отправляет запросы подчиненным узлам, чтобы заставить их что-то сделать и отвечать информацией, тогда вся система намного проще. .
Это нормальный способ работы I2C и SPI, хотя в спецификации I2C есть мультимастер (хотя API Arduino не поддерживает это, насколько я знаю).
Стандартный отраслевой способ обеспечения связи UART с несколькими устройствами — преобразование его в стандартную шинную систему, например EIA-422 или EIA-485 (также известную как RS-422/RS-485). Полудуплексный многоабонентский EIA-485, вероятно, проще всего организовать, и для Arduino есть переходные платы, которые преобразуют UART в EIA-485.
Возможно (если вы сообразительны) заставить UART напрямую работать как многоабонентская шина, но это требует более глубокого понимания регистров управления UART и электрических характеристик, чтобы эмулировать вывод TX с открытым коллектором или с тремя состояниями. на рабах.
Конечно, для того, чтобы все устройства могли работать на одной шине, все они должны соответствовать указанным операциям шины. Например, для EIA-485 все ведомые устройства должны иметь возможность переключать приемопередатчик в режим передачи, когда это необходимо, и реагировать только на запросы от ведущего устройства и никогда не отправлять ничего незапрошенного. Простое подключение случайных устройств к шине с трансивером никогда не сработает.
Что касается USB, то это один мастер (ПК) и несколько ведомых (ваша клавиатура, мышь, принтер, сканер, веб-камера, Arduino и т. д.). Концентраторы — это просто способ соединения их всех вместе и направления сигналов на различные периферийные устройства с нужной скоростью.
Протокол I2C поддерживает арбитраж с несколькими ведущими устройствами, т. е. любое устройство I2C может быть ведущим и подчиненным. I2C — это мультимастер-шина. Мастер начинает связь, но ведущее устройство может измениться. Если одно устройство хочет установить связь, оно действует как мастер. Проблема в том, что перед отправкой данных необходимо убедиться, что шина не занята другим мастером.
Дополнительная информация: https://www.i2c-bus.org/multimaster/
С помощью UART невозможно построить шину, только двухточечная связь.
Еще один вариант, который возможен, если вы можете управлять прошивкой на каждом узле, как в вашем случае с несколькими Arduino, — это создать кольцевую шину с использованием портов UART с несколькими одноранговыми узлами, где каждый узел будет отвечать за пересылку пакетов на узел. следующий узел.
Линии UART rx tz для узлов должны быть соединены в кольцо следующим образом:
- Узел A Tx => Прием узла B
- Передача узла B => Прием NodeC
- Передача узла C => Прием узла A
Для этого потребуется разработка несколько сложного протокола и управляющей микропрограммы на каждом узле, а также необходимо продумать такие вопросы, как:
- сколько устройств может поддерживаться кольцом
- размер сообщения
- сколько памяти доступно для буферизации сообщений на каждом узле
- сколько сообщений может отправить каждый узел и т. д.
- OVF в последовательном мониторе вместо данных
- I2C связь между Arduino Uno и Nodemcu32-s (ESP32)
- SIM800L не отвечает на AT-команды
- Как импортировать данные с SD-карты на Arduino на компьютер, используя последовательный/COM-порт Arduino?
- Проблема последовательной связи с общей землей SIM800L
- Не получается читать из / писать в EEPROM
- Соединение I2C с модулем камеры MT9D111, странные результаты после записи регистров через i2C
- Альтернатива LCD-дисплеям UART/I2C?
Протокол 1-Wire (с одним контактом) также является альтернативой., @Mikael Patel
Другими примерами являются [шина CAN](https://en.wikipedia.org/wiki/CAN_bus) (доступны стандартные экраны) и [PS/2](https://en.wikipedia.org/wiki/PS/2_port). ) (двусторонняя инициация ([набор светодиодов](https://pmortensen.eu/world2/2022/08/29/controlling-leds-on-ps-2-keyboards/) (и другие режимы) и нажатия клавиш , соответственно), но не совсем автобус). Первый намного сложнее, но и намного надежнее (он даже не требует общего основания)., @Peter Mortensen