Урок 26.2 Соединяем две arduino по стандарту RS485
При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.
В этом уроке мы научимся соединять две arduino по стандарту RS485 через аппаратную шину UART.
Преимущества:
- Простота реализации.
- Реализуется возможность подключения более двух arduino.
- Любая arduino на линии связи может работать ведущим и/или ведомым.
- Передача данных осуществляется на большие расстояния (длина линии связи до 1,2 км).
- Не требуется отключать модули от шины UART при загрузке скетча.
Недостатки:
- Связь осуществляется в полудуплексном режиме (одновременно может отправлять данные только одна arduino).
- Используется дополнительный цифровой вывод arduino, для управления конвертирующим модулем.
Нам понадобится:
- Arduino х 2шт.
- LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 2шт.
- Trema Shield х 2шт.
- Эластичная клавиатура 4×4 х 2шт.
- Шлейф «мама-мама» (4 провода) для шины I2С х 2шт.
- Витая пара «мама-мама» (2 провода) — линия связи x 1шт.
- Конвертирующий модуль на базе чипа MAX485 х 2шт.
Для реализации проекта нам необходимо установить библиотеки:
- Библиотека iarduino_KB (для подключения матричных клавиатур).
- Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .
Видео:

Схема подключения:
Подключение LCD дисплея осуществляется к аппаратным выводам шины I2C.
Клавиатура подключается к любым цифровым выводам, в примере используются выводы 2-9.
Конвертирующий модуль подключается к шине UART:
RE (Receiver Enable — разрешение работы приёмника)
Конвертирующий модуль | Arduino |
---|---|
DI (Driver Input — вход передатчика) | TX (transmit — передать) |
RO (Receiver Out — выход приёмника) | RX (receive — получить) |
Vcc (Voltage constant current — напряжение постоянного тока) | Vcc |
GND (GrouND — земля) | GND (GrouND — земля) |
DE (Driver Enable — разрешение работы передатчика) | D10 (Digital — цифровой) |
D10 (Digital — цифровой) |
На рисунке приведён пример подключения двух и более устройств.
Схемы устройства-1, устройства-2, . — идентичны.
Все конвертирующие модули на линии соединяются одноименными выводами: «A» с «A», «B» с «B».
Код программы:
Настройка параметров линии связи:
Конвертирующий модуль только преобразует сигналы TTL в стандарт RS485 и обратно. Параметры линии: скорость передачи данных, количество бит в минимальной посылке, длина стопового бита, проверка на чётность/нечётность, зависят от настроек шины UART, см. раздел «Настройка параметров шины UART» в уроке 26.1.
Настройки шины UART всех arduino подключённых к линии должны быть идентичны!
Модуль RS-485 для Arduino UNO (Описание, схемы, примеры)
Содержание
Введение
Модуль Arduino RS485 , специально разработанный для контроллера Arduino . Модуль может легко преобразовать UART в RS485
Достаточно установить на каждую плату RS485 и протянуть всего два провода!
Вы сможете разворачивать масштабные сети интеллектуальных датчиков, строить системы умного дома или организовывать автоматический полив в большом количестве мест вашего дачного участка.
Никаких ethernet-кабелей. Никаких обжимок и разъёмов 8P8C. Никаких концентраторов. Только два провода, к которым параллельно подключаются все контроллеры. Модуль предоставляет возможность передавать байты данных. Протокол передачи данных предоставляется определить самостоятельно.
Кроме того, по RS485 вы можете общаться со сторонними устройствами, которые поддерживают этот интерфейс.
Спецификация
- Питание модуля: + 5.0V
- Размер модуля: 55 мм x 53 мм
- 16 цифровых портов ввода-вывода (включая интерфейс I2C)
- 6 аналоговых портов ввода-вывода и питания
- Переключатель режимов: работа / программирование
- Переключатель режимов: автоматического / ручного направления передачи (в ручном режиме выбора направления передачи используется пин 2. Установка логической единицы соответствуют направлению на передачу, нуля — на приём.)
- Светодиодный индикатор приемопередатчика
- Стандартный разъем RS485, мини-интерфейс RS485 (PH2.0) и штыревой разъем RS485
- Область для пайки (прототипирования)
- Кнопка сброса
Используемые пины
Управление платой осуществляется через UART. Поэтому занятыми оказываются пины 0 (RX) и 1 (TX), используемые для приёма и передачи данных соответственно.
Кроме того, в ручном режиме выбора направления передачи используется пин 2. Установка логической единицы соответствуют направлению на передачу, нуля — на приём.
Многие Arduino-платы, например Arduino Uno, используют эти пины для загрузки нового скетча. Чтобы интерфейс RS-232 не мешал перепрошивке платы, просто установите предусмотренный на плате переключатель в положение «OFF».
Бывает необходимо одновременно использовать и интерфейс RS-485 и связь с компьютером. В таком случае в качестве управляющего устройства можно использовать Arduino Leonardo, в которой аппаратный UART и интерфейс USB разнесены.
Последовательная связь с помощью RS-485 между Arduino Uno и Arduino Nano
Выбор протокола (интерфейса) связи между микроконтроллером и периферийными устройствами является важной частью встраиваемых систем. От правильности его выбора зависят многие параметры подобной системы: стоимость, скорость передачи данных, максимальное расстояние связи и т.д.
В предыдущих статьях мы изучили использование интерфейса I2C и интерфейса SPI в платах Arduino. В этой же статье мы рассмотрим использование в платах Arduino интерфейса асинхронной последовательной связи RS-485. Основным преимуществом интерфейса RS-485 является большая дистанция связи. Также он обладает хорошей устойчивостью к помехам, благодаря чему находит применение в условиях со сложной (сильно зашумленной) электромагнитной обстановкой.
В данной статье мы рассмотрим обмен данным между двумя платами Arduino с помощью интерфейса RS-485. Мы будем управлять яркостью свечения светодиода, подключенной к ведомой плате Arduino, с ведущей платы Arduino при помощи передачи значений АЦП (аналогово-цифрового преобразования) с помощью модуля RS-485. Для изменения значений АЦП в ведущей плате Arduino мы будем использовать потенциометр 10 кОм.
Принципы работы интерфейса последовательной связи RS-485
RS-485 представляет собой асинхронный интерфейс последовательной связи, не требующий для своей работы импульсов синхронизации. Для передачи двоичных данных от одного устройства к другому интерфейс использует дифференциальный сигнал.
Если следовать определению из википедии, дифференциальный сигнал представляет собой способ электрической передачи информации с помощью двух противофазных сигналов. В данном методе один электрический сигнал передаётся в виде дифференциальной пары сигналов, каждый по своему проводнику, но один представляет инвертированный сигнал другого, противоположный по знаку. Пара проводников может представлять собой витую пару, твинаксиальный кабель или разводиться по печатной плате. Приёмник дифференциального сигнала реагирует на разницу между двумя сигналами, а не на различие между одним проводом и потенциалом земли.
В нашем случае дифференциальный сигнал образуется при помощи использования положительного и отрицательного напряжения 5V. Интерфейс RS-485 обеспечивает полудуплексную связь (Half-Duplex) при использовании 2-х линий (проводов) и полноценную дуплексную связь (Full-Duplex) при использовании 4-х линий (проводов).
Основные особенности данного интерфейса:
- Максимальная скорость передачи данных в интерфейсе RS-485 – 30 Мбит/с.
- Максимальная дистанция связи – 1200 метров, что значительно больше чем в интерфейсе RS-232.
- Основным достоинством интерфейса RS-485 по сравнению с RS-232 является использование нескольких ведомых (multiple slave) при одном ведущем (single master) в то время как RS-232 поддерживает только одного ведомого.
- Максимальное число устройств, которое можно подключить по интерфейсу RS-485 – 32.
- Также к достоинствам интерфейса RS-485 относится хорошая помехоустойчивость вследствие использования дифференциального сигнала.
- RS-485 обеспечивает более высокую скорость передачи по сравнению с интерфейсом I2C.
Использование интерфейса RS-485 в Arduino
Для использования интерфейса RS-485 в плате Arduino мы будем использовать модуль 5V MAX485 TTL to RS485, в основе которого лежит микросхема Maxim MAX485. Модуль является двунаправленным и обеспечивает последовательную связь на расстояние до 1200 метров. В полудуплексном режиме он обеспечивает скорость передачи данных 2,5 Мбит/с.
Модуль 5V MAX485 TTL to RS485 использует питающее напряжение 5V и логический уровень напряжения также 5V, что позволяет без проблем подключать его к платам Arduino.
Данный модуль имеет следующие особенности:
- работает с напряжениями 5V;
- имеет в своем составе чип MAX485;
- отличается низким энергопотреблением;
- всеми его контактами можно управлять с помощью микроконтроллера;
- размеры платы модуля: 44 x 14mm.
Внешний вид модуля RS-485 показан на следующем рисунке.
Назначение контактов (распиновка) модуля RS-485 приведена в следующей таблице.
Название контакта | Назначение контакта |
VCC | 5V |
A | вход/выход линии RS-485 |
B | вход/выход линии RS-485 |
GND | GND (0V) |
R0 | выход приемника (RX pin) |
RE | разрешение работы приемника |
DE | разрешение работы передатчика |
DI | вход передатчика (TX pin) |
Для подключения модуля к платам Arduino (UNO и NANO) мы будем использовать их последовательные порты на контактах 0 (RX) и 1 (TX). Для передачи данных модулю RS-485 мы будем использовать функцию Serial.print(), а для считывания данных из него – функцию Serial.Read() (или аналогичную).
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Плата Arduino Nano (купить на AliExpress).
- MAX485 TTL to RS485 Converter Module (модуль преобразования логики TTL в RS485, купить на AliExpress) – 2 шт.
- Потенциометр 10 кОм (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
В нашем проекте плата Arduino Uno будет использоваться в качестве ведущей, а плата Arduino Nano – в качестве ведомой.
Схема проекта
Схема для последовательной связи с помощью интерфейса RS-485 между платами Arduino Uno и Arduino Nano представлена на следующем рисунке.
В следующей таблице представлены необходимые соединения между платой Arduino Uno (ведущей) и модулем RS-485.
RS-485 | Arduino Uno |
DI | 1 (TX) |
DE RE | 8 |
R0 | 0 (RX) |
VCC | 5V |
GND | GND |
A | к контакту A ведомого RS-485 |
B | к контакту B ведомого RS-485 |
В следующей таблице представлены необходимые соединения между платой Arduino Nano (ведомой) и модулем RS-485.
RS-485 | Arduino Nano |
DI | 1 (TX) |
DE RE | 8 |
R0 | D0 (RX) |
VCC | 5V |
GND | GND |
A | к контакту A ведущего RS-485 |
B | к контакту B ведущего RS-485 |
В следующей таблице представлены необходимые соединения между платой Arduino Nano и ЖК дисплеем 16х2.
ЖК дисплей 16х2 | Arduino Nano |
VSS | GND |
VDD | +5V |
V0 | к центральному контакту потенциометра для управления контрастностью ЖК дисплея |
RS | D2 |
RW | GND |
E | D3 |
D4 | D4 |
D5 | D5 |
D6 | D6 |
D7 | D7 |
A | +5V |
K | GND |
Потенциометр 10 кОм подключен к аналоговому контакту A0 платы Arduino UNO. Светодиод подключен к контакту D10 платы Arduino Nano.
Объяснения программ для плат Arduino UNO и Arduino Nano
Для программирования обоих плат используется среда Arduino IDE. Убедитесь в том, что вы выбрали правильный порт из пункта меню Tools->Port и правильный тип платы из пункта меню Tools->Board.
Полный код программ приведен в конце статьи, здесь же мы рассмотрим их основные фрагменты. Видео, демонтсрирующее работу проекта, также приведено в конце статьи.
Объяснение программы для платы Arduino UNO (ведущей)
В программе для ведущей стороны нам просто необходимо считывать значение напряжения с выхода потенциометра, подключенного к аналоговому контакту A0 и затем с помощью функции SerialWrite передавать их модулю RS-485 через контакты последовательного порта (0,1) платы Arduino UNO.
Инициализация последовательной связи на контактах (0,1) производится с помощью следующей команды: