Несколько устройств на одной Serial шине
- Войдите на сайт для отправки комментариев
Господа гуру подскажите пожалуйста как можно реализовать следующую задачу:
Есть одна мастер ардуина к ней планируется подключить несколько других ардуин слейвов которые должны:
- слушать мастера, слышать все его команды и програмно разбирать моя/не моя команда
- передавать мастеру команды
- не видеть других слейвов
- не иметь своего жесткого адреса
- не иметь отдельного провода для управления собой
- подключаться, отключаться, перезагружаться, на гарячуу, не влияя на шину
Идея была использовать для этого Serial шину. То есть к TX мастера подлючаются все RX всех слейвов и к RX мастера - соответственно все TX всех слейвов. Все на одной сторости 19200. Устройств не много 4-10шт
устройства общаются не очень часто, примерно раз в 1-5сек наборами из 2-10байт. Где первые 2 байта это команды и каждый из слейвов(если от мастера) сам решает реагировать на неё или нет, тоже саомое и от слейвов к мастеру. Информация не очень критичная, переодически дублируется.
Serial выбрал потому что дебажить удобно и тестировать.
Пытался собрать такую схему на 3х ProMini мастер истольковал softSerial остальные хардварный.
Два между собой отлично работают, 3 уже никак ( Может резисторов на поддтяжку добавить или еще чего? не хочется просто городить велосипедов или юзать шину типа запрос - ответ. Ну или каждому девайсу еще по пину навешивать (
(и еще, это не очередной "умный дом" :) )
http://ru.wikipedia.org/wiki/UART
Через Serial у вас это не получится, увы.
Используйте SPI или I2C (=TWI)
Ну при осторожном и внимательном подходе - можно. У вас проблема в объединении в шину... электрическая нестыковка. Делайте так - тх всех слейвов обединяете на rx мастера через диоды направленные в сторону слейвов. Ножку мастера rx подтяните к питанию через резистор 1-10kom. Получится монтажное и. Тх мастера просто подключайте к rx ведомых. Естественно речь идет не о rs232, а о uart процессоров.
можно сделать но только нужны две вещи:
- поменять физичекий уровень. Выходы RX/TX ардуины физически это TTL/UART. Он не расчитан на подключение многих устройств. Есть ряд микросхем/чтандартов которые позволяют TTL заменить на физический уровень с возможностью подключения многих устройств. Один из них - RS485, например на микросхеме max485
- придумать или взять готовый протокол общения на такой шине (какой-нибудь модбас)
http://arduino.ru/forum/programmirovanie/modbus-rs485-gotovyi-shild#comment-form
http://arduino.ru/forum/apparatnye-voprosy/peredacha-mezhdu-arduinami-po...
http://arduino.ru/forum/apparatnye-voprosy/kak-podklyuchit-k-arduine-mod...
http://arduino.ru/forum/apparatnye-voprosy/arduino-rs485-sr518
http://arduino.ru/forum/programmirovanie/arduino-i-rs232-protokol-modbus
http://arduino.ru/forum/ishchu-ispolnitelya/modbus-ustroistvo
Благодарю. Буду пробовать. Отпишусь о результатах, вдруг кому еще пригодится.
Есть правда еще одна особенность которую я забыл указать: все работать должно от одного 3.7v (Li-Pol) акуммулятора. А ST485BD да и MAX485D, они на 5v к сожалению.
Есть правда еще одна особенность которую я забыл указать: все работать должно от одного 3.7v (Li-Pol) акуммулятора. А ST485BD да и MAX485D, они на 5v к сожалению.
примените повышающий преобразователь DC-DC Converter Step Up Module 1-5V to 5V 500mA
другие повышающие DC-DC
модули TTL232-RS485
Спасибо, но использование повышающей платы неприемлемо. Это лишние потери для аккумулятора, и не хочу усложнять ею схему.
тады ой
Используйте мой совет. Будет работать без танцев с бубном. Диод как раз вам и поможет развязать физический уровень. А можно еще проще. Этот прием да же в апнотах атмеловских описан. Раз у вас клиенты с софтверным последовательным интнрфейсом, то для передачи 0 переключите ногу тх на выход и установите на ней 0, а для передачи 1 - переключите эту ногу на вход. Таким образом когда на шине объединится несколько процессоров не будет колизий по электрическим нагрузкам.
Используйте мой совет. Будет работать без танцев с бубном. Диод как раз вам и поможет развязать физический уровень. А можно еще проще. Этот прием да же в апнотах атмеловских описан. Раз у вас клиенты с софтверным последовательным интнрфейсом, то для передачи 0 переключите ногу тх на выход и установите на ней 0, а для передачи 1 - переключите эту ногу на вход. Таким образом когда на шине объединится несколько процессоров не будет колизий по электрическим нагрузкам.
что-то вы меня малость запутали. Я собирался по вашему совету просто поставить на всех TX всех слейвов по диодику в сторону к RX мастера с подтяжкой на плюс. А RX слейвов к ТХ мастера, без изменения, как делал раньше. Упрощать думаю не надо. потому как эту же шину я буду использовать для отладки через usb-uart платку, которю я могу просто подключить как один из слейвов (как я планировал)
Используйте мой совет. Будет работать без танцев с бубном. Диод как раз вам и поможет развязать физический уровень. А можно еще проще. Этот прием да же в апнотах атмеловских описан. Раз у вас клиенты с софтверным последовательным интнрфейсом, то для передачи 0 переключите ногу тх на выход и установите на ней 0, а для передачи 1 - переключите эту ногу на вход. Таким образом когда на шине объединится несколько процессоров не будет колизий по электрическим нагрузкам.
что-то вы меня малость запутали. Я собирался по вашему совету просто поставить на всех TX всех слейвов по диодику в сторону к RX мастера с подтяжкой на плюс. А RX слейвов к ТХ мастера, без изменения, как делал раньше. Упрощать думаю не надо. потому как эту же шину я буду использовать для отладки через usb-uart платку, которю я могу просто подключить как один из слейвов (как я планировал)
Ну при осторожном и внимательном подходе - можно. У вас проблема в объединении в шину... электрическая нестыковка. Делайте так - тх всех слейвов обединяете на rx мастера через диоды направленные в сторону слейвов. Ножку мастера rx подтяните к питанию через резистор 1-10kom. Получится монтажное и. Тх мастера просто подключайте к rx ведомых. Естественно речь идет не о rs232, а о uart процессоров.
ДИОДЫ БУДУТ РАБОТАТЬ ЕСЛИ ДЛЯ Tx Slave АКТИВНЫЙ УРОВЕНЬ = 0
Просто я описал два способа. Один с диодами, второй без, но с программными заморочками. Во втором способе диоды не нужны, потому что логический 0 - 0 ТТЛ, а логическая 1- высокоимпедансное состояние ножки процессора. Картинка из предидушего поста соответствует первому способу, все правильно.
Кстати да работать будет если активный уровень ноль. А если нужна единица, то нужно перевернуть диоды в обратную сторону, а подтяжку сделать к нулю :-) Так же нужно поступить и с софтверным способом. Запрограммировать высокий логический уровень как 1 ttl, aлогический 0 как высокий импеданс, переключая, для передачи 0 ножку проца на вход.
Кстати да работать будет если активный уровень ноль. А если нужна единица, то нужно перевернуть диоды в обратную сторону, а подтяжку сделать к нулю :-) Так же нужно поступить и с софтверным способом. Запрограммировать высокий логический уровень как 1 ttl, aлогический 0 как высокий импеданс, переключая, для передачи 0 ножку проца на вход.
Slave не синхронны между собой и без диодов - надежный способ убить TX
Без диодов можно так:
Вот та картинка которая зачеркнута будет работать, если правильно запрограмировать активный и не активный уровень вывода. Внимательно читайте то что я написал.
Работать будет, но схема потенциально опасная для выходов (верхний рис)
Желательно хотя бы резисторами 100-200 Ом подстраховаться (нижний рис)
Нет никакой опасности.После ресета все ноги атмеги сконфигурированы как входы. Для передачи активного уровня просто конфигурируем ногу на вывод ttl единицы, для передачи 0 переводим ногу опять на чтение. Таким образом на шине, самое страшное, что может произойти это несколько процессоров выставят на шине 1, не думаю что возникнут фатальные токи :-) Но резисторы воткнуть можно, не больше 10 ом, при большем сопротивлении на динной шине работать не будет.
Если один мк выставит 1, а другой 0 вот и есть КЗ в масштабе мк.
А почему не больше 10 Ом, токи ведь небольшие до 50 мА на все выводы мк суммарно
5В/10 ом=0,5 А
5В/100 ом= 0,05 А (50 мА)
5В/(100+100) ом=0,025 А (25 мА)
Вы читаете что я пишу ?! Или это разговор глухого со слепым. Никто не выставит 0, потому что в софтвернй реализации вместо установки логического ноля я предлагаю переключать порт на вход !!!!!!!!!!!!!!!!
Пафос не уместен, никогда не говорите никогда. Может быть ошибка программиста или сбой техники.
И почему не больший резистор уже обяснено. Закон ома мне еще в школе преподавали. Считать ток кз без учета схемы выходного контура ноги - слишком опрометчиво. Плотно занимался реализацией 1-ware, клиента. А значит софтверная реализация. Там ничего в электрическом плане не отличается от предложенного здесь, все работает. Я прекрасно понимаю о чем говорю. Вы же только предполагаете. Какой, блин пафос... чукча не читатель, чукча писатель (цы). Повторю, после сброса процессора все его ноги настроены на выход. В какой момент вдруг с какого то перепуга возникнет замыкание... вы уже не знаете что придумать ?
мне говорили про brokly - у него нет высшего радиоэлектронного образования
Конечно. Я водитель автобуса. А еще психиатр недоучка.... вы сильно больны. Вам никто не поможет. Кстати, сплетни - один из грехов.
Итак, результаты тестов готовы. Тестировал на 1 мастере и 2 слейвах
Испоьзовал схему с диодами и подтяжкой в 10К к плюсу. Диоды взял простоые ограничивающие, на 15в кажется.
Скетч прилагаю. Пабросал, хотя можно было бы и пооптимальнее конечно ))) Он один для всех устройств. просто ставим перемычку пин 10 к плюсу если мастер и к минусу если слейв. Перемычку пин 9 к прюсу если первое устройство и к минусу если второе (номер устройства не принципиален, можно 2 первых или вторых стелать) На пин 2 каждого слейва вешаем светодиод. A0 и A1 мастера это соответственно TX и RX к которым подключаем слейвы (я не использовал основкую шину потому что во моем проекте именно так и будет, отбельная софтварная шина)
С этим кодом все работает!!! )
Тестировал на 3х Arduino Pro Mini 328 3.3v 8mHz
Мониторил основно serial порт мастера. туда, как и полагается в последних стороках кода, с разной переодичностью слейвы сливают свой номер. А если передать "1" или "2" то блымнет светодиод на слейве у которого такой номер. Если отправить "3" то блымнет на обоих.
Так что спасибо всем кто помогал )
Испоьзовал схему с диодами и подтяжкой в 10К к плюсу. Диоды взял простоые ограничивающие, на 15в кажется.
Это должны быть обычные диоды, можно диоды шотки. Никаких супрессоров или стабиллитронов использовать нельзя. Они просто не откроются и никакой просадки на землю не будет. У нас в тролейбусах делают именно так ! Если линия будет длиннее нескольких метров, возникнет много помех, в этом случае можно не стесняясь уменьшать подтяжку до 1 кома.
А что бы работало БЕЗ ДИОДОВ, в softwareserial.cpp нужно заменить две функции
tx_pin_write на
Задействовать отключение диодов
Код не пробовал, так что аккуратнее.
стабилитроны и однонаправленные TVS ( они же подавители, супрессоры, ограничительные) должны работать (автор пишет про ограничение 15В, оно в отрицательной области и не мешает),
хотя наилучшим решением и тем более для мк с питанием 3,3В будут диоды Шоттки
Что в отрицательной области ? Стабилитрон на 15 вольт до 15 вольт не будет пропускать через себя какой либо значительный ток. Супрессор откроется лавинообразно при разности потенциалов не менее 15 вольт. В нарисованном включении (кстати нарисованы именно диоды), ничего работать не будет, при 5 вольтах ток не потечет. Echo free, Вы меня удивляете ! Я хоть и водитель тролейбуса, но не больной как QQEVSKIY и лечиться не собираюсь. Кстати мне говорили про QQEVSKIY - у него нет никакого образования.
А стабилитрон и однонаправленный TVS (если не вдаваться в технологические отличия) в положительной области напряжения эквивалентны диоду. То, что происходит в характеристике при напряжении ниже минус 15 В (это ограничение по словам автора темы) не важно, это напряжение для ардуино 3,3 В недостижимо
У диода обратное напряжение пробоя еще выше.
Я не виноват, что вы не знаете что такое тролейбус. Это не то же самое что троллейбус. Я вам не могу помочь с пониманием. Напрягитесь и поставьте эксперимент. Вам поможет ! навсякий случай обратите внимание на ориентацию диода в вашей же картинке ;) на всякий случай задумайтесь для чего можно использовать такое волшебное включение стабиллитрона или супрессора на 15 вольт в ТТЛ цепях. Я знаю два типичных применения супрессора и столько же стабиллитрона. И мне как водителю троЛейбуса было бы интересно знать ваше мнение о третьем, придуманом вами, способе примениения... очень интересно.
А еще интересно, что тут делает учитель русского языка ? И зачем я пытаюсь у него что то выяснить...
У меня под рукой оказались стабилитроны, их и использовал. Но думаю что лучше было бы использовать шотки.
Я не виноват, что вы не знаете что такое тролейбус. Это не то же самое что троллейбус. Я вам не могу помочь с пониманием. Напрягитесь и поставьте эксперимент. Вам поможет ! навсякий случай обратите внимание на ориентацию диода в вашей же картинке ;) на всякий случай задумайтесь для чего можно использовать такое волшебное включение стабиллитрона или супрессора на 15 вольт в ТТЛ цепях. Я знаю два типичных применения супрессора и столько же стабиллитрона. И мне как водителю троЛейбуса было бы интересно знать ваше мнение о третьем, придуманом вами, способе примениения... очень интересно.
А еще интересно, что тут делает учитель русского языка ? И зачем я пытаюсь у него что то выяснить...
Вы пугаете меня своим умом... Я то дурак дорогу к википедии не знаю... Вы с таким умным видом спрашивали какие именно стабилитроны применил топикстартер, конечно это ооочень важно... Только не нужно это. Вы этого понять не хотите, все чем то со мной меряетесь. Я тут предложил решение вы и с ним спорили... сначала... чего то про резисторы рассказывали. Вы сюда зачем ходите нервы потрепать нормальным водителям тролейбуса ? Самоутвердится ? Как то глупо и смешно получается, не находите ? Крику с вас много, а смыслу нетути. За то рисуете хорошо, может вы не учитель русского, а преподаватель по изо ? Устал я от вас, пойду делом займусь
Воу-Воу!!! Поздержаней господа ) Эта тема не стоит того чтобы меряться у кого диод круче )
Решение на мой вопрос найдено, всем спасибо.
Мир.Труд.Март )
Был, видел, думал еще можно что то поправить, ошибся. Здоровья вам.
человеку рабочей специальности вполне простительно сначала утверждать:
но потом передумать и после просадки в голове " да я , да вот , да птичка в рот, понимаете я ошибался"
Спасибо что разрешили, ваше высочество ! Куда вы без нас тупых люмпхенов. И зад то сами подтереть не сможете. Будете копаться в викепедии и пытаться резисторы примострятич туда куда они как корове седло :-) Умник недоразвитый :-) Расти-учись-закаляйся может и выдет что из осталопа :-) Мудо ты на букву `ч` :-)
Зы кстати мудо на букву ч чем нибудь отличается от чуда на букву м ?
Упорный ты, обкакался таким заявлением, но признаться стыдно.
А википедию тебе полезно читать так как основ не знаешь
Я то упорный, а ты умытый. Читай википедию, я там для тебя пишу :-) Я, кстати, тут не какаю и не писаю в отличии от тебя. Мне иногда удается кому нибудь помочь. Тебе, прости, помочь не смогу. Тебе дорога к дипломированному психоаналитику или к психиатру. Только они тебя из твоей грязи вынут... тебя кто то обидел сильно... но это тема для другого форума. Да же твой ник об этом кричит... бедный ты бедный... мне правда жаль тебя.
уж признавайся быстрей, что ты с отрицанием стабилитронов обкакался и закроем тему.
Приложи себе пару резисторов к голове, может поможет, ты же везде их применяешь, да же взамен диодов :) Можно и вилкой суп хлебать, но это решение идиотов. Как и супрессоры вместо диодов. Читай, образовывайся http://go-radio.ru/supressor.html . Да и на заметку тебе, если ты реально считаешь, что троль твое призвание, то и тут ты ошибаешься. Зарегистрировать пару ников и изображать из себя умную толпу у не очень умного человека все равно не получится :)
Итог, мое предложение с диодами работает, не взирая на то что ты хотел ставить резисторы и кричал что все сгорит. Мое предложение без диодов то же работает, хоть ты и вспомнил закон ома. Кстати ты то чем топикстартеру помог, только тем, что путал его ? А потом зацепился за меня ? Встало у тебя ? Или все напрасно ? :)
Вместо того, чтобы наезжать на автора темы и писать про использование стабилитронов как о решении для идиотов, признайся что ты лоханулся.
То что ты сейчас пишешь это попытка младшего обслуживающего персонала увести обсуждение от сути - "использование стабилитронов вместо диодов возможно".
Надоело... Можно и гланды удалить через задницу, автогеном :) Тебе же топикстартер написал, что это из-за отсутствия диодов. Про младшего научного ты грамотно зарядил. Сразу понятны твои комплексы. Ну сходи к врачу не мучай себя :)
Ну при осторожном и внимательном подходе - можно. У вас проблема в объединении в шину... электрическая нестыковка. Делайте так - тх всех слейвов обединяете на rx мастера через диоды направленные в сторону слейвов. Ножку мастера rx подтяните к питанию через резистор 1-10kom. Получится монтажное и. Тх мастера просто подключайте к rx ведомых. Естественно речь идет не о rs232, а о uart процессоров.
Пытаюсь подключить три PZEM004T v1 к ардуино УНО.
Как понял из прочитанного на форуме-на PZEM004 нужно поменять адреса (чтобы на всех трех они были разные) а потом , обращаясь к каждому устройству по его адресу ,считывать данные с каждого.
С одним модулем PZEM004 проблем нет-читаем без проблем .
С тремя - толком ничего не нашел ни примеров , ни подключения. И решил каждому PZEMу присвоить свой уникальный номер при помощи скетча из примеров(192.168.1.1, 192.168.1.2, 192.168.1.3). А потом в новом скетче(без команды pzem.setAddress(ip))- сделать последовательный опрос каждого модуля.
Но как подключить все это ?
Ув.brokly - подойдет ли ваш способ подключения трех PZEM004 к одному UART(hardserial) ардуины?
Думаю нет, в вашем случае лучше использовать или камень с несколькими UART или несколько SofwareSerial.
Пионер, вы с дуба рухнули? Что за IP адреса на Сериал шине?...?
Ну и бред
Почитайте хоть что-нибудь, прежде чем такие вопросы задавать
b707, у pzem - это штатная фича. Китайцы-разработчики накидались веществ и придумали... На самом деле, конечно, там не никакого ip-адреса нет, просто четырехбайтовый идентификатор в пакете, который передается по UART, похож на IP и в мануале так приводится: 192.168.1.1
В итоге - при параллельном подключении счетчиков на запрос отвечает тот, чей ID был в запросе.
Пипец.... то что тут кто-то обкурился - очевидно :) ну значит это не Пионер. Приношу извинения
Да, согласен. PZEM с UART - вещь специфическая. Вроде как и ставится в параллель, но как - сам производитель открыто не рассказывает. Поэтому начинаются извращения с хардварным моддингом счётчиков.