Проблема со связью RS485

Я пытаюсь установить связь RS485 между Arduino Mega и Arduino UNO, как указано в следующей ссылке:

https://www.engineersgarage.com/arduino /rs485-связь-между-ардуино-мега-и-ардуино-про-мини

Но теперь моя проблема заключается в том, что мастер, т.е. Arduino Mega, ничего не печатает на последовательном мониторе.

Пожалуйста, помогите мне решить эту проблему, попытки уже неделю не увенчались успехом.


Сэр Питер Пол Кифер,

Прикрепляю настройку схемы

Мастер-код/Мегакод

void setup() 
{  
  //Использование порта Serial1
  Serial1.begin(9600);
  Serial.begin(9600);

  //DE/RE Управляющий вывод RS-485
  pinMode(8, OUTPUT);
}

void loop() 
{
  char getdata='m';

  //DE/RE=HIGH Передача включена M1
  digitalWrite(8,HIGH);

  // Запись '9' и получение данных из Pro Mini
  Serial1.print('9');

  //DE/RE=LOW Получение разрешено M1
  digitalWrite(8,LOW);
  delay(1000);

  //Если серийные данные доступны
  if(Serial1.available())
  { 
    while( Serial1.available() && getdata!='d' )
    { 
      getdata=Serial1.read();
      Serial.print(getdata);
    }

    Serial.println("");
  }
}

Подчиненный код

void setup() 
{
  //Serial1.begin(9600);//Раскомментировать для Arduino Lenardo
  Serial.begin(9600);
  //while(!Serial1);//Раскомментировать для Arduino Lenardo

  // Светодиод подключен
  pinMode(13, OUTPUT);

  //DE/RE Управляющий вывод RS-485
  pinMode(8, OUTPUT);
}

void loop() 
{
  // поместите сюда ваш основной код для многократного запуска:
  char getdata='c';

  //Светодиод выключен
  digitalWrite(13,LOW);
  //DE/RE=LOW Получение разрешено
  digitalWrite(8,LOW);

  if(Serial.available())
  {
    getdata=Serial.read();
  }

  if(getdata=='9')
  {
     //DE/RE=HIGH Передача включена
     digitalWrite(8,HIGH);

     Serial.print("AcruxTek");
     Serial.print("Isld");
  }

  delay(2000);
  // Светодиод горит
  digitalWrite(13,HIGH);
  delay(2000);
}

Я подключил заземление преобразователя RS485 к заземлению Arduino, а также сделал общее заземление между цепями, но выходного сигнала все равно нет. Я использовал тот же код, ничего не изменилось.. за исключением одного: в примере используется arduino pro mini, но я использовал arduino uno в качестве ведомого

, 👍-1

Обсуждение

Извини. Ссылка не работает. И вы никак не обозначили свою проблему. Мы не можем помочь вам узнать ваши настройки. Просто показать, как это сделали другие, не дает нам ни малейшего намека на то, что вы сделали. Итак, как мы можем помочь? Я проголосовал за вас, потому что это похоже на рекламу страницы сделай сам, и, конечно, я могу ошибаться. Отредактируйте свой вопрос, предоставьте нам информацию о вашей собственной настройке, возможно, схему (даже нарисованную от руки) и ваш код, который вы написали до сих пор. Тогда я удалю свой минус и, возможно, даже смогу вам помочь., @Peter Paul Kiefer

О, я видел, что вы включили закрывающую скобку в URL-адрес. Если удалить, ссылка работает. Я верну свой отрицательный голос. Но вы должны дать нам обзор вашего собственного проекта, мы не можем выяснить, в чем ваша проблема, если мы изучаем рабочий проект у кого-то другого., @Peter Paul Kiefer

Я пытаюсь прочитать данные регистра счетчика энергии через RS485. Как указано в моей предыдущей ссылке, для этой цели я использую преобразователь RS485 в TTL. Мне не удалось получить данные от счетчика энергии. поэтому я подумал о том, чтобы попробовать базовый пример связи RS485 между ARduino Mega и Arduino Uno с использованием этого преобразователя. КАК я сказал, последовательный монитор ничего не печатает, @priya

Да, я понял, что у вас есть проблемы с подключением двух Arduino по каналу RS485 с использованием упомянутых интерфейсов/адаптеров. Но как _you_ сделал это? Пожалуйста, дайте описание того, что _you_ сделал. Проект по ссылке должен работать, так что вы сделали иначе. Что у вас с программным кодом. У тебя в нем опечатка. Как ты соединял детали? Я не знаю, потому что я не могу заглянуть в него. Я бы очень хотел вам помочь, но без информации не могу. СОВЕТ: Было бы лучше отредактировать ваш вопрос с новой информацией., @Peter Paul Kiefer

Если вы сомневаетесь в правильности связанного кода. Я попробовал это вчера вечером, и это сработало. Но вы могли неправильно интерпретировать схемы. Они не очень понятны и определенно не предназначены для начинающих. Вот почему я попросил вас показать мне вашу установку. Возможно, вам лучше преуспеть в другом проекте, это ясно объяснено. https://www.instructables.com/id/RS485-Serial-Communication-Between-Arduino-Mega-an. Но у меня нет опыта работы с этой программой Visuino. Я надеюсь, что он сгенерирует код C/C++, чтобы вы могли его увидеть. Или код не нужен?, @Peter Paul Kiefer

