Последовательная связь между несколькими устройствами (или ардуино)

Из моего поиска в Интернете я узнал, что для протоколов SPI и I2C для связи между несколькими устройствами требуется мастер, который инициирует связь, и подчиненные устройства, которые отвечают на запрос мастера. Обычно ведомые устройства не могут инициировать передачу.

Есть ли способ заставить разные устройства обмениваться данными по их желанию? Я не уверен насчет UART, но думаю, что здесь та же история. Но я знаю, что можно использовать USB-концентратор для подключения нескольких USB-устройств к одному порту компьютера. Как это сделать? Могу ли я использовать тот же принцип с Arduino?

Чтобы прояснить, что я хочу сделать, учтите, что у меня разные модули (могут быть Arduino) с разными характеристиками. Я хочу подключить их по шине к мастеру Arduino. Соединения модуля должны быть безразличными, чтобы пользователю не приходилось беспокоиться о том, какой порт следует использовать для подключения модуля. По этой причине использование Arduino Mega с большим количеством последовательных интерфейсов не решает проблему, поскольку мы не знаем, какое устройство к какому порту подключено.

, 👍1

Обсуждение

Протокол 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


3 ответа


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

1

Почти любую систему последовательной связи можно преобразовать в систему с несколькими ведущими устройствами. Самая большая проблема, с которой вы сталкиваетесь, — это обнаружение и обработка столкновений.

Однако, если вы можете обойтись без системы ведущий->подчиненный(-и), в которой один узел на вашей шине отправляет запросы подчиненным узлам, чтобы заставить их что-то сделать и отвечать информацией, тогда вся система намного проще. .

Это нормальный способ работы 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 и т. д.). Концентраторы — это просто способ соединения их всех вместе и направления сигналов на различные периферийные устройства с нужной скоростью.

,

0

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

Дополнительная информация: https://www.i2c-bus.org/multimaster/

С помощью UART невозможно построить шину, только двухточечная связь.

,

0

Еще один вариант, который возможен, если вы можете управлять прошивкой на каждом узле, как в вашем случае с несколькими Arduino, — это создать кольцевую шину с использованием портов UART с несколькими одноранговыми узлами, где каждый узел будет отвечать за пересылку пакетов на узел. следующий узел.

Линии UART rx tz для узлов должны быть соединены в кольцо следующим образом:

  • Узел A Tx => Прием узла B
  • Передача узла B => Прием NodeC
  • Передача узла C => Прием узла A

Для этого потребуется разработка несколько сложного протокола и управляющей микропрограммы на каждом узле, а также необходимо продумать такие вопросы, как:

  1. сколько устройств может поддерживаться кольцом
  2. размер сообщения
  3. сколько памяти доступно для буферизации сообщений на каждом узле
  4. сколько сообщений может отправить каждый узел и т. д.
,