Содержание
- Обзор
- Технические характеристики
- Подключение к Arduino
- Соединение двух плат Arduino по RS485
- Часто задаваемые вопросы
Обзор интерфейса связи RS485
RS485 – это стандарт проводной связи, обычно переменяется для соединение в сеть различного промышленного оборудования. Для передачи и приёма данных используется одна витая пара проводов. Стандарт RS485 позволяет соединять устройства на расстоянии до 1,2км и подключать до 32 устройств к одной шине. При этом в системе одно устройство является ведущим (master), а остальные устройства ведомые (slave).
Существует большое количество различных типов приемопередатчиков (драйверов) RS-485. Приемопередатчики на основе микросхемы MAX485 (рисунок 1) преобразует сигналы TTL в стандарт RS485 и обратно и используются для подключения устройств на основе Arduino к шине RS485.

Рисунок 1. Модуль TTL – RS485 для Arduino.
Технические характеристики
- Напряжение питания – 5 В;
- Ток потребления – 10 мА;
- Ток потребления в режиме ожидания – 5 мА;
- Скорость передачи данных – до 2,5 Мбит/с;
- Рабочая температура – 0-70 °С;
- Размер – 44x14x20 мм.
Назначение контактов
- Vcc – питание модуля (+ 5В);
- GND – земля;
- DI – вход передатчика;
- RO – выход приёмника;
- DE – разрешение работы передатчика;
- RE – разрешение работы приёмника;
- A – линия передачи;
- B – линия передачи.
Выводы модуля A и B, являются выводами линии передачи данных, при этом все модули на линии соединяются одноименными выводами.
Подключение модуля к плате Arduino
Схема подключения модуля к плате Arduino показана на рисунке 2.

Рисунок 2. Подключение модуля TTL – RS485 к плате Arduino.
Если соединить вход DE со входом RE и подключить их к цифровому выводу Arduino, то подав на него сигнал HIGH модуль будет работать только на передачу, а подав сигнал LOW, только на приём. Для связи Arduino с модулем TTL – RS485 будем использовать программный Serial на контактах 3 и 2.
Подключение Arduino к компьютеру по RS485
Соединим наше устройство (Arduino + модуль TTL – RS485) к компьютеру по шине RS485. Для этого со стороны компьютера потребуется адаптер USB - RS485 (рисунок 3), компьютер видит его как COM-порт.

