Объединение ардуин в сеть

Тема в разделе "Микроконтроллеры AVR", создана пользователем Patriot, 3 авг 2015.

  1. Patriot

    Patriot Нерд

    Всем привет!
    Есть очень нетривиальная задача: объединить вместе около 30 ардуин. Все они располагаются рядом друг с другом, максималньное расстояние 1м. должна быть мастер-ардуина, для общения с компьютером, а так же пересылающая данные на эти ардуины (адресованные сообщения).
    Каким лучше способом лучше реализовать задуманное? Есть несколько вариантов. Ищу которое легче реализуется в коде, и более масштабируемое. Я нашел такие варианты:
    1) Ethernet shield - дорого очень
    2) wifi - дешево, но отдельно писать код для Wifi модуля + покупка роутера.
    3) UART-последовательно. Вроде простой вариант. Каждая ардуина проверяет, ей ли адресован пакет, если нет, то пересылает его дальше. Но проблема масштабирования. При подключении в "сеть" новой ардуины, требуется найти для нее место, и переключать провода. К плюсам еще можно добавить отсутствие доп.модулей и компонентов.
    4) I2C - читал, что будут проблемы при большом кол-ве дейвайсов в сети.
    5) RS-485 - не плохой вариант. Все подключается в одну шину. Но увеличивается кол-во используемых пинов: 3 шт. + не известно, как поведут себя ардуинки в током кол-ве, будут ли успевать получать\передавать данные. Так же нужны доп. компоненты, как минимум чип mx485.
    6) RF433 - и разруливать своим протоколом, кому что там адресовано. Никогда с ним не работал, не знаю даже как тут все будет работать при большом кол-ве ардуин.

    В общем, кто знает, выскажитесь по этой теме. Дополните, опровергните, или свои варианты предложите.
     
    Sergey.Chk нравится это.
  2. geher

    geher Гуру

    7. NRF24L0 - удобная штука, уже реализован помехоустойчивый протокол с возможностью адресной отправки, но капризен, зараза.
    8. XBee - с ним не работал, как пишут, серьезная штука, но есть какие-то проблемы, которые приходится преодолевать.
     
  3. Alex19

    Alex19 Гуру

    Как я понял у Вас 1 мастер который общается с компьютером и отправляет команды на остальные слайвы, которые отвечают мастеру.

    По 3 пункту UART.
    Что мешает просто попробовать, соединить TX мастера, со всеми RX слайвами, а RX со всеми TX. Возможно проблема будет в длине проводов 30шт. по 1 метру (взял максимальные характеристики). Тогда на помощь придет RS-485.

    По 5 пункту RS-485.
    1. Плюсы очень надежно, не даром это стандарт в промышленности.
    2. Не высока стоимость модуль на микросхеме mx485, стоит 150р. Правда с ними бывают косяки, мне попались 2 модуля со спаянными ногами, когда подключал решил проверить мультиметром, просто прошелся бормашинкой.
    3. Существуют готовые решения для Вашей задачи Modbus и т.д, их можно найти в сети, думаю и для AVR найдете.
    4. Теряется лишь 1 доп. пин, по сравнению с UART. В других случаях к примеру Ethernet, Wi-Fi, I2C потеряется больше.

    По Вашим опасениям.
    До 32, и до 256 с какими-то усилителями, более подробно тут - https://ru.wikipedia.org/wiki/RS-485.

    А тут зависит от объема передаваемой информации и как сделаете.
    Мне нужно было соединить 2 ардуины по RS-485, передача в обе стороны, один всегда начинает, второй отвечает. Скорость 115200, все на прерываниях, задержка между переключением режима 0,5мс.

    Или у Вас гирлянда, смутили данные строки.
    Ну а выбор, за Вами, мы же не знаем всех нюансов, предпочтений и т.д. Я даже представить не могу, зачем такое кол-во ардуин, расположенных друг от друга на расстоянии 1 метр.
     
  4. Patriot

    Patriot Нерд

    Совершенно верно.

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

    Сейчас начал изучать эту тему с RS-485, тоже склоняюсь больше в его сторону, на запасной вариант взял WiFi модули ESP8266. Возникли некоторые непонятные моменты:
    Можно же купить только чип MAX485, зачем использовать модули? На них еще навешана пачка резисторов - для чего это все? Разве этот чип не работает "из коробки" ?

    Тут, наверное, лучше пояснить идею, что бы было представление что к чему. Собираю кабину самолета A10-c, в нем приборы разделаются на панели их очень много. Каждая панель управляется ардуиной. И отправляет данные о переключениях тумблеров, рычагов и прочей периферии на мастер-ардуину, которая отправляют данные в симулятор по ком-порту. Так же мастер-ардуина периодические отправляет данные в некоторые панели - где-то зажглась индикация, где-то на табло отобразился текст и прочие данные. Вот все это имеет площадь примерно 1x2 метра, все рядом с друг другом. Первоначально первые панели были собраны и подключены к компьютеру на прямую. Каждая панель - свой COM-порт, который отправляет данные в симулятор. Но это не дело, столько подключать к компьютеру устройств. Отсюда уже начал искать способ оптимизации, ибо этап тестирования прошел.

    [​IMG]
     
  5. Patriot

    Patriot Нерд

    Интересно. Почитаю о нем. Но пока смутила информация, насчет устройств. Для приема и передачи надо использовать раздельные модули? т.е. один отвечает только за прием, а другой только за передачу? Для двунаправленного использования нужно юзать по два модуля на один микроконтроллер?

    Чуть проще, чем ESP8266 но в остальном такой же геморрой с конвертацией с 5В в 3.3в (ардуиновских 3.3В не хватит запитать ее, слишком малый ток - 50мА отдает). Но простота передачи, конечно, подкупает.
     
  6. ANV

    ANV Оракул

    Так повесьте все на 485 и пускай головная Ардуино всех по кругу опрашивает.
     
  7. Alex19

    Alex19 Гуру

    Может, я что-то не понимаю.

    У Вас 1 мастер, который отправляет данные, всем слейвам одновременно, по адресу конкретный слейв понимает, что команда к нему, затем мастер ждет ответа от слейва (пока ждет, молчит в тряпочку) и посылает новую команду. Если не дождался, через определенное время, значит ошибка, мастер понимает, что, что-то случилось и т.д. Точно так же будет работать RS-485.

    Не разбирался, они просто были:).

    Проект очень интересный, удачи в его реализации.

    UPD. Описал работу UART, если все ардуины не зависимы, если нет, тогда немного посложнее.

    Так же можно подумать установить вверху Mega 2560 R3, там 4UART и тогда можно будет иметь 3 линии и 1 с компьютером.
     
    Последнее редактирование: 3 авг 2015
  8. Patriot

    Patriot Нерд

    Вот сейчас пытаюсь разобраться с подключением. Почему у модулей столько обвязок с резисторами, хотя в некоторых примерах чип напрямую подключен. В некоторых один резистор на tx-R1-rx повешан, еще видел вариант чип и рядм не то ли транзистор, не то конденсатор.. Фото темное было, что-то цилиндрическое черное было рядом на макетке. Да и вариантов MAX485 огромное множество, чем все отличаются - не понятно. По параметрам идентичны, видать надо для каждого даташит смотреть, слишком тонкие отличия.

    В случае, если данные отправляет мастер к рабу - проблем нет, мастер один, слушателей много. А вот если слушатели все вместе данные отправят мастеру (случай утрированный, но вполне возможно одновременно несколько тумблеров включить)? Сигналы же друг на друга наложатся.. Или слушать Tx, если там LOW, то слать данные? Я просто раньше пробовал осилить шину i-bus, там этот вопрос решался чипом Th3122.4, он сам слушал шину, и в случае если более 15мс она свободна, то отправлял данные. Возможно, просто у меня недопонимание специфики передачи данных через uart, и на самом деле проблемы нет никакой :)

    Спасибо! Думаю, еще не раз буду по нему что-то спрашивать на форуме. Может, позже, создам по нему тему и буду вести в виде блога разработки.
     
  9. geher

    geher Гуру

    Тогда лучше, наверное, взять RS-485 или RS-422 контроллер для ПК и соответствующие модули (микросхемы) для устройств на панели и подключить всю периферию в один последовательный порт. Коллизии можно при этом разрешать, например, передавая в порт с ПК адрес устройства, которое должно передавать свои данные в течение некоторого интервала времени после приема такого пакета. Т.е. простой такой арбитраж шины - мастер через определенный интервал передает адрес устройства, которое имеет право передавать в данном промежутке времени и ждет, потом передает адрес следующего устройства и ждет и так по кругу. Если устройству "есть что сказать", оно дожидается своего интервала и передает свои данные.
    Хотя, если время реакции очень критично, а устройств очень много, то время между интервалами может оказаться слишком большим.
    Тогда можно попробовать другой вариант арбитража:
    Устройство посылает пакет, сигнализирующий о готовности передать данные со своим адресом. Если коллизий не возникнет, то головное устройство (ПК) примет пакет и срвзу отправит разрешение с тем же адресом, После получения разрешения все, кроме устройства с этим адресом встают в паузу, даже если у них есть что передать, давая отправить данные "коллеге". Если же разрешение в ответ на пакет-сигнал не пришло, то через случайный интервал времени делается следующая попытка.
    Для надежности в каждом пакете передавать его контрольную сумму.
    NRF24L01 - это приемопередатчик, который может работать в обе стороны.
    Но, как мне кажется, в данном конкретном случае лучше по проводам. В закрытом ящике за панелями их вполне безболезненно можно проложить, и меньше всяких помех будет.
     
  10. Radius

    Radius Гик

    Интерфейс RS-485 работает нормально только в конфигурации мастер-слэйв. Слэйв без запроса мастера сам на шину не выходит. Поэтому мастер должен непрерывно опрашивать слэйвы по кругу. Для этого нужно как минимум передать хотя бы один байт (адрес слэйва). RS-485 может работать на частотах до 1 мбит/сек, но Ардуино наверно не сможет работать на таких скоростях. Поэтому прикиньте какое время реакции для вас подходит и посчитайте успеете ли вы опросить все слэйвы.
     
  11. Alex19

    Alex19 Гуру

    Это просто разные схемы, слей ни когда не отвечает, пока не получит запрос на возврат данных.

    Вариантов арбитражей много, к примеру от geher.

    Но если у Вас ардуины, сами, когда хотят шлют данные, с ходу не знаю, что предложить.
     
  12. Patriot

    Patriot Нерд

    Теперь стало более ясно. Не знал, что в протоколе 485 слейв не должен сам отправлять данные. Тогда он не подходит, так как требуется в равной степени отправка данных от слейвов и мастера. Причем реакция должна быть максимально быстрой - это критично. Заказал на пробу модули 485, а пока буду пробовать сделать через последовательный UART. Посмотрим, что окажется быстрее, удобней и без проблем.
     
  13. Patriot

    Patriot Нерд

    А по модулям 485-м может кто просветить? Чем модули отличаются от голых чипов?
     
  14. ANV

    ANV Оракул

    Фото конкретных есть? Скорее всего наличием терминирующих и подтягивающих резисторов.
     
  15. Patriot

    Patriot Нерд

    Первый вариант, в виде модуля:
    [​IMG]

    Вариант с одним только резистором:
    [​IMG]


    И вообще без каких-либо обвязок:
    [​IMG]
     
  16. Faberge

    Faberge Administrator Команда форума

    Тоже недавно прошел через этап освоения интерфейса RS485. Схем действительно много и это вводит в заблуждение. Я протестировал разные и в моем случае подошла схема из шилда-конвертора UART <-> RS485 на сайте Амперки:
    http://amperka.ru/product/arduino-rs485-shield
    правда, с изменениями. Я выкинул резистор-терминатор и два резистора по 10 Ом, так как в моем случае линия была небольшой и они не требовались. Пара резисторов по 4.7кОм была не идеальной в плане ошибок на линии, поэтому я заменил их сперва на пару по 560 Ом, а потом и вовсе на 220 Ом.
    Что касается модулей и микросхем - я бы брал просто микросхемы, они стоят по 50 рублей и на таком количестве удасться неплохо сэкономить. Не обязательно брать MAXIM'овские чипы, хотя они и более распространены, ADM тоже подойдет.

    Забыл добавить, хотя линия и дифференциальная, для гарантированно стабильной работы рекомендуется также соединять и земли устройств. То есть три провода. Обычно запаса входных усилителей по синфазному напряжению достаточно, но всякое бывает.
     
    Последнее редактирование: 4 авг 2015
    Patriot нравится это.
  17. Alex19

    Alex19 Гуру

    Бесполезно, смотреть. Как от дынных отличите?

    Наверно я не правильно пояснил.

    В RS-485 у Вас 1 линия данных (на отправку и получение). Отправка не может идти одновременно у более чем 1 устройства, принимать могут хоть все. То есть пока, кто-то отправляет данные (не важно слейв или мастер), другие должны молчать. А как добиться такой согласованности, тут есть множество вариантов, вариант предложенный geher, мной и т.д.

    По скорости, максимум, что пробовал 115200 бит\с. Плюс время на переключение линии на отправку/получение линии, у меня задержка между переключением режима 0,5мс

    RS-422, если поверхностно 2-ва RS-485, один для отправки, другой для приема, синхронная передача данных.

    Теперь о UART - это асинхронный приёмопередатчик. Другими словами передача и прием идет не одновременно. В AVR есть так же возможность указывать синхронный режим работы, так там USART.
    Но проблемы те же, если 2 слейва начнут отправлять данные одновременно.

    Работает стабильно на 115200 бит\с, знаю, что мега стабильно работает на 250000 бит\с в проекте 3D принтера, прошивка Marlin.

    Все они будут работать, если Вы продумаете систему согласований. Если нет, и может получится следующее:
    В таком случае, данные интерфейсы не подойдут по своей природе. Если 2-ве ардуины отправят данные одновременно, то даже если они дойдут, то просто перемешаются в приемнике.

    А RS-485 и I2C не подойдет еще и потому, что невозможна одновременная отправка 2-х и более устройств.

    1. Поэтому или смотреть в сторону других вариантов передачи данных (с другими активно не работал, не подскажу).

    Если же думать, о том, чтобы реализовать все это на UART/RS-485/RS-422.
    1. Или придумывать систему согласований.
    2. Ставить вверху контролер/ры реализующий множество UART, как программных, так и хардварных. Или несколько Мег или тот же STM32F4, тем самым реализовав 30 UART-тов (но хватит ли его, не знаю).
    3. Строить гирлянду с накоплением. Даже рассматривать не хочу, с учетом времени и надежности.

    Возможно есть другие варианты.

    Если бы мне нужна была максимальная скорость и параллельная работа, рассматривал вариант с STM32F4.

    Но возможно это не нужно, как я понял каждая ардуина это блок кнопок, ручек и т.д., попробуйте нажать это быстро и одновременно. Если на этих ардуинах не стоят датчики, сенсоры, которые должны передавать данные максимально быстро (не для отображения), то скорости тут не нужны.
     
    Последнее редактирование: 5 авг 2015
  18. AlexVS

    AlexVS Гик

  19. Radius

    Radius Гик

    Попробуйте сделать систему с временными тайм слотами на RS-485. Мастер отсылает команду "СТАРТ". Каждый слэйв делает задержку в соответствии со своим адресом и выдает в свой тайм-слот байт состояния. Мастер анализирует эти состояния и принимает решения. В этом случае задержки будут минимальны и не будет наложения данных от нескольких слэйвов.
     
  20. ANV

    ANV Оракул

    А с точки зрения чтобы меньше переделывать, что уже сделано и какая сейчас логика работы у панелей по СОМ-порту?