Проблема со связью 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 в качестве ведомого
@priya, 👍-1
Обсуждение2 ответа
Я думаю, что в коде инженерного гаража могут быть две проблемы. Параметр функции 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
На картинке не совсем понятно, но кажется, что два адаптера не имеют ничего общего. т.е. вы должны соединить контакт заземления (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
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Связь Arduino master/slave с использованием RS485
- Подключение нескольких RS485 вместе
- Различия между двумя распространенными модулями RS485-TTL
- Проблема связи Arduino UNO и RS485
- Связь Arduino Uno и ESP32 с использованием RS485
- Аппаратное управление последовательным потоком ESP32 и полная поддержка espressif/arduino-esp32
Извини. Ссылка не работает. И вы никак не обозначили свою проблему. Мы не можем помочь вам узнать ваши настройки. Просто показать, как это сделали другие, не дает нам ни малейшего намека на то, что вы сделали. Итак, как мы можем помочь? Я проголосовал за вас, потому что это похоже на рекламу страницы сделай сам, и, конечно, я могу ошибаться. Отредактируйте свой вопрос, предоставьте нам информацию о вашей собственной настройке, возможно, схему (даже нарисованную от руки) и ваш код, который вы написали до сих пор. Тогда я удалю свой минус и, возможно, даже смогу вам помочь., @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