В этом обучающем материале мы рассмотрим процесс обмена информацией между двумя платами Arduino посредством протокола RS485 для последовательной передачи данных (Modbus RTU). Поскольку у Arduino отсутствуют периферийные устройства для связи по Modbus, мы будем использовать модуль RS485 на MAX485 для сопряжения двух Arduino.
Мы используем схему связи RS485 в конфигурации «ведущий-ведомый». В качестве примера разработаем проект, который включает и выключает светодиод, подключенный ко второй Arduino, отправляя определенные команды через модуль RS485 с первой Arduino.
Что такое протокол Modbus?
Modbus — один из самых популярных протоколов для передачи данных, который уже много лет используется в разных отраслях автоматизации. Впервые он был представлен компанией Modicon (ныне Schneider Electric) в 1979 году для работы с их программируемыми логическими контроллерами (ПЛК). Сейчас он используется в разных устройствах и системах промышленной автоматизации в сетях различных типов. В промышленной автоматизации есть несколько типов протоколов Modbus, среди которых наиболее популярны следующие:
- Modbus RTU (удаленный терминальный блок): это наиболее распространенная реализация Modbus, которая используется для последовательной передачи данных.
- Modbus ASCII: он также используется при последовательной передаче данных и использует ASCII символы для протокольной связи.
- Modbus TCP: используется для связи по сетевому протоколу TCP/IP.
- Modbus Plus: является собственностью Schneider Electric и, в отличие от других вариантов, поддерживает одноранговую связь между несколькими клиентами.
Что такое RS485?
Modbus обменивается данными через различные типы физических носителей, а именно:
- RS232: протокол последовательной связи
- RS485: протокол последовательной связи
- RS422: протокол последовательной связи
- Ethernet: технология LAN (локальная сеть)
RS485 — это асинхронный полудуплексный протокол последовательной связи, который обеспечивает связь между устройствами по принципу «ведущий-ведомый». К одной линии можно подключить максимум 32 устройства.
Большая часть отрасли применяет протокол RS485 вместо RS232, потому что он предлагает большие расстояния (до 1200 метров), высокую скорость передачи данных (до 30 Мбит/с) и возможность подключения нескольких устройств к одной сети с использованием всего двух проводов.
MAX485 — это маломощный приемопередатчик для сопряжения TTL и RS485. Для работы этого модуля необходимо напряжение 5 вольт. Работает он с 5-вольтовой логикой, поэтому его легко можно подключить к микроконтроллерам, таким как Arduino.
Основные характеристики MAX485:
- Позволяет передавать данные на большие расстояния — до 1200 метров.
- Поддерживает высокую скорость передачи данных — до 30 Мбит в секунду.
- Позволяет подключить до 32 устройств.
- Имеет низкое энергопотребление.
- Трансивер с ограниченной скоростью нарастания сигнала.
- Встроенный 2-х контактный разъем с шагом в 5,08 миллиметров для подключения к RS-485 сети.
Распиновка модуля MAX485
Связь RS485 между двумя Arduino с использованием MAX485
В этой части статьи мы рассмотрим, как работает RS485 связь, реализовав простой пример. Для этого проекта мы используем две платы Arduino Uno. Одна используется как ведущая, другая — как ведомая. Мы передадим команду «1» или «0» от ведущего к ведомому. Ведомое устройство получит и проверит это значение.
Если значение равно «1», то ведомое устройство включит светодиод и выведет «LED ON» в монитор последовательного порта Arduino IDE, а если значение равно «0», то ведомое устройство выключит светодиод и напечатает «LED OFF».
Принципиальная схема
В этом разделе статьи мы покажем, как подключить MAX485 к Arduino Uno, используя принципиальную схему подключения и таблицу описания контактов.
Описание подключения между Arduino и MAX485 (Ведущее устройство)
Мы также подключим кнопку к контакту 2 платы Arduino.
Описание подключения между Arduino и MAX485 (Ведомое устройство)
Также подключим красный светодиод к контакту 8 Arduino через резистор 100 Ом.
Код связи Arduino и RS485
Мы написали два скетча для Arduino. Один для ведущего, другой для ведомого. Ведущий отправляет команду, а ведомый реагирует в соответствии с полученной командой.
Код Arduino для ведущего устройства
Откройте среду Arduino IDE, перейдите в меню «Файл» > «Создать» и создайте новый скетч. Скопируйте приведенный ниже код и вставьте его в новый скетч Arduino. Затем сохраните файл.
В данном скетче мы отправляем команду «0» или «1» на ведомое устройство Arduino.
// Инициализация состояния кнопки в 0 bool button_state=0; void setup() { // поместите сюда свой код настройки, чтобы запустить его один раз: // скорость передачи данных по умолчанию для последовательного интерфейса Arduino Serial.begin(9600); // DE,RE Управляющий пин RS-485 pinMode(7, HIGH); // вывод 2 устанавливается как входной с PULL-UP для кнопки pinMode(2, INPUT_PULLUP); // DE,RE = HIGH, RS485 Transmit Enabled digitalWrite(7,HIGH); } void loop() { // поместите сюда свой основной код, который будет выполняться многократно: // проверить, нажата кнопка или нет. //Если функция digitalRead() возвращает 0, то кнопка нажата. //потому что мы используем подтяжку входа для вывода 2 if(digitalRead(2) == 0){ //выжидаем 300 мс для предотвращения дребезга delay(300); // каждый раз при нажатии кнопки состояние кнопки будет менять свое значение с 0 на 1 или с 1 на 0 button_state = !button_state; // выводим значение на последовательный монитор Serial.print(button_state); } }
Код Arduino для ведомого устройства
Еще раз откройте Arduino IDE и создайте новый скетч. Вставьте в него следующий код и сохраните:
// Инициализация состояния светодиода bool led_status; void setup() { // Скорость передачи данных по умолчанию для последовательного обмена данными с Arduino Serial.begin(9600); //DE,RE Управляющий пин RS-485 pinMode(7, OUTPUT); //Вывод 8 установлен как выход для светодиода pinMode(8, OUTPUT); //DE,RE = 0, прием по RS485 разрешен digitalWrite(7,LOW); } void loop() { // ожидание, пока все байты не будут получены из буфера данных while(Serial.available() > 0){ // берем целочисленное значение из буфера (0 или 1) led_status = Serial.parseInt(); // задержка на 10 миллисекунд delay(10); // проверяем, равна ли команда 1 if(led_status == 1){ // высокий уровень на выводе светодиода означает, что светодиод включен digitalWrite(8,HIGH); Serial.println("Светодиод включен"); } // проверка наличия команды "0" if(led_status == 0){ // низкий уровень на выводе светодиода означает, что светодиод выключен digitalWrite(8,LOW); Serial.println("Светодиод выключен"); } } }
В этом скетче ведомое устройство Arduino принимает команду от ведущего с помощью модуля MAX485 через протокол RS488. Подключите восьмой контакт Arduino к светодиоду. Если ведомое получает команду ‘1’, светодиод включается и выводит ‘LED ON’ в мониторе последовательного порта Arduino IDE, иначе, если оно получает ‘0’, светодиод выключается и выводится ‘LED OFF’.
Заключение
Протокол последовательной передачи данных RS485 широко используется в промышленности. В этой статье мы рассмотрели основы протокола RS485 и осуществили его связь с Arduino через модуль TTL-RS485. В скором времени будут опубликованы дополнительные статьи на эту тему.