RS485 и две ардуины

megahertz
Offline
Зарегистрирован: 17.08.2016

Доброго дня 

Есть схема  http://adatum.ru/wp-content/uploads/2014/08/test789.jpg по которой две ардуины подключены к писюку

и есть программа залитая в обе ардуины

 

01<code>#define SerialTxControl 10   //RS485 управляющий контакт на arduino pin 10
02#define RS485Transmit    HIGH
03#define RS485Receive     LOW 
04char buffer[100];
05void setup(void) {
06  Serial.begin(9600);
07   pinMode(SerialTxControl, OUTPUT); 
08   digitalWrite(SerialTxControl, RS485Transmit);
09   Serial.println("TEST"); 
10  delay(100);
11  digitalWrite(SerialTxControl, RS485Receive);  
12}
13  
14void loop(void) {
15    
16  digitalWrite(SerialTxControl, RS485Receive);  // читаем данные с порта
17    
18 int i=0; if(Serial.available()){delay(100);
19while( Serial.available() && i< 99)
20{ buffer[i++] = Serial.read();} buffer[i++]='\0';}
21  if(i>0)
22  {
23    
24  Serial.println(buffer); // Выводим что приняли с других устройств
25  }
26  
27}</code>

 

Собственно при подключении такой схемы, пины DE/RE на TTL конвертере замыкаются между собой перемычкой и подключаются к управляющему контакту D10 ардуины, так же происходит и на второй ардуине, далее при включении всего этого безобразия я могу работать только с одной ардуиной, т.е что-то отправлять или принимать от нее по RS485, а вот вторая висит с постоянно горящим TX и соответственно ничего передать или принять от нее я не могу...Если разомкнуть RE от DE на проблемной ардуине и подключить только DE на D10, то я могу на нее отправлять какие то команды через RS485 и она их обрабатывает, но работает это в одностороннем порядке т.е ответы ардуина обратно не отправляет. 

Собсна вопрос знатокам, где и что мог упустить?

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

выводы RE & DE это выводы управления направлением потока данных преобразователя.

при разрыве соединения этих выводов и не понятных уровнях на них соответственно получается неопределенность направления потока данных. Нужно курить даташит на МС преобразователя и правильно управлять RE & DE (не оставлять в воздухе, сигналы управления должны быть на каждом из этих выводов).

вопрос ТСу:

-сколько мастеров и слэйвов может быть в сети по протоколу RS-485?

-кто у Вас начинает передачу данных при подаче питания и что передает?

-кто на приеме, а кто может быть продолжает занимать линию на передачу?
 

megahertz
Offline
Зарегистрирован: 17.08.2016

1. сейчас на шине 2 слэйва, и будет расширено до 4-х

2. передачу всегда и только всегда начинает ПК, т.е при определенных условиях с ПК делается так echo "test" > /dev/ttyUSB0 - где USB0 это RS485 интерфейс. Далее писюк ждет обратного ответа от arduino и закрывает какую либо передачу. На столе ессно команды выполняются по очереди для каждой из ардуин

3. ну...еще на этапе физического подключения одна из ардуин начинает светить в TX если контрольный пин подключен к DE/RE и на этом ничего не принимает(как будто линия занята)

Попробую разделить контрольный пин на два - D9 и D10, но хз т.к одна из двух ардуин при одинаковой конфигурации и подключении работает на ура...почему то думаю что трабла в схеме подключения..может где-то что-то напутал 

 

ВН
Offline
Зарегистрирован: 25.02.2016

Рабрта в сети, даже такой примитивной, возможна между устройствами исключительно на принципах адресации.

Т.е. каждый слейв длжен имет свой адрес, по которому к нему обращаются.

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

Есть такие протоколы открытые, а есть разработанные компаниями исключительно под себя.

megahertz
Offline
Зарегистрирован: 17.08.2016

и зачем? мне достаточно послать команду общей шине в которой все слышат то что я говорю и далее в зависимости от команды сделать то, что я сказал. Такая схема не требует всяких модбас и другой хрени.

