Обзор конвертера TTL-RS485
В предыдущей статье рассказывал о протоколе связи I2C используемый в дисплеях LCD1602, OLED и во многих других устройств. Сегодня расскажу о другом протоколе RS485, который использует асинхронную передачу данных и преимуществом RS-485, является возможность передачи данных на большие расстояния. Данный протокол часто используется промышленности.
В этой статье приведу пример организации связи по протоколу RS485 и использовании недорогих модулей на базе микросхемы MAX485.
Технические параметры.
► Рабочее напряжение: 5 В
► Потребляемый ток: < 10 мА
► Ток потребляемый в режиме ожидания: < 5 мА
► Частота передачи данных: <2,5 Мбит/с
► Габариты: 44x14x20 мм
Немного о RS485
RS485 — это протокол асинхронной последовательной связи, который не требует тактового сигнала, по сути это предок протоколы RS232. Максимальное расстояние для передачи данных составляет 1200 метров, конечно ее можно увеличить с помощью специальных усилителей. Но при больших расстояниях скорость передачи будет около 60 кб/с. В качестве линии используется витая пара (два провода скрученные с друг другом).
Так же, к одной линии можно подключить до 32 устройств.
Общие сведения о модуль RS485
Модуль собран на небольшой плате, габариты которой всего 44 мм х 20 мм, основная микросхема это MAX485, которая преобразует сигнал TTL (необходимый для Arduino) в стандарт RS485 и обратно. Так же, кроме микросхемы MAX485 на модуле установлена минимальная электрическая обвязка.
Принципиальная схема модуля показана на рисунке ниже.
Назначение контактов:
► VCC и GND — питание модуля
► B — Вход/выход линии RS-485
► A — Вход/выход линии RS-485
► DI — Вход передатчика (TX)
► DE — Разрешение работы передатчика
► RE — Разрешение работы приёмника
► RO — Выход приемника (RX)
Переключение модуля на прием и передачу осуществляется с помощью выводов DE и RE. Если их замкнуть между собой и подключить к любому цифровому выводу arduino, то подав на него «1» модуль будет работать только на передачу, а подав «0», только на приём.
Подключение Arduino к RS485
Необходимые детали:
► Arduino UNO R3 x 2 шт.
► Конвертер TTL-RS485 на чипе MAX485 x 2 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.
Подключение.
В примере используем две Arduino UNO и два модуля RS485. Сначала подключаем Arduino (Master) к модулю RS485, вывод 10 (Arduino) к RO (RS485), вывод 11 (Arduino) к RI (RS485) и вывод 3 подключаем к контактам RE, DE (RS485). Затем подключаем питание VCC и GND и конечно два провода в шине RS485, «A» к «A», «B» к «B». Аналогично собираем и второю Arduino.
Программа.
В примере, используем библиотеку «SoftwareSerial» которая входит в среду разработки Arduino IDE. Библиотеку используем только для удобства, так как если воспользоватся выводами 0 и 1, нам придется каждый раз отключать модуль MAX485 при загрузке скетча. Сама программа не сложная, мы одновременно подключим две Arduino на один компьютер и запустим две среды разработки Arduino IDE. Открыв мониторинг порта мы отправим команды с Master Arduino на Slave Arduino и обратно.
Программа для Master
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial SoftwareSerial Master(10, 11); // Указываем выводы RO и RI char val; // Создаем переменную val int DE_RE=4; // Указываем выводы DE и RE void setup() { Serial.begin(19200); // Открываем последовательную связь Serial.println("Master!"); // Отправка текста Master.begin(19200); // Открываем последовательную связь pinMode(DE_RE,OUTPUT); // Задаем DE_RE как выход digitalWrite(DE_RE,LOW); // Устанавливаем DE_RE в LOW } void loop() { while (Serial.available()) { // Проверяем,поступили ли данные digitalWrite(DE_RE,HIGH); // Устанавливаем DE_RE в HIGH val = Serial.read(); // Копируем данные val Master.write(val); // Отправка данных } digitalWrite(DE_RE,LOW); // Устанавливаем DE_RE в LOW while(Master.available()) { // Проверяем,поступили ли данные val = Master.read(); // Копируем данные val Serial.write(val); // Отправка данных } } |
Программа для Slave
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial SoftwareSerial Slave(10, 11); // Указываем выводы RO и RI char val; // Создаем переменную val int DE_RE=4; // Указываем выводы DE и RE void setup() { Serial.begin(19200); // Открываем последовательную связь Serial.println("Slave!"); // Отправка текста Slave.begin(19200); // Открываем последовательную связь pinMode(DE_RE,OUTPUT); // Задаем DE_RE как выход digitalWrite(DE_RE,LOW); // Устанавливаем DE_RE в LOW } void loop() { while (Serial.available()) { // Проверяем,поступили ли данные digitalWrite(DE_RE,HIGH); // Устанавливаем DE_RE в HIGH val = Serial.read(); // Копируем данные val Slave.write(val); // Отправка данных } digitalWrite(DE_RE,LOW); // Устанавливаем DE_RE в LOW while(Slave.available()) { // Проверяем,поступили ли данные val = Slave.read(); // Копируем данные val Serial.write(val); // Отправка данных } } |
Откройте мониторинг порта в обеих arduino IDE и
Описание скетча.
Опишу только программу Master, так как она немного отличается от Slave. Первым делом мы подключаем библиотеку SoftwareSerial, затем указываем к каким выводам будет подключен модуль RS485. Далее создаем переменную val для хранения передаваемых данных и создаем еще одну переменную DE_RE, для переключения модуля на с передающего в принимаемого.
1 2 3 4 |
#include <SoftwareSerial.h> SoftwareSerial Master(10, 11); char val; int DE_RE=2; |
В setup, мы открываем последовательную связь между ПК и Arduino на скорости 19200, затем отправляем текст Master!. Далее мы открываем последовательную между Arduino и RS-485. Следующей командой pinMode(DE_RE,OUTPUT) мы задаем вывод как выход и следующей командой digitalWrite(DE_RE,LOW) устанавливаем ее в «0», тем самым включив его на прием данных.
1 2 3 4 5 |
Serial.begin(19200); Serial.println("Master!"); Master.begin(19200);а pinMode(DE_RE,OUTPUT); digitalWrite(DE_RE,LOW); |
В loop, мы проверяем, поступили ли данные с последовательного порта компьютера, если данные есть, мы переводом в режим передачи данных, командой digitalWrite(DE_RE,HIGH). Далее копируем данные в переменную val и передаем в последовательный порт на RS485, командой Master.write(val).
1 2 3 4 5 |
while (Serial.available()) { digitalWrite(DE_RE,HIGH); val = Serial.read(); Master.write(val); } |
Если данных от компьютера не поступало, переводим модуль RS485 на прием данных, командой digitalWrite(DE_RE,LOW). Далее проверяем, поступают данные в последовательный порт от модуля RS-485, если да то копируем данные в переменную val и отправляем в последовательный порт компьютера.
1 2 3 4 |
digitalWrite(DE_RE,LOW); while(Master.available()) { val = Master.read(); Serial.write(val); |
Заключение:
Данный модуль подойдет тем кому необходимо временно организовать связь по протоколу RS-485 для тестирования. Не рекомендую использовать его постоянно, так как в нем нет оптической развязки по шине RS485, если ударит молния или кто то замкнет шину на фазу, сгорит и модуль и arduino.
Купить на Aliexpress
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Конвертер TTL-RS485 на чипе MAX485
Комплект проводов DuPont, 2,54 мм, 20 см
Купить в Самаре и области
Контроллер Arduino UNO R3 на CH340G
Контроллер Arduino UNO R3 на Atmega16U2
Конвертер TTL-RS485 на чипе MAX485
Провода DuPont, 2,54 мм, 20 см
а чем же они отличаются!? «мастер» и «слэйв»?
Здравствуйте, мастер передает данные а слэйв получает их… То есть данные передаются только в одну сторону.
Сергей, поясните пожалуйста про «► DI — Вход передатчика (TX) и ► RO — Выход приемника (RX) «. Я вижу эти же данные в даташите на MAX485. Почему так подписывают данные контакты? Ведь подключаются они к контактам Arduino TX и RX соответственно.Тогда в назначении контактов платы конвертора было бы корректно указать DI (Rx) и RO (Tx)?
Здравствуйте, Георгий.
Можно и DI (Rx) и RO (Tx).
Здравствуйте Сергей !
Можно ли подключить аналогично к линии RS485 через модули RS485-TTL еще три Ардуино и как это сделать ?
Я попробовал, не получилось — модули не отвечали.
С уважением Геннадий.
Сергей, можно ли подключить к Ардуино устройство, которое выдаёт данные со скоростью 921600. Поможет ли при этом модуль RS485-TTL.
А у меня почему-то работает только если на RE высокий уровень или вообще RE и DE висит в воздухе. А как по вашей схеме ничего не работает. Встречали такое?