Доброго дня
Есть схема http://adatum.ru/wp-content/uploads/2014/08/test789.jpg по которой две ардуины подключены к писюку
и есть программа залитая в обе ардуины
01 | <code>#define SerialTxControl 10 |
02 | #define RS485Transmit HIGH |
03 | #define RS485Receive LOW |
07 | pinMode(SerialTxControl, OUTPUT); |
08 | digitalWrite(SerialTxControl, RS485Transmit); |
09 | Serial .println( "TEST" ); |
11 | digitalWrite(SerialTxControl, RS485Receive); |
16 | digitalWrite(SerialTxControl, RS485Receive); |
18 | int i=0; if ( Serial .available()){delay(100); |
19 | while ( Serial .available() && i< 99) |
20 | { buffer[i++] = Serial .read();} buffer[i++]= '\0' ;} |
24 | Serial .println(buffer); |
Собственно при подключении такой схемы, пины 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
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
13
SoftwareSerial RS485Serial(SSerialRX, SSerialTX);
// RX, TX
14
15
int
byteReceived;
16
int
byteSend;
17
18
void
setup
()
19
20
digitalWrite(SSerialTxControl, RS485Receive);
// Init Transceiver
21
// set the data rate
22
}
//--(end setup )---
23
24
25
void
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 не отвечает...т.е суть проблемы в том, что нужно получить обратные ответы при выполнении команды, иначе не понятно, получила одна из ардуин что-то или не получила
Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.
Не могу в инете найти код обмена между двумя ардуинами по rs485, используя TTL конвертер. А свое сделать ума не хватает.
Что хочу: будет одна Uno (мастер) и несколько nano (слейвы). На мастер будет стекать информация с датчиков + активность выходов, которые подключены к слейвам.
Может у кого есть код подобной реализации, поделитесь пожалуйста. Сам то rs485 вроде понятен, но протокол для меня темный лес. Т.е как закодировать, и потом раскодировать информацию.
Спасибо
Можно с позволения топикстартера спросить, так как вопрос тоже по rs485.
Либа с примерами: https://drive.google.com/file/d/0Bzb96ijbjcmkcEIzTzBXemZCZ28/view?usp=sharing