ВН
Offline
Зарегистрирован: 25.02.2016

megahertz пишет:
 ... далее при включении всего этого безобразия я могу работать только с одной ардуиной, т.е что-то отправлять или принимать от нее по RS485, а вот вторая висит с постоянно горящим TX и соответственно ничего передать или принять от нее я не могу

вообще-то это цитата первого поста

megahertz
Offline
Зарегистрирован: 17.08.2016

точно! а если читать текст полностью а не кусками, то можно было увидеть частичное решение

megahertz пишет:

Если разомкнуть RE от DE на проблемной ардуине и подключить только DE на D10, то я могу на нее отправлять какие то команды через RS485 и она их обрабатывает, но работает это в одностороннем порядке т.е ответы ардуина обратно не отправляет. 

AlexZZZ
Offline
Зарегистрирован: 22.07.2016

Судя по вашим ответам приведенный скетч выложен ну мягко говоря не тот что реально в ардуинах?

Прошу поправить меня, если не прав, разве не все ардуины при подаче питания закричат мастером "тест" ?

Где адресация по ардуинам? которая из них ответит на запрос компа? может быть они отвечают синхронно?

если к компьютеру подключать только по 1 ардуинке, работают? или один экземпляр все так же светит индикатором Тх ?

megahertz
Offline
Зарегистрирован: 17.08.2016

давайте к теме. 

попробовал залить скетч тот же что и в примере https://arduino-info.wikispaces.com/SoftwareSerialRS485Example

ситуация та же самая. ПК - это мастер ,с него в COM порт летят команды 1 или 2 и соответственно при 1 зажигается blue_led, при 2 - yellow_led

01#include <SoftwareSerial.h>
02 
03#define SSerialRX        10  //Serial Receive pin
04#define SSerialTX        11  //Serial Transmit pin
05 
06#define SSerialTxControl 4   //RS485 Direction control
07#define RS485Transmit    HIGH
08#define RS485Receive     LOW
09 
10#define Pin13LED         2
11 
12 
13SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
14 
15int byteReceived;
16int byteSend;
17 
18void setup()
19   
20  digitalWrite(SSerialTxControl, RS485Receive);  // Init Transceiver
21     // set the data rate
22}//--(end setup )---
23 
24 
25void loop()   /****** LOOP: RUNS CONSTANTLY ******/
26{
27 // while , HIGH);  // Show activity
28    delay(1000);             
29    digitalWrite(Pin13LED, LOW);
30       
31     
32    digitalWrite(SSerialTx
33  
34}

 

обе ардуины+конвертеры подключены так: R0=D10, DI=D11, DE/RE=D4

при отправке 1 в serial - зажигается blue_led на первой ардуине, при отправке 2 в serial - на второй ардуине ничего не происходит. Далее, если на второй ардуине отключить DE от D4 то при отправке 1 в serial - зажигается blue_led на первой ардуине, при отправке 2 в serial - зажигается yellow_led на второй ардуине, и это как бы круто, оно работает, но вторая ардуина обратно в serial не отвечает...т.е суть проблемы в том, что нужно получить обратные ответы при выполнении команды, иначе не понятно, получила одна из ардуин что-то или не получила

 

yden
Offline
Зарегистрирован: 30.01.2016

Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.

Не могу в инете найти код обмена между двумя ардуинами по rs485, используя TTL конвертер. А свое сделать ума не хватает.

Что хочу: будет одна Uno (мастер) и несколько nano (слейвы). На мастер будет стекать информация с датчиков  + активность выходов, которые подключены к слейвам.

Может у кого есть код подобной реализации, поделитесь пожалуйста. Сам то rs485 вроде понятен, но протокол для меня темный лес. Т.е как закодировать, и потом раскодировать информацию.

Спасибо

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

yden пишет:

Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.

Либа с примерами: https://drive.google.com/file/d/0Bzb96ijbjcmkcEIzTzBXemZCZ28/view?usp=sharing