Способ последовательного взаимодействия с многосетевой подчиненной сетью Arduino.

У меня есть один ПК с запущенной Visual Studio и программой, которая будет отправлять команды Arduinos через последовательные COM-порты. Таким образом, в 11 Nano MCU у меня будут драйверы двигателей L293D/L298N IC, а в других Nanos у меня будут датчики.

Я хотел бы иметь программу в Visual Studio, которая отправляет команды через последовательный порт для приведения в действие двигателей для каждого микроконтроллера на борту. Это роботизированное приложение, и все, что я упомянул выше, будет заключено в Humanoid.

Вот несколько примеров того, что я думаю сделать:

char data = Serial.read();
if (data == 'A') 
{
  digitalWrite(13, HIGH);
}

Или что-то вроде этого:

servodata = Serial.read();
if (servodata == '1') // Одинарная кавычка! Это символ.
{
  SERVO.write(pos); 
}             

Как вы можете видеть, Arduinos будет иметь что-то вроде этого, работающее и ожидающее, пока Visual Studio отправит команды через последовательный интерфейс на один или несколько микроконтроллеров одновременно. Я думаю, 30 символов, разделяющих/распределяющих это число по каждому Rx Arduino.

р>

, 👍0

Обсуждение

Отвечает ли мой ответ на то, что вы хотели узнать?, @Russell McMahon


2 ответа


6

Не совсем понятно, какой именно запрос, но отвечая на вопрос в теме письма:

Вы можете легко подключить несколько последовательных / RS232 COM-портов, имея все подчиненные входы RX и главный выход TX на одной линии, и все подчиненные выходы TX подключены сетью OR к одной линии к главному входу RX. Главный «общается» со всеми подчиненными одновременно. Каждый подчиненный общается только с главным. Только один подчиненный может полезно общаться одновременно. Назначение назначения сообщения и арбитраж подчиненного разговора выполняются программно.

Как показано ниже, сеть OR на каждом подчиненном устройстве может быть такой же простой, как диод с катодом (сторона стержня) к линии TX и анодом к общей линии к главному RX. Один подтягивающий резистор (или внутренний подтягивающий резистор в главном устройстве на линии RX) подтягивает линию к высокому уровню, когда все подчиненные линии TX имеют высокий уровень.

Эта диаграмма показывает, насколько простой может быть многоточечная связь.
Примечание. Как показано, полярность диодов соответствует истинному RS232 с логической 1 = низкий = отрицательный.
При прямом подключении выходов UART TTL уровня (5 В/0 В) поменяйте местами диоды.

Кроме того, добавьте подтягивающее сопротивление от +5 В к синей линии RX к главному устройству — 10 кОм к 5 В, вероятно, будет достаточно.

Многоточечная сеть для RS232
Отсюда - Многоточечная сеть для RS232.

Когда вывод ведомого TX имеет высокий уровень, его диод «заблокирован», и он не влияет на общий уровень ведомого устройства и ведущего. Когда любая линия ведомого TX имеет низкий уровень, общая линия через свой диод подтягивается к низкому уровню, и ведущий видит низкий уровень. Обычные RS232 COM могут возникать между ведомым и ведущим.

Когда мастер отправляет, все подчиненные видят передачу одновременно. Должен быть установлен базовый протокол, позволяющий обрабатывать сообщения предполагаемому получателю. Это может состоять, например, из отправки адресного слова + командного слова или слов. Вы можете иметь одно подчиненное устройство, действующее на сообщение, или все подчиненные, или закат, в зависимости от вашей системы адресации.

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

Несмотря на очевидные ограничения такой системы, она может работать очень хорошо, дешева и проста в реализации. Если есть много подчиненных устройств, нагрузки должны быть проверены, например, чтобы главный TX мог управлять всеми подчиненными RX одновременно. Поскольку схема однонаправленная, легко добавить базовый буфер.

,

немного смутно для новичка, чтобы понять некоторые из ваших технических разговоров, но я пытаюсь здесь, @Frank

@Frank'sDesig'Nature - Посмотрите на схему выше. Поменяйте направления диодов, так как вы используете 0 В/5 В, а не настоящий RS232. Добавьте 10 кОм от Master RX (синяя линия) к =%V. Попробуйте. Когда Master управляет линией TX, все подчиненные RX видят данные. Когда любой подчиненный передает данные, главный видит данные, но ни один подчиненный не видит., @Russell McMahon

есть ли причина, по которой я не могу просто использовать один из этих портов расширения USB 3.0 5 Гбит/с? Я, мужик, использую 2 порта USB, как сейчас, из расширения из 4 USB, все подключены к одному USB в моем планшете, и оттуда я открываю 2 терминала, когда отлаживаю Tx и Rx с 2 разных Arduino без проблем. ТАК почему я должен использовать этот формат? А не способ USB? Кажется, это просто работа для передачи/приема данных, когда IDE уже делает это без лишней ерунды, о которой мы говорили?, @Frank

[ссылка]http://www.ebay.com/itm/111717351068, @Frank


2

RS-485 или RS-422 — это обычные промышленные способы, позволяющие одному последовательному порту общаться со многими устройствами, особенно в шумных условиях с большим количеством двигателей. Для получения правильного электрического интерфейса требуется микросхема драйвера для каждого устройства.

RS-485 обеспечивает двунаправленную связь, если вы хотите получать данные обратно от удаленных узлов, а RS-422 обеспечивает «симплексную» или однонаправленную связь, если вы просто хотите слепо отправлять команды без какой-либо обратной связи.

Что касается программного обеспечения, то, вероятно, проще всего будет воспользоваться моей библиотекой ICSC — она позволяет обращаться к отдельным устройствам на шине RS422 или RS485 и отправлять им команды.

,

@Russell McMahon спасибо за подробное объяснение, несмотря на безумные опечатки, я достаточно хорошо понял, хотя, я думаю, у вас сложилось впечатление, что подчиненные устройства Arduino будут передавать что угодно обратно главному «компьютеру, выполняющему всю передачу», просто хочу прояснить это, потому что вы много говорите о подчиненных устройствах, которые обмениваются данными с чем угодно, когда этого не происходит, подчиненные устройства только и делают, что управляют двигателями, и ничего больше, у них запущен скетч, который ищет параметр для последовательного вызова с использованием длинного списка операторов break/switch., @Frank

Это тот тип команд, который я люблю отправлять каждому подчиненному устройству. Serial.println('LT2|LP3|LM5|LR4|LI6'); или 'LT2|LP3|LM5|LR4|LI6' Я хочу отправить этот тип блока каждому отдельному подчиненному устройству, но имейте в виду, что приведенный выше блок предназначен только для активации этого подчиненного устройства и его скорости, за ним последует дополнительный блок с указанием направления., @Frank

нравится это, ребята? ![Действительный XHTML](http://yourduino.com/docs/RS485-NetworkExample2.jpg), @Frank

И если так, то, полагаю, мой следующий вопрос будет таким: если все привязано к общему стилю, как ПК узнает, кому что отправлять? если отправить «LT2|LP3|LM5|LR4|LI6» и я хочу, чтобы это было для одной конкретной Arduino, я не хочу, чтобы все Arduino принимали эти параметры В этом примере блока «LT2|LP3|LM5|LR4|LI6» LT2 идет следующим образом (L — это микроконтроллер, в то время как T = выводу на этом микроконтроллере (вывод D7 и т. д.), а 2 — это скорость, также известная как задержка (2)); ) Итак, как вы видите, все остальные Arduino, которые не являются «L», не будут использовать эти данные в последовательном порту? как будет осуществляться адресация?, @Frank

Вопрос о том, как заставить определенную плату Arduino реагировать на определенную команду, также задается автором здесь: [Как мне получить уникальный адрес для всех моих плат Arduino, находясь в RS485?](http://arduinoprosto.ru/q/14791/how-can-i-get-a-unique-address-for-all-my-arduino-boards-while-in-rs485), @Nick Gammon