Рисунок 3. Модуль USB – RS485.
Arduino будем использовать как slave-устройство. При получении команды от компьютера, если первый байт (адрес) равен символу "1", Arduino переходит в режим передачи и отправляет ответ – "OK". Затем Arduino переходит в режим приема.
Arduino-скетч получения данных с компьютера показан в листинге 1.
Листинг 1
// подключение библиотеки #include <SoftwareSerial.h> // создание экземпляра // на RX-3, TX-2 SoftwareSerial RS485Serial(3, 2); // пин подключения выводов RE и DE // конвертирующего модуля (выбор передача/получение) const int PIN_DIR = 6; unsigned long millis1,millis2; // получаемые данные String inputData0 = ""; // признак конца передачи boolean dataComplete0 = false;
void setup(){ pinMode(PIN_DIR,OUTPUT); // в режим приемника digitalWrite(PIN_DIR, LOW); // запуск последовательного порта Serial.begin(9600); // запуск SoftwareSerial RS485Serial.begin(9600); }
void loop() { dataRS485Event0(); if (dataComplete0) { Serial.print(0); if(inputData0.charAt(0) == '1' ) { // в режим передачи данных digitalWrite(PIN_DIR, HIGH); delay(10); RS485Serial.print("OK"); delay(10); // в режим получения данных digitalWrite(PIN_DIR, LOW); }
inputData0 = ""; dataComplete0 = false; } }
// получение данных void dataRS485Event0() { if (RS485Serial.available() > 0) { // получить байт
char c = (char)RS485Serial.read();
// добавить в строку
inputData0 += c; // конец передачи if (с == '*') { dataComplete0 = true; } } }Установим на компьютеру программу терминал com-порта, например ComPortToolkit и попробуем отправлять команды на Arduino. Если первый байт (адрес) – "1", arduino посылает ответ "OK" (см. рис. 4).

Рисунок 4. Отправка-получение данных между компьютером и Arduino по RS485.

Рисунок 5. Схема в сборе.
Соединение двух плат Arduino по RS485
Теперь соединим 2 платы Arduino по RS485. Первая плата Arduino по нажатии кнопки отправляет данные для переключения состояния светодиода, подключенного ко второй плате Arduino.
Нам потребуются следующие компоненты:
- Плата Arduino Uno – 2;
- Плата прототипирования – 1;
- Модуль TTL – RS485 – 2;
- Светодиод – 1;
- Кнопка – 1;
- Резистор 10 кОм – 1;
- Резистор 220 Ом – 1;
- Провода.
Схема соединения представлена на рисунке 6. Соединение приемопередатчиков обязательно по витой паре.

Рисунок 6. Схема соединений двух плат Arduino по протоколу RS485.
Скетч для первой платы представлен в листинге 2.
Листинг 2
// подключение библиотеки SoftwareSerial #include <SoftwareSerial.h> // создание экземпляра SoftwareSerial // на RX-7, TX-6 SoftwareSerial RS485Serial(7, 6); // пин Arduino, к которому подключены выводы RE и DE // конвертирующего модуля (выбор передача/получение) const int PIN_DIR = 10; // Контакт 2 для подключения кнопки const int BTN=12; // предыдущее состояние кнопки boolean prevBTN = 0; // текущее состояние кнопки boolean curBTN = 0; // состояние светодиода boolean ledOn = false;
void setup(){ pinMode(PIN_DIR,OUTPUT); // в режим передатчика digitalWrite(PIN_TX_RX, HIGH); // запуск последовательного порта Serial.begin(9600); // запуск SoftwareSerial RS485Serial.begin(9600); }
void loop() { curBTN = debounce(prevBTN); if (prevBTN == LOW && curBTN == HIGH) // при нажатии { // изменить значение состояния светодиода ledOn = !ledOn; if(ledOn) RS485Serial.println("1=1"); else RS485Serial.println("1=0"); } } prevBTN = curBTN; } // сглаживание дребезга boolean debounce(boolean prev) { boolean cur = digitalRead(BTN); if (prev != cur) {// ждем 5мс delay(5); cur = digitalRead(BTN); return cur; } }Вторая плата Arduino получает строку данных, анализирует их и устанавливает состояние светодиода. Скетч для второй платы представлен в листинге 3.
Листинг 3.
// подключение библиотеки SoftwareSerial #include <SoftwareSerial.h> // создание экземпляра SoftwareSerial // на RX-7, TX-6 SoftwareSerial RS485Serial(7, 6); // пин Arduino, к которому подключены выводы RE и DE // конвертирующего модуля (выбор передача/получение) const int PIN_DIR = 10; unsigned long millis1,millis2; // получаемые данные String inputData0 = ""; // признак конца передачи boolean dataComplete0 = false; // Контакт подключения светодиода const int LED=12; // статус светодиода int stLed=0;
void setup(){ pinMode(PIN_DIR,OUTPUT); // в режим получения данных digitalWrite(PIN_DIR, LOW); // запуск последовательного порта Serial.begin(9600); // запуск SoftwareSerial RS485Serial.begin(9600); }
void loop() { dataRS485Event0();
if (dataComplete0) { Serial.print(inputData0); if(inputData0.charAt(0) == '1' && inputData0.charAt(1) == '=') { if(inputData0.charAt(2) == '0') stLed=0; else stLed=1; digitalWrite(LED,stLled); }
inputData0 = ""; dataComplete0 = false; } }
// получение данных void dataRS485Event0() { if (RS485Serial.available() > 0) { // получить байт char c = (char)RS485Serial.read(); // добавить в строку inputData0 += c; // конец передачи if (с == '*') { dataComplete0 = true; } } }Загружаем скетчи на платы и проверяем работоспособность.

Рисунок 7. Схема в сборе.
Часто задаваемые вопросы
1. Нет связи между платами Arduino.
- Проверьте питание плат Arduino и модулей TTL – RS485.
- Проверьте правильность подключения плат Arduino и модулей TTL – RS485.
- Проверьте, чтобы соединение приемопередатчиков было обязательно по витой паре.
- Проверьте, что одно из устройств на шине RS485 должно быть master, остальные – slave.