RS485 и две ардуины
- Войдите на сайт для отправки комментариев
Доброго дня
Есть схема http://adatum.ru/wp-content/uploads/2014/08/test789.jpg по которой две ардуины подключены к писюку
и есть программа залитая в обе ардуины
<code>#define SerialTxControl 10 //RS485 управляющий контакт на arduino pin 10 #define RS485Transmit HIGH #define RS485Receive LOW char buffer[100]; void setup(void) { Serial.begin(9600); pinMode(SerialTxControl, OUTPUT); digitalWrite(SerialTxControl, RS485Transmit); Serial.println("TEST"); delay(100); digitalWrite(SerialTxControl, RS485Receive); } void loop(void) { digitalWrite(SerialTxControl, RS485Receive); // читаем данные с порта int i=0; if(Serial.available()){delay(100); while( Serial.available() && i< 99) { buffer[i++] = Serial.read();} buffer[i++]='\0';} if(i>0) { Serial.println(buffer); // Выводим что приняли с других устройств } }</code>
Собственно при подключении такой схемы, пины DE/RE на TTL конвертере замыкаются между собой перемычкой и подключаются к управляющему контакту D10 ардуины, так же происходит и на второй ардуине, далее при включении всего этого безобразия я могу работать только с одной ардуиной, т.е что-то отправлять или принимать от нее по RS485, а вот вторая висит с постоянно горящим TX и соответственно ничего передать или принять от нее я не могу...Если разомкнуть RE от DE на проблемной ардуине и подключить только DE на D10, то я могу на нее отправлять какие то команды через RS485 и она их обрабатывает, но работает это в одностороннем порядке т.е ответы ардуина обратно не отправляет.
Собсна вопрос знатокам, где и что мог упустить?
выводы RE & DE это выводы управления направлением потока данных преобразователя.
при разрыве соединения этих выводов и не понятных уровнях на них соответственно получается неопределенность направления потока данных. Нужно курить даташит на МС преобразователя и правильно управлять RE & DE (не оставлять в воздухе, сигналы управления должны быть на каждом из этих выводов).
вопрос ТСу:
-сколько мастеров и слэйвов может быть в сети по протоколу RS-485?
-кто у Вас начинает передачу данных при подаче питания и что передает?
-кто на приеме, а кто может быть продолжает занимать линию на передачу?
1. сейчас на шине 2 слэйва, и будет расширено до 4-х
2. передачу всегда и только всегда начинает ПК, т.е при определенных условиях с ПК делается так echo "test" > /dev/ttyUSB0 - где USB0 это RS485 интерфейс. Далее писюк ждет обратного ответа от arduino и закрывает какую либо передачу. На столе ессно команды выполняются по очереди для каждой из ардуин
3. ну...еще на этапе физического подключения одна из ардуин начинает светить в TX если контрольный пин подключен к DE/RE и на этом ничего не принимает(как будто линия занята)
Попробую разделить контрольный пин на два - D9 и D10, но хз т.к одна из двух ардуин при одинаковой конфигурации и подключении работает на ура...почему то думаю что трабла в схеме подключения..может где-то что-то напутал
Рабрта в сети, даже такой примитивной, возможна между устройствами исключительно на принципах адресации.
Т.е. каждый слейв длжен имет свой адрес, по которому к нему обращаются.
Вообще же вся кухня приема-передачи описывается сетевым протоколом, где все расписывается: допустимое количество адресов на линии, временные соотношения, скорости, алгоритмы обращения, контрольные суммы, шифрация и т.д. и т.п.
Есть такие протоколы открытые, а есть разработанные компаниями исключительно под себя.
и зачем? мне достаточно послать команду общей шине в которой все слышат то что я говорю и далее в зависимости от команды сделать то, что я сказал. Такая схема не требует всяких модбас и другой хрени.
вообще-то это цитата первого поста
точно! а если читать текст полностью а не кусками, то можно было увидеть частичное решение
Если разомкнуть RE от DE на проблемной ардуине и подключить только DE на D10, то я могу на нее отправлять какие то команды через RS485 и она их обрабатывает, но работает это в одностороннем порядке т.е ответы ардуина обратно не отправляет.
Судя по вашим ответам приведенный скетч выложен ну мягко говоря не тот что реально в ардуинах?
Прошу поправить меня, если не прав, разве не все ардуины при подаче питания закричат мастером "тест" ?
Где адресация по ардуинам? которая из них ответит на запрос компа? может быть они отвечают синхронно?
если к компьютеру подключать только по 1 ардуинке, работают? или один экземпляр все так же светит индикатором Тх ?
давайте к теме.
попробовал залить скетч тот же что и в примере https://arduino-info.wikispaces.com/SoftwareSerialRS485Example
ситуация та же самая. ПК - это мастер ,с него в COM порт летят команды 1 или 2 и соответственно при 1 зажигается blue_led, при 2 - yellow_led
обе ардуины+конвертеры подключены так: R0=D10, DI=D11, DE/RE=D4
при отправке 1 в serial - зажигается blue_led на первой ардуине, при отправке 2 в serial - на второй ардуине ничего не происходит. Далее, если на второй ардуине отключить DE от D4 то при отправке 1 в serial - зажигается blue_led на первой ардуине, при отправке 2 в serial - зажигается yellow_led на второй ардуине, и это как бы круто, оно работает, но вторая ардуина обратно в serial не отвечает...т.е суть проблемы в том, что нужно получить обратные ответы при выполнении команды, иначе не понятно, получила одна из ардуин что-то или не получила
Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.
Не могу в инете найти код обмена между двумя ардуинами по rs485, используя TTL конвертер. А свое сделать ума не хватает.
Что хочу: будет одна Uno (мастер) и несколько nano (слейвы). На мастер будет стекать информация с датчиков + активность выходов, которые подключены к слейвам.
Может у кого есть код подобной реализации, поделитесь пожалуйста. Сам то rs485 вроде понятен, но протокол для меня темный лес. Т.е как закодировать, и потом раскодировать информацию.
Спасибо
Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.
Либа с примерами: https://drive.google.com/file/d/0Bzb96ijbjcmkcEIzTzBXemZCZ28/view?usp=sharing