Однонаправленная сеть из arduino - один мастер и пара десятков слейвов - какие есть варианты?
- Войдите на сайт для отправки комментариев
Для проекта хотелось бы сделать простой вариант сети на arduino.
Мастер - собирает кучу данных с различных датчиков и выплевывает ее в некую общую шину. Получил кто или нет - ему без разницы. Выплевывает от 10 до 30 раз в секунду, общий объем данных в каждом плевке - скажем, 400 байт. С запасом чтобы. Это для понимания скорости. Ужать можно раза в два, если иначе никак.
Слейвы - висят на этой шине и слушают, получая данные - так или иначе их обрабатывают. Ничего не передают, только берут. :)
В качестве мастера - на данный момент рассматриваю Мегу. В качестве слейвов - будут вероятнее всего Нано.
Важный момент - если навешивать всякое вокруг мастера допустимо, то слейвы должны быть максимально компактными.
Максимальное расстояние - метров шесть. Количество жил хотелось бы минимальное, дабы провода были потоньше. Но вопрос красивой врезки в шину по дороге, конечно, тоже никто не отменял. Общую землю всем участникам обеспечу.
Соответственно, RS485 не рассматриваю - требует доп.модулей. CAN - аналогично. Исхожу из того, что умеет Нано как есть, ибо габариты критичны.
А умеет она у нас либо uart, либо i2c, либо spi в программном и аппаратном варианте. Это то, что я знаю и пробовал пусть и не для сети, но хоть как-то. :)
Вопрос - в какую сторону копать? В сети нагуглил решения с uart и с i2c (библиотеку iarduino_I2C_connect). По SPI пока ничего не нагуглил.
Есть у кого практический опыт в этой области? Или может есть готовое решение, которое я просто не нашел?
дешевые радиомодули на 315 или 433 МГц - на Али по 20-30 рублей. И никаких проводов вообше
Хотя сорри, не увидел про 30 раз в секунду по 400 байт.
А оно надо столько? 3 раза в секунду по 40 байт не хватит? :)
Радиомодули не вариант - габарит слейвов вырастает. Я уже делал такое решение на радио, только на базе Nrf24l01. 3 по 40 точно мало. Могу вписаться скажем в 10 по 200, но дальше ужимать уже не хотелось бы. Да и в 10 не хотелось бы. :)
Собственно, я вполне могу разбить эти 400 на 40 по 10, если что. Но вопрос общей пропускной способности все равно будет актуален.
uart
Модули NRF24 в разных габаритах бывают. Я покупал размером чуть больше ногтя большого пальца.
Никаких сложностей. 400 байт 30 раз в секунду -- это 12 килобайт/сек. Скорость NRF24 2мбита или 200 килобайт/с. Шестнадцатикратный запас. С учетом всех накладных расходов (буферизация, синхронизация и про.) можно эти 400 x 30 с тройным переповтором бродкастить каждую секунду. Просто нужно хорошо представлять, в какой режим загнать радиомодуль и как им управлять.
Модули NRF24 в разных габаритах бывают. Я покупал размером чуть больше ногтя большого пальца.
Это не так и мало. Опять же, нужны стабильные 3.3 v Просто Нано их не даст, конденсатор не панацея. Или брать нанки от Роботдин с их подсистемой питания, или ставить еще и понижайку.
Где-то здесь на форуме я кидал фотки своей арудино--подобной платы на Atmega8, на которой верхом сидел модуль NRF24 (обычный). По габаритам этот бутерброд был если и больше ардуино про-мини, то совсем чуть-чуть. Стабильные 3.3в и для меги и для нрф обеспечивал единственный LD1117. В таком виде оно у меня работает уже несколько лет не выключаясь. Нареканий нет.
промини + RS485 - не особо больше, чем nano.
uart
Я вот тоже склоняюсь в его сторону. Тем более, что примеры в сети есть. Вопрос разве что в том, на сколько корректно работает программый uart. Который SoftwareSerial. Или надо использовать обязательно аппаратный?
промини + RS485 - не особо больше, чем nano.
Так-то да, но нужно ли лишнее усложнение? Все ж таки RS485 может куда больше, чем мои задачи.
промини + RS485 - не особо больше, чем nano.
Так-то да, но нужно ли лишнее усложнение? Все ж таки RS485 может куда больше, чем мои задачи.
Это не аргумент.
Выбор интерфейса сильно зависит от расстояния и от топологии. I2C вообще-то на 3м рассчитан. Голый UART потянет примерно столько же. А вот RS485 даст и скорость, и расстояние, и надежность. Вернее, поскольку передатчик RS485 все время включен, то сеть правильнее называть RS422. Все приемники лучше расположить цепочкой, а в самом конце цепочки повесить терминирующий резистор. Номинал резистора зависит от того, из чего сделана линия связи.
вот неплохо расписано
http://mypractic.ru/urok-60-interfejs-rs-485.html
промини + RS485 - не особо больше, чем nano.
Так-то да, но нужно ли лишнее усложнение? Все ж таки RS485 может куда больше, чем мои задачи.
Любая задача имеет свойство расти и видоизменяться. Особенно, если находится на стадии прототипирования (судя по вопросам - именно на ней). Поэтому сравнительно дешевый в реализации запас по надежности не помешает.
Если есть провода то только RS485 и не дурите себе голову. 6 метров уже достаточно много, чтобы огрести проблем с помехами, наводками и статикой на любом из i2c/uart/spi. Последние являются межузловыми интерфейсами в рамках одной платы, максимум одного корпуса
если размер смущает, замените нано на промини или сделайте свою плату и закажите ее на jlpcb
Любая задача имеет свойство расти и видоизменяться. Особенно, если находится на стадии прототипирования (судя по вопросам - именно на ней).
Нет, оно уже с неделю используется в боевом режиме. Сеть нужна для будущего расширения функционала, если я таки решу что оно мне надо. Да и задача эта так или иначе рассматривалась на протяжении последних четырех лет. Так что понимание ТЗ в голове присутствует. Просто раньше я пытался ее решать средствами наемных специалистов, а сейчас плюнул и и взялся сам. Оно пока менее красиво (там платы делались на заказ), зато куда быстрее по результату и проще в отладке и доводке.
В течении недели-двух вероятно найду время потестить uart решение, если все устроит - останусь на нем. Если будут вопросы - посмотрю в сторону rs485.
Хотя программный вариант SPI я планирую испытать на паре-тройки метров, опять же из интереса. С помехами в силу места установки все будет более чем хорошо, так что стресс-тест должен пройти на ура.
если размер смущает, замените нано на промини или сделайте свою плату и закажите ее на jlpcb
Уважаемый, если бы моя квалификация позволяла сделать документацию на свою плату - я бы на этом форуме не спрашивал, а отвечал. :) Про RS485 я услышал, время покажет.
P.S. Я вон не могу пока сверстать даже аналог классического китайского max7219 8 digit led, который мне нужен чуть в другом виде, нежели китайцы на ali продают. Просто потому, что понятие "принципиальная схема" меня пока вгоняет в ступор. А развести плату под МК + подсистему питания + доп.модули - это вообще космос. :(
Тогда промини и модуль rs485, будет не особо больше чем нано
еще один вариант - присмотритесь к esp8266, например модули esp-12f. Или esp8285, модуль esp-m2
Там в одном флаконе и мощный МК и связь через wifi и очень мелкие
Еще один вариант - присмотритесь к esp8266, например модули esp-12f. Или esp8285, модуль esp-m2
Там в одном флаконе и мощный МК и связь через wifi и очень мелкие
Поддерживаю:
Для исполнительных устройств, типа включить/выключить подходят esp-01. Они вообще раза в 2 меньше Arduino Nano. Минусы: для прошивки нужен переходник USB-UART с поддержкой 3.3В и на беспаечную макетку они не встают.
В качестве мастера можно использовать модули Wemos, например. Они лишены недостатков esp-01, плюс имеют кучу выводов, стабилизатор на борту и usb-uart. По размеру - чуть больше Nano.
Программироваться все эти модули могут через Arduino IDE при установке в нем поддержки плат на основе ESP-8266 (это делается за 5 минут). Все имеют WiFi на борту, которого за глаза хватит для Ваших расстояний между модулями.
В течении недели-двух вероятно найду время потестить uart решение, если все устроит - останусь на нем.
прльна, пральна. тормоза придумали трусы и интерфейсы тоже они
прльна, пральна. тормоза придумали трусы и интерфейсы тоже они
Ну, это все ж таки вещи из совершенно разных плоскостей. Но каждый человек имеет право на свое мнение. :)
Если совсем с минимумом обвеса слейвов - наверно DTMF. Там только резисторы для согласования с длинной линией. Если еще и транзистор нежалко - токовую петлю или петли. А сам бы делал на max485 soic8. Габариты бы нан оно не испортило бы.
хм... тормоза придумали, чтобы быстро и безопасно ездить, а интерфейсы придумали, чтобы быстро и безопасно передавать. аналогию можно проводитьи дальше
Под ваше задачи подходит звежда с 20-ю лучами, каждый из которых порядка 6 м, суммарно набегает 120 м.
по изложению понятно, что там все еще более путано, но насколько путано - хз.
так вы собираетесь собрать все целиком и тесттить или думате обойтись парой кусочков?
Под ваше задачи подходит звежда с 20-ю лучами, каждый из которых порядка 6 м, суммарно набегает 120 м.
по изложению понятно, что там все еще более путано, но насколько путано - хз.
так вы собираетесь собрать все целиком и тесттить или думате обойтись парой кусочков?
В моих задачах шесть метров - это расстояние от центра до самого дальнего модуля. Остальные будут где-то по дороге. Звезда возможна, но лучей будет штуки четыре, не больше. Опять же, как я понимаю организацию такой сети через тот-же uart - лучи я могу просто развести из одной точки. Просто физически соединив провода где-то у передатчика. Ибо у меня ровно один передатчик, все остальные приемники. А проверять целостность пакетов можно банальной проверкой CRC. Коллизии в такой системе просто невозможны.
На данном этапе центр работает обособленно, тестовый луч через uart на нем повиснет на следующей неделе, вероятно. Или на этой через SPI, посмотрим. Длиной метра два. В сутках всего 24 часа, что мне жутко мешает. :)
Тестировать модульные системы с нуля и всеми модулями сразу я смысла не вижу, это затрудняет отладку.
если один передатчик все остальные приемники то кроме RS485 можно использовать и RS232, причем тянуть только два провода - GND + TX.
Еще вариант: 2 сигнальных провода, рабочее напряжение 12-15 вольт. На приемнике - резистор + оптрон, все узлы гальванически развязаны.
Еще вариант: 2 сигнальных провода, рабочее напряжение 12-15 вольт. На приемнике - резистор + оптрон, все узлы гальванически развязаны.
Напряжение мы поднимаем ради помехоустойчивости и дальнобойности? Так а на передатчике при этом что?
Еще вариант: 2 сигнальных провода, рабочее напряжение 12-15 вольт. На приемнике - резистор + оптрон, все узлы гальванически развязаны.
Напряжение мы поднимаем ради помехоустойчивости и дальнобойности?
транзистор, допускающий 30 вольт и 0.5 ампера - т.е. ничего особенного.
Ну кроме 15Вт мощности при передаче данных ;) Может на БП сэкономить и сразу на 220В перейти )))
транзистор, допускающий 30 вольт и 0.5 ампера - т.е. ничего особенного.
Ну кроме 15Вт мощности при передаче данных ;) Может на БП сэкономить и сразу на 220В перейти )))
в ключевом режиме на биполярнике в открытом состоянии падает порядка 1в, т.е. при 0.5А будет порядка 0.5 ватт, но выше то речь шла про общее потребление, а не про рассеивание на транзисторе.
но по факту 15 ватт в таком случае будет пик, а среднее будет на порядок меньше
вот только раз уж использовать UART вообще не понимаю зачем фигней страдать, есть RS485 и RS232. оба простые. микросхемы стоят чуть дороже биполярного транзистора. места тоже не так много занимают
готовое промышленное решение
Можно рассмотреть вариант I2C с усилителем на мастере. Отправлять пакеты "всем", шина - одна, 2 провода. Врезка - не проблема в любом месте. Вопрос только к выходному каскаду мастера, чтобы на 6 метров стрелял. Скорость передачи промеж ардуинок легко доводится до 800кбит в сек, что "за глаза".
Можно рассмотреть вариант I2C с усилителем на мастере. Отправлять пакеты "всем", шина - одна, 2 провода. Врезка - не проблема в любом месте. Вопрос только к выходному каскаду мастера, чтобы на 6 метров стрелял. Скорость передачи промеж ардуинок легко доводится до 800кбит в сек, что "за глаза".
А можно пример такого усилителя? Что погуглить? :) И два провода достаточно без общей земли, или так земля по любому общая?
в ключевом режиме на биполярнике в открытом состоянии падает порядка 1в, т.е. при 0.5А будет порядка 0.5 ватт, но выше то речь шла про общее потребление, а не про рассеивание на транзисторе.
но по факту 15 ватт в таком случае будет пик, а среднее будет на порядок меньше
15 ма * 20 оптронов * 15 вольт = 3,6 ватта макс, среднее потребление - до 2 вт. Ничего сверхестественного для стационарного устройства.
Погуглите, сам протокол "внутриплатный" с макс. расстоянием 20см, но тут недавно его прикручивали как раз метрам к 6-и (одно задание?!?) .. в общем чего-то там есть такое.
Особенность протокола - организация типа "шина". На которой каждое устройство имеет свой собственный уникальный адрес. Но, кроме этого есть "широковещательные" пакеты типа "всем". Вот этот режим и может Вам пригодиться.
Главное достоинство - встроенное аппаратное решение во все "Ардуинки". то есть, ничего особенного городить не придется ни аппаратно ни программно. Аппаратно работает по прерыванию, что тоже большой плюс.
2 провода: 1 синхросигнал и 1 - передача/прием данных. Имеет аппаратный контроль достоверности передачи (бит "нах" nack), что тоже плюсом. Частота нормирована на 100 и 400кГц синхросигнала, но Меги (все) могут вполне нормально работать вплоть до 880кГц. - программируется.
Все меги могут работать как в режиме "мастер" так и "слейв" и даже переуключаться по ходу пьесы туда-сюда обратно. Возможен режим "мультимастер", когда мастеров несколько. Мастер может как активно передавать данные, так и активно заставлять слейва отдать ему и принять что скажут. Это Вам на раздумье: стоит ли гонять впустую данные одним мастером или НАНки у Вас будут запрашивать данные от "мастера" когда им потребуется и только то, что требуется..
Сам протокол с открытым коллектором, то есть напруга свистка - роли не играет, но для передачи на расстояния провод обладает существенной емкостью, а ноги у мег - не резиновые. Усилители сигналов потребуются - всяко. И/или повышение напряжения в канале передачи. ОК - позволяет.
В общем, найдите описание протокола и вдумчиво погрузитесь в это дело. Тут - спецов не найдете все равно. Для себя делал драйвер, решающий все задачи протокола, в т.ч. и режим мультимастер - работает устойчиво (внутриплатно, напрямую без довесов) вплоть до частот 880кГц - проверено. Драйвер вполне упихивается в 200 с небольшим байт программы.
В частности, вывод на I2C 1602 довели до 95мсек кажется, тут совместно с andriano и по прерываниям. Пошукайте.
Просто диву даюсь, сколь живучи заблуждения. Уже никто не вспомнит, кто, где и когда ляпнул эту очевидную глупость, но повторять ее на все лады видно доставляет удовольствие. "Внутриплатный", "сантиметры"... Особо "продвинутые" дурни тут на форуме даже волновую природу пытались приплетать и шину терминировать требовали. Это все при том, что филипсы (им принадлежит копирайт на I2C) ни пол-слоовом не упоминают ни расстояния, ни "внутриплатность", ни прочие чудеса. Практически единственное ограничение по физпараметрам -- это емкость линии. Пока удастся эту емкость удерживать в пределах 400пф, такой длины линия и будет.
Просто диву даюсь, сколь живучи заблуждения. Уже никто не вспомнит, кто, где и когда ляпнул эту очевидную глупость, но повторять ее на все лады видно доставляет удовольствие. "Внутриплатный", "сантиметры"... Особо "продвинутые" дурни тут на форуме даже волновую природу пытались приплетать и шину терминировать требовали. Это все при том, что филипсы (им принадлежит копирайт на I2C) ни пол-слоовом не упоминают ни расстояния, ни "внутриплатность", ни прочие чудеса. Практически единственное ограничение по физпараметрам -- это емкость линии. Пока удастся эту емкость удерживать в пределах 400пф, такой длины линия и будет.
Очередная декларация самодовольного невежества от a5021.
Само название интерфейса означает "inter integrated circuits" -> IIC -> I2C, две подряд идущих буквы I заменили на "I в квадрате". В переводе это "интерфейс между микросхемами", т. е. интерфейс, соединяющий несколько микросхем. На одной плате или на рядом расположенных платах, естественно.
AN10216 от Филипса (что есть I2C Manual) в сравнительной таблице интерфейсов (стр.5) говорит черным по белому, что I2C без буферизации на скорости 400 kbps работает на 2 м.
Учите матчасть (с)
Учите матчасть (с)
Его учить - только портить.
в ключевом режиме на биполярнике в открытом состоянии падает порядка 1в, т.е. при 0.5А будет порядка 0.5 ватт, но выше то речь шла про общее потребление, а не про рассеивание на транзисторе.
но по факту 15 ватт в таком случае будет пик, а среднее будет на порядок меньше
15 ма * 20 оптронов * 15 вольт = 3,6 ватта макс, среднее потребление - до 2 вт. Ничего сверхестественного для стационарного устройства.
если уж внатуре посчитать то 15 ма * 20 оптронов * 15 вольт = 4,5 ватта )))
А если еще и правильно посчитать, то надо учесть больше факторов, т.к в схеме кроме оптронов еще коечего нужно.
Да вы же опять прочитать не можете, на что ссылаетесь. Небуферизированный I2C -- это стандартный 4ма КМОП-выход. У того же ардуины все выходы буферизированные, до 40ма на пин. Сто метров I2C у ардуины -- это вряд ли, а пару-тройку десятков запросто.
Че, опять про волновые процессы в I2C вещать будете, учитель?
Я верю в твою любознательность и, следовательно, в то, что ты прочитал про волновые процессы.
Вся теория длинных линий работает тогда, когдо линия - длинная, т.е. много больше длины волны.
На 100 КГц в И2С длина волны = 2е8 м/с (скорость света в проводах ;) ) / 1е5 (100КГц) = 2 км. Таким образом линия у нас всегда короткая, и никакие волновые свойства не проявляются. Даже "для красоты фронта" можно взять аж 10ую гармонику, будет 200м - характерная длина, а мы говорим про 10 метров, не более.
Нечего возвращаться к тому старому спору. ОК?
Я в том споре вообще с самого начала говорил, что волновые процессы применительно к I2C -- полнейшая лажа. Мне зачем к нему возвращаться? У меня все сходится и тогда и сейчас.
И опять лезем в AN10216 от Филипса в ту самую таблицу 5, но в следующую строку, для буферированой i2c. Что там значится как Length limiting factor ? Упс, propagation delays. Переводим кто как может. Хм: задержки распространения. Снова филипс себя оговаривает. Наверно.
Теперь я подброшу гов*а в ветилятор. Что есть в длиных проводах и мало в коротких. Емкость блин. Но если в проводах всегда держится напряжение, то на емкость можно забить. Но если идет перепад на передаче, то идет накачка заряда на линию и разрядка ее. Меньше напряжение, то меньше перекачка заряда при одной и той же передаче. Тот же процесс мы наблюдаем в процессорах. Линии короткие, перепады 0-1 маленькие. Растот быстродествие и снижается потребление. И все потому что емкость коротких проводников минимальна.И ее можно достаточно быстро перезарежать.
ПС: Можно упомянуть токовые петли. Ну там уже потери на активное сопротивление проводов.
Я верю в твою любознательность и, следовательно, в то, что ты прочитал про волновые процессы.
Вся теория длинных линий работает тогда, когдо линия - длинная, т.е. много больше длины волны.
На 100 КГц в И2С длина волны = 2е8 м/с (скорость света в проводах ;) ) / 1е5 (100КГц) = 2 км. Таким образом линия у нас всегда короткая, и никакие волновые свойства не проявляются. Даже "для красоты фронта" можно взять аж 10ую гармонику, будет 200м - характерная длина, а мы говорим про 10 метров, не более.
Нечего возвращаться к тому старому спору. ОК?
К спору возвращатся разумеется не стоит, но на ошибки в вашем расчете обратить внимание стоит. 2км полученое это длина волны для гармонического колебания, которого заведомо нет здесь. У нас прямоугольники, с довольно крутыми фронтами, потому ""для красоты фронта" можно взять аж 10ую гармонику" - абсолютно отфонарно. Может 10-ю, а может и 30-ю. Далее, проводов то у нас 2 и сигналы в них за один период 10мксек в сумме имеют 4 фронта и фронты эти должны оставатся согласованы друг с другом, а знач за 10мксек должно завершится 4 переходных процесса. И последний момент, если линия не терминирована, то её длину волны пробегает несколько раз. Вот эти факторы и сокращают расчитаные Вами 200м и приводят в полное соответствие с значениями из таблицы по ссылке выше.
Теперь я подброшу гов*а в ветилятор. Что есть в длиных проводах и мало в коротких. Емкость блин.
Разумеется. 400pF max из той же таблички для небуферированой шины. Буфер какраз и снимает проблему с емкостю за счет большего тока накачки.
Как раз у оптоволокна нет емкости и активного сопротивления.
Отличное решение для однонаправленной сети на ардуине. Пусть мигает D13 в соломинку из под напитка, а с другой стороны ловит чем-нить.
Хотите понижают - ну пусть так )) Понижают настолько, что лимитирующим фактором станоаится время распостранения. Оптика конечно круто, но у неё есть свои проблемы. Например в задаче из стартового я се оптику представить немогу.
ПС. Хотя нет! могу! ИК излучатель и tsop-ы от ДУ в приемниках .
Оба эксперта "совершенно случайно" забыли, что спектр прямоугольного сигнала не содержит четных гармоник? Офигеть!
Нет, не забыли. Просто это дела не касается.
ПС. При пайке к i2c важно не перегреть алименты. Напишу навсяк, а то еще скажут что забыл о таком насущном.