Подключите несколько ведомых устройств Arduino к ведущему устройству Arduino.

Я хочу использовать последовательную связь между мастером и несколькими ведомыми.

Я уже подключил RX ведущего к контактам TX обоих ведомых и наоборот (таким образом соединил TX вывода мастера с контактами RX обоих ведомых). Я также подключил контакты GND.

Но теперь у меня появляются странные символы, когда я открываю окно серийного монитора.

Теперь, как мне правильно подключить ведущее устройство Arduino по крайней мере к двум подчиненным устройствам Arduino, используя контакты RX и TX? Нужно ли подключать контакты 5V?

PS: я вижу много таких слов, как «SPI» и «I2C», и люди начинают использовать терминологию. Но я не настолько опытен, поэтому, пожалуйста, если используете термины, объясните их.
Еще один PS: я хочу, чтобы устройства Arduino использовали питание от главного устройства Arduino.

Вы можете подключить один контакт TX к нескольким контактам RX. Когда вы подключаете несколько контактов TX к одному контакту RX, у вас возникают проблемы, поскольку сигнал от одного TX мешает другому. Вам нужно использовать несколько UARTS (последовательных портов) на ведущем, чтобы отдельные порты подключались к каждому ведомому.

Ответы (3)

Теперь, как мне правильно подключить ведущее устройство Arduino по крайней мере к двум подчиненным устройствам Arduino, используя контакты RX и TX? Нужно ли подключать контакты 5V?

Сеть бедняка:

Приведенная ниже схема крайне «непослушна», но ее можно заставить работать «достаточно хорошо».
Вы можете сделать то же самое, используя формальные ворота.

Верхний контур:

Мастер + N вторичных.
Мастера всегда слышат все второстепенные.
Мастер может слышать любой вторичный.
Вторичные устройства не могут слышать других вторичных устройств.
Несколько вторичных каналов, передающих одновременно, искажают оба сигнала.

Master RX подтягивается резистором.
Любой ведомый может установить низкий уровень Master RX, установив низкий уровень TX.
Только один ведомый может «говорить» одновременно, если нужно избежать искаженных передач. Макс. ограничен постоянной времени R плюс емкость цепи.
Слишком низкое значение R не может быть правильно опущено TX.

Нижняя цепь: все одноранговые узлы.

Любой может отправить (по одному).
Все получат все отправленное.
Отправитель получит собственную передачу и сможет определить, была ли передача повреждена.

Полезно, например, для работы Pure-ALOHAnet или щелевого ALOHAnet .
Или, если уж на то пошло, token ring, round robin или большинство других сетевых систем. Даже CSMA/CD

введите описание изображения здесь

Значение подтягивающего резистора оставлено в качестве упражнения для студента.

Показанная полярность предполагает высокий уровень простоя TX.
Поменяйте полярность диодов и используйте понижение напряжения для холостого хода TX.

Я хотел предложить что-то подобное, но вы меня опередили! Я только что закончил проект, который делает что-то очень похожее, за исключением того, что в каждом узле есть оптоизоляторы. Тем не менее, это однопроводная полудуплексная схема, очень похожая на то, что вы показали выше.
FWIW - упомянутая выше оптоизолированная схема хорошо работает на скорости 2400 бод с 200 метрами экранированной витой пары (+5В, сигнал, экран заземлен).

Не соединяйте контакты TX вместе. Когда одно ведомое устройство Arduino переводит свой TX в высокий логический уровень, а другое arduino устанавливает свой TX в низкий логический уровень, результирующее напряжение не является допустимым логическим уровнем — вот почему вы получаете недопустимые символы.

Вместо этого купите готовую сборку RS-485 arduino shieldдля каждого из ваших устройств. Подробности ниже...

TX/RX не предназначен для поддержки нескольких ведомых устройств; это просто связь между двумя точками. Выход TX всегда управляется, и может быть только один драйвер.

Чтобы правильно подключить несколько ведомых устройств, вам нужен интерфейс, который на самом деле предназначен для поддержки нескольких драйверов.

Выводы Arduino TX/RX, которые вы используете, обычно называются RS-232, хотя это не совсем точно. RS-232 — это очень простая сеть, которая соединяет два устройства. Одно устройство называется , DCEа другое устройство называется DTE. Не беспокойтесь о том, что означают эти имена; они что-то значили еще в темные века, когда люди подключали проводные телефонные трубки к акустическим телефонным модемам ( http://en.wikipedia.org/wiki/Acoustic_coupler ). Единственное, что одно устройство передает по проводу TXD, а слушает по RXDпровода, в то время как другое устройство передает RXDи слушает TXD. Это сбивает с толку, поскольку нам нравится соединять провода с одинаковыми именами, поэтому мы часто используем тип соединения, называемыйNull Modem- выход TX одного устройства управляет входом RX другого устройства, и наоборот.

(Я опускаю некоторые подробности о том, как сигналы RS-232 используют более высокие напряжения, чем логические уровни CMOS — это не просто прямое логическое соединение.)

Но ограничение нуль-модема в том, что он соединяет только два устройства. Он не может поддерживать сеть из трех устройств, потому что кабельное соединение не может знать, какое устройство передает достоверные данные, а какое бездействует. Для этого требуется новый тип последовательной сети под названием «RS-485».

Стандарт RS-485требует использования преобразователя уровня особого типа, вы не просто подключаете сигналы TX/RX логического уровня. Этот преобразователь уровня RS-485 заботится об управлении межсоединением таким образом, что позволяет совместно использовать соединение между несколькими устройствами. Вы по-прежнему должны быть осторожны, чтобы не позволить устройствам передавать одновременно (называется ) Collision, но, поскольку вы назначили одно устройство ведущим, а другие — ведомыми, это не должно быть проблемой. Ведущее устройство решает, какое устройство будет разговаривать по шине.

Поскольку вы являетесь пользователем Arduino и не очень разбираетесь в электронике, самым простым способом для вас будет приобрести готовый файл RS-485 arduino shield.

Вы упомянули I2C(также реже обозначаемый аббревиатурой IIC), который представляет собой стандарт двухпроводного интерфейса с открытым стоком, первоначально определенный корпорацией Philips. Google i2c bus specificationдля деталей. Вероятно, вы могли бы выполнить то, что пытаетесь сделать, с помощью RS-485 или I2C, но RS-485 ближе к тому, что вы используете сейчас.

Вы упомянули, что хотите питать ведомые устройства от того же источника питания, что и ведущее устройство. (В любом случае они уже должны использовать одно и то же соединение с заземлением.) Если основная плата Arduino питается от USB, это должно быть в порядке, если общий ток питания, потребляемый всеми тремя платами, не превышает номинальный ток нагрузки. Если это произойдет, вы узнаете, потому что ваш ПК с Windows отключит USB-порт.

Что вы не упомянули, говоря о RS-485, так это управление направлением, которое требуется на каждом узле. Вы можете сделать это аппаратно, если это необходимо (Ян Аксельсон опубликовал аккуратную схему, которая хорошо работает), но управление направлением обычно обрабатывается микроконтроллером.
@DwayneReid Управление направлением необходимо только для полудуплексного RS485. Если у вас есть отдельные полнодуплексные пары TX и RX, то в этом нет необходимости.

https://www.arduino.cc/en/Tutorial/TwoPortReceive

он переходит к установке других цифровых контактов в другие контакты TX и RX.

Морозный0_0