**Пожалуйста, укажите дополнительную информацию в своем вопросе, вы можете [редактировать] ее! Не пишите ответ, я просто нашел его случайно. ** И, как сказал PeterPaulKiefer, нам нужно увидеть ваш исходный код или примечание о том, что вы используете связанный код без изменений. Вы подключили GND между Arduinos и модулями RS485?, @the busybee

Я подключил заземление преобразователя RS485 к заземлению Arduino, а также сделал общее заземление между цепями, но выходного сигнала все равно не было. Я использовал тот же код, ничего не изменилось... за исключением одного: в примере используется arduino pro mini, но я использовал arduino uno в качестве ведомого, @priya


2 ответа


1

Я думаю, что в коде инженерного гаража могут быть две проблемы. Параметр функции delay() в обоих кодах не совпадает. И еще одна вещь может вызвать проблему: «Последовательный аппаратный серийный номер монитора Arduino Serial уже подключен к другой микросхеме преобразователя usb-serial, которую вы используете для загрузки кода, поэтому вы не можете использовать этот последовательный порт для rs-485. Таким образом, используя software serial Arduino pro -mini - безопасный вариант. Наконец, вам нужно подключить программное обеспечение Serial pins с преобразователем RS-485. Я немного изменил код и прикрепил его к настоящему документу.

Код Arduino Mega

void setup() 
{ 
  Serial1.begin(9600);//Использование порта Serial1
  Serial.begin(9600);
  pinMode(8, OUTPUT);//DE/RE Управляющий вывод RS-485
}

void loop()
{
  digitalWrite(8,HIGH);//DE/RE=HIGH Передача разрешена M1
  Serial1.print('9');//Запись '9' и получение данных из Pro Mini




  int timeOut = 0;
  digitalWrite(8,LOW);//DE/RE=LOW Включение приема
  while(!Serial1.available() && timeOut < 5000)
  {
    delay(1);
    timeOut++; // ждем 5 секунд, чтобы получить ответ от ведомого
  }
  String response = Serial1.readString();
  Serial.println(response);
}

Код Arduino Pro-Mini

#include <SoftwareSerial.h>
#define RS485_RX 2
#define RS485_TX 3
SoftwareSerial mySerial(RS485_RX,RS485_TX);//Создание объекта

void setup() 
{ 
  //Serial1.begin(9600);//Раскомментировать для Arduino Lenardo
  Serial.begin(9600);
  mySerial.begin(9600);
  //while(!Serial1);//Раскомментировать для Arduino Lenardo

  pinMode(13, OUTPUT);//светодиод подключен
  pinMode(8, OUTPUT);//DE/RE Управляющий вывод RS-485
}

void loop() 
{
  digitalWrite(13,LOW);//светодиод выключен
  digitalWrite(8,LOW);//DE/RE=LOW Включение приема

  while(!mySerial.available())
  {
    delay(1);
  }

  String res = mySerial.readString();
  if (res == "9")
  {
     digitalWrite(8,HIGH);//DE/RE=HIGH Передача разрешена
     mySerial.print("AcruxTek");
     mySerial.print("Isld");
  }
  digitalWrite(13,HIGH);//светодиод выключен
}
,

Спасибо за ваш ответ, сэр, я обязательно попробую ваши предложения и сообщу вам о результатах., @priya

Сэр, я попробовал ваш код, но в мастере нет вывода, т.е. мега серийный монитор, @priya


1

На картинке не совсем понятно, но кажется, что два адаптера не имеют ничего общего. т.е. вы должны соединить контакт заземления (GND) одного адаптера с контактом GND другого адаптера. Но не удаляйте соединение между контактами GND и контактами GND Arduino.

Я также предполагаю, что мегаадаптер питается от 3,3 В, а УНО-адаптер питается от 5 В (или 3,3ВИ не видно). Это может вызвать проблемы, поскольку микросхеме MAX485 требуется источник питания 5 В.

ИЗМЕНИТЬ:

Извините за второй взгляд на пилу, мега подает 5 В. Так что, возможно, вам нужно только подключить GND адаптеров, чтобы решить вашу проблему.

РЕДАКТИРОВАНИЕ 2:

Я предполагаю, что маленький желтый провод перед обоими адаптерами соединяет их контакты DE. Контакт DE каждого адаптера также подключен к соответствующему контакту 8 Arduino. Поэтому не имеет значения, какой Arduino запрашивает переключение адаптера в режим отправки. Оба адаптера отправляют. Насколько я знаю, адаптер работает только в полудуплексном режиме, вы должны определить направление потока данных. Если один адаптер находится в режиме отправки, другой должен быть в режиме приема.

Возможно также, что пины DE и RE каждого адаптера связаны. Но мне это тоже кажется странным. При этом я бы сказал, что вы настраиваете один адаптер как в режиме приема, так и в режиме отправки, а другой - ни в одном из них.

РЕДАКТИРОВАНИЕ 3:

Изучив спецификацию MAX485. Я видел, что RE активен LOW, но помечен как RE (что я понял как HIGH active), так что извините, последний абзац моего EDIT 2 — чепуха. Так что, возможно, дело во времени или (что более вероятно) все-таки что-то не так с проводкой.

РЕДАКТИРОВАНИЕ 4:

На картинке я вижу, что вы подключаете аппаратные контакты tx и rx к адаптеру. Но Software Serial нуждается в собственных выводах. Pin0 и Pin1 подключены к последовательному терминалу ПК через встроенный USB-адаптер Arduino UNO. Вот почему вам нужно программное последовательное решение на Arduino. Вам нужен второй последовательный интерфейс, а в UNO есть только один из них, который уже используется для подключения к ПК (программирование и последовательный монитор).

В коде я не вижу инициализации последовательного порта программного обеспечения. Это также необходимо:

#include <SoftwareSerial.h>

const byte rxPin = 2;
const byte txPin = 3;

// устанавливаем новый последовательный объект
SoftwareSerial mySerial (rxPin, txPin);
,

@priya Я отклонил ваши правки моего Ответа, потому что думаю, это может запутать читателей. Я добавил текст к этому комментарию: «В соответствии с вашим предложением я подключил контакт RE к контакту 9 Arduino для плат MEGA и UNO и установил логический уровень. Но все еще нет выхода. Можете ли вы предложить какой-либо тест, который можно выполнить, чтобы убедиться преобразователи RS485 в рабочем состоянии или повреждены?», @Peter Paul Kiefer

Я отформатировал ваш код, чтобы лучше его читать. Части кода отсутствуют, должна быть строка «SoftwareSerial Serial1 (rxPin, txPin)» Ой, подождите... На картинке я вижу, что вы подключаете аппаратные контакты tx и rx к адаптеру. Но Software Serial нуждается в собственных выводах. Другие подключены к последовательному терминалу ПК. Я отредактирую свой ответ., @Peter Paul Kiefer

Сэр, я попробовал код, предоставленный Shuvangkar Shuvo, который использует software serial, но безуспешно., @priya

Вы повторно подключили контакты DI и RO адаптера к контактам 2 и 3 UNO? На картинке вы использовали неправильные контакты (pin0 и pin1) UNO., @Peter Paul Kiefer

Да, сэр, я подключил контакт DI к контакту 3 и контакт RO к контакту 2 Arduino UNO., @priya

Нет, это должно быть **DI(TX) <-> Pin2** и **RO(RX) <-> Pin3** для Arduino UNO. И **DI(TX) <-> TX1 (Pin19?)** и **RO(RX) <-> RX1 (Pin18?)** для mega., @Peter Paul Kiefer

Затем мне нужно поменять местами соединения TX и RX платы Uno. А вот для Мегаборда небольшая путаница в подключении. У меня мегаплата, сделанная в Китае. Если мы посмотрим на контакты TX1 и RX1, то увидим разницу, что правильно??, @priya

Прилагаю ссылку на обе платы Mega (итальянская плата) - https://www.elexp.com/media/catalog/product/cache/75eed2686e01eb22cb4050b2f40ddf97/0/1/01ARD000067.jpg Mega (китайская плата) - http:// 1.bp.blogspot.com/-VsoefcyjVzI/VW7oXCHCnaI/AAAAAAAAACM/R-0kdrViX_E/s1600/Clone%2BArduino%2BMega%2B2560.JPG. Пожалуйста, дайте мне сейчас, если моя плата нормальная. Пожалуйста, обратите внимание, что есть разница в контактном номере для порта Serial1., @priya

Забавно. Они перевернули пины. Но я надеюсь, что они просто назвали это ложным, я не знаю. Если метки правильные, то у программы будут проблемы. Предопределенные аппаратные сериалы, например Serial1 на Mega, привязаны к контактам 18 и 19 для TX и RX, а не к контактам 19 и 18 для TX и RX. У меня нет китайского клона и нет опыта работы с ними. Но если вы хотите быть уверенным, вы можете использовать второй порт и Serial2 в своей программе. Контакты порта 2 должны быть одинаковыми., @Peter Paul Kiefer

Я поменял местами контакты Arduino Uno RX и TX в соответствии с приведенными выше предложениями, а также я использую Serial2 в Arduino Mega. Светодиод RX на MEGA мигает, но последовательный монитор ничего не печатает., @priya

@priya Посмотрите, как я редактировала свой ответ каждый раз, когда у меня было что-то новое. Пожалуйста, если вы что-то изменили в настройках, добавьте новый абзац к вашему вопросу. Добавьте новый код и изображение вашей новой установки. Я не могу сказать, что случилось, если я не вижу, что вы сделали. И на картинке должна быть сцена сверху, чтобы я действительно мог видеть проводку и маркировку контактов., @Peter Paul Kiefer

Сэр, я все еще не преуспел в тестировании RS485. Пожалуйста, помогите мне, @priya