как подключить выходы от конвектора RS 485 TTL к ардуино уно

простофиля
Offline
Зарегистрирован: 16.12.2016

как подключить выходы RO RE DE DI

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014
Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Уважаемые коллеги!

Не стал плодить темы, решил написать о своих затруднениях здесь.
Итак. Имеется несколько дуин. Одна генерирует произвольное число в заданном диапазоне. Вторая принимает. В качестве индикатора - рулевая машинка. Просто и наглядно. Дуинки связаны по UART проводной связью - все работает, машинка жужжит, вертится туда-сюда.

Подключаю конвертеры RS-485 как указано в предыдущем посте. Вношу изменения в скетчи - для управлением режимом "прием-передача". Не работает. Подтягиваю "вручную" к "единице" передаюший и к "земле" RE и DE - толку ноль.

Где я мог что-то просмотреть?

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

минимум - рисуйте свою схему 

полная альтернатива UART это RS-422, может строиться на буферах RS-485 только требует 2 2х проводные линии связи 

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Подключено согласно таблице:

Конвертирующий модуль

  Arduino
DI (Driver Input - вход передатчика) TX (transmit - передать)
RO (Receiver Out - выход приёмника) RX (receive - получить)
Vcc (Voltage constant current - напряжение постоянного тока) Vcc
GND (GrouND - земля) GND (GrouND - земля)
DE (Driver Enable - разрешение работы передатчика) D10 (Digital - цифровой)
~RE (Receiver Enable - разрешение работы приёмника) D10 (Digital - цифровой)

Управление режимом "прием-передача" посредством пина D10 прописано следующим образом: HIGH - передача, LOW - прием.

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

похоже на правду

Разрешите прием ~RE, разрешите передачу DE , линию не подключайте

передавайте сигнал по ТХ и сразу принимайте его  на RX этим же процем 

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

как с этим разберетесь. двигайтесь дальше

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Я должен, по-сути, получить интерфейс-петлю?

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Попробовал. Не получается. Данные не приходят.

Вот скетч. Может, захожу не с той двери?


#include <Servo.h>


Servo myservo;

int posSend;
int posRec;

void setup() {
  pinMode(10,OUTPUT); //Сигнал для "Driver Enable" RS-485
  pinMode(11,OUTPUT); //Сигнал для "Receiver Enable" RS-485
  pinMode(13,OUTPUT); //Используется как индикатор прохождения цикла
  digitalWrite(10, HIGH); //Включение режима "передача"
  digitalWrite(11, LOW);  //Включение режима "Прием"
  digitalWrite(13, LOW);
  posRec = 0;
  Serial.begin(9600);
}

void loop() {
  digitalWrite(13, HIGH);
  posSend = random(0,180);
  Serial.write(posSend);
  if(Serial.available() != 0 ) {
    posRec = Serial.read();

  
    while(Serial.available()) {
      delay(2);
      Serial.read();
    }
    myservo.write(posRec); 
  delay(1000);
  digitalWrite(13, LOW);
  }
}

 

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

 digitalWrite(13, HIGH);

скока больт дает эта команда на 13 ноге? т.к.  туда обычно  прицеплен светодиод, и там может быть при 1 не более 1,5В, т.е. что HIGH, что LOW вход драйвера будет воспринимать как ноль.

Но страдаете вы фигней, было же сказано ... проверить ноликами, единичками ... не .... нада куда-то лезть в дебри, еще не разобравшись с работой самого драйвера.

Araris
Offline
Зарегистрирован: 09.11.2012

ВН, обратите внимание, пин 13 в данном случае ни к чему не подключен, а используется для управления встроенным светодиодом (строка 12 скетча выше).

Кот Баюн, в скетче я не вижу myservo.attach(), без этого вряд ли серва будет работать.

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

13 нога работает исключительно на прилагаемый светодиод. Управление драйвером через 10 и 11 пины.

А обвязка с сервой - осталась с предыдущего этапа, когда порты двух дуин соединял проводками.

 

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Спасибо за ответ. Серва работает.

Araris
Offline
Зарегистрирован: 09.11.2012

Кроме того, переключение режимов "приём"/"передача" (для скетча, который и принимает, и передаёт,) должно происходить динамически, а не один раз в setup(). RS-485 не может говорить и слушать одновременно, Вы должны переключать режим.

А ещё проще подключить по такой схеме

и рулить одним пином : 0-слушаем, 1-говорим.

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Да, так тоже коммутировал.

Две дуинки, одна генерирует данные, другая принимает. Пока порты соедимнены проводками - все ОК. Ну не может же весь десяток драйверов быть бракованным?

 


//Передатчик
//Передает в порт случайное число - угол поворота рулевой машинки
//Сопряжение по шине RS-485

int ServoDegree = 0;


void setup() {
 
  pinMode(10,   OUTPUT);
  pinMode(13,   OUTPUT);
  digitalWrite(10, LOW);
  digitalWrite(13, LOW);
  Serial.begin(9600);
}

void loop() {
  ServoDegree = random(0,180);
  digitalWrite(10, HIGH);
  digitalWrite(13, HIGH);
  Serial.write(ServoDegree);
  Serial.println();
  digitalWrite(10, LOW);
  delay(200);
  digitalWrite(13, LOW);
  delay(1000);

}

Приемник:


int pos;
void setup() {
  pinMode(10,OUTPUT); 
  pinMode(13,OUTPUT);
  digitalWrite(10, LOW);
  digitalWrite(13, LOW);
  Serial.begin(9600);

}

void loop() {
  if(Serial.available() != 0) {
    digitalWrite(13, HIGH);
    pos = Serial.read();

    while(Serial.available()) {
      delay(2);
      Serial.read();
    }
    Serial.println(pos); 
  delay(150);
  digitalWrite(13, LOW);
  }
  

}

 

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

Araris пишет:

ВН, обратите внимание, пин 13 в данном случае ни к чему не подключен, а используется для управления встроенным светодиодом (строка 12 скетча выше).

Ага, спасибо!

На работе "галопом по европам" =)

Araris
Offline
Зарегистрирован: 09.11.2012

Кот Баюн пишет:

Пока порты соедимнены проводками - все ОК.

Эта фраза мне непонятна. 

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Для проверки работы данные с пина TX передатчика  передавал на пин RX приемника посредством провода в обход адаптера RS-485 для локализации места сбоя.

Araris
Offline
Зарегистрирован: 09.11.2012

Когда я осваивал RS-485, был такой казус - на скорости 115200 работало как надо (и по сей день работает), когда пробовал снижать скорость (в том числе и до 9600), связь пропадала. Попробуйте, интереса ради, 115200, а вдруг ?

И ещё попробуйте пакеты подлиннее посылать, вместо 

Serial.write(ServoDegree);
Serial.println();

попосылайте, например,

Serial.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");

и понаблюдайте, будет ли мигать светодиод на приёмнике.

И еще, строка 20 в скетче приёмника мне кажется бессмысленной.

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Cтрока 20 в скетче приемника внесена на предмет посмотреть, что именно прилетело, если оно таки прилетело...
Спасибо за подсказку по скорости... Действительно, казусная ситуация. Курил даташиты к МАХ485 - суть несколько компараторов... По идее, даже без контроллера, если "притянуть" управляющие пины куда нужно - можно "генерировать" данные хоть телеграфным ключом - и на выходе приемника получим исходную последовательность....

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

Кот Баюн пишет:
По идее, даже без контроллера, если "притянуть" управляющие пины куда нужно - можно "генерировать" данные хоть телеграфным ключом - и на выходе приемника получим исходную последовательность....

ну о чем и речь

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

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Телодвижения от того, что я сначала попробовал гонять данные из порта в порт. Для меня это было впервые и вновь. А с адаптером РС-485, ввиду кажущейся простоты и отсутствия постов об утыках - затруднений не ожидал и прицепил к тому, что уже работало до того. В результате получил бабаловку совсем не там, где ожидал.

Кстати, господа знающие коллеги. С терминирующими резисторами на инии, длиной до 100 метров заморачиваться стоит?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Никогда не было проблем с 485. Для проверки плат на одной DE RE замыкаете на массу на второй на +5. А-А В-В . Получите сквозной канал в одну сторону. Точно так же как Rx Tx соединять. Если так прогнать данные получится, то платы исправны. Подключаете замкнутые DE RE к ноге управления направлением передачи.

woofmaster
Offline
Зарегистрирован: 29.11.2016

Тоже сталкивался с данной проблемой, соединение к дуине трехпроводное ( RO,DI, DE и RE вместе соединены), не было передачи данных от дуины, так вот подумал что max485 не успевает переключить режим передача/прием, и вписал delay после подачи сигнала на соответствующую ногу.

DE/RE на третьей ноге.
digitalWrite(3,HIGH);
delay(35); //запас, если сообщение длинное
Serial.print("message");
delay(35);
digitalWrite(3,LOW);

Можете еще принудительно de/re подтянуть к земле, и коснутся пальцем до контакта A или B, светодиод приема на плате должен начать тускло гореть, если так, то max485 целая, ну точнее ее приемник

nik182
Offline
Зарегистрирован: 04.05.2015

В даташите на микросхему написано что время переключения in-out 30 наносекунд. Как она может не успеть?

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Докладываю, господа, по сути проведенных тестов.

Собрал на макетке простейшую схему. Два RS-485. Один в качестве передатчика, второй - приемник. Управляющие пины притянул соответственно к единице и нулю. На вход передатчика была подана последовательность нулей и единичек, сгенерированная всем известным скетчем "Blink". На выходе приемника исправно заморгал светодиод. Протестировал все наличествующие конвертеры как в роли приемника, так и передатчика. Проблем нет. Сквозной канал должен работать.

Подключаю к портам UART. Из 10 имеющихся конвертеров 2 заработали на скорости 115200, 9600, 14400 и 57600.

Для исключения возможных задержек на переключение режима "прием-передача", упомянутых несколькими постами выше - управляющие пины опять-таки "вручную" притянул к нужным потенциалам.

В какую сторону думать? Играться с параметрами линии?

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Пробовал посылать пакеты подлиннее, как рекомендовал уважаемый Araris. Без эффекта.

 

 

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Всем откликнувшимся спасибо. Проблема решена.

Проблема заключалась в китайском дядюшке Ляо.

После двадцатилетнего простоя был извлечен с антресолей старый добрый С1-94. Начал отслеживать сигналы на шине и сравнивать с указанными в даташите. Не хватало 0,12-0,22 вольта для переключения компаратора. Соответственно, сингал был выдан в двухпроводную шину, но оттуда не снят. На низких частотах переключение происходило уверенно. А когда пошли крутые фронты при передаче данных по UART - на этапе трансляции в ТТЛ - сигнал потерялся.

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

Еще раз всем спасибо.

 

Araris
Offline
Зарегистрирован: 09.11.2012

Мои поздравления )) Купание в горячем спирте - способствует !