RS-485: проводная сеть из нескольких устройств на модулях MAX485

RS-485 позволяет связать по одной паре проводов десятки устройств на расстоянии до 1200 м. Разбираем принцип работы, модуль MAX485 и пример сети из трёх Arduino.
Чего не хватает обычному UART
UART в аппаратной реализации RS-232 — простой и универсальный интерфейс: двух проводов достаточно, чтобы связать контроллер с датчиком, модемом, другим контроллером или компьютером. Но у него два существенных ограничения. Первое — малая дальность: даже с хорошо экранированным кабелем уверенная связь возможна лишь на нескольких метрах, а дальше надёжность и скорость быстро падают. Второе — схема точка-точка, то есть соединить можно только два устройства. RS-485 снимает оба ограничения, оставаясь для конечного устройства тем же привычным UART.
Микросхема MAX485 и дифференциальная шина
Чаще всего интерфейс реализуют на микросхемах семейства MAX485. В нём десятки разновидностей, различающихся максимальным числом устройств, скоростью, дальностью, дуплексным или полудуплексным режимом. Самая известная — собственно MAX485.

| Напряжение питания | 5 В |
| Ток потребления | 0,3 мА |
| Дальность передачи | до 1200 м |
| Скорость на 1200 м | 62,5 кбит/с |
| Скорость на 10 м | до 10 000 кбит/с |
| Трансиверов на шине | до 32 |
| Терминальный резистор | 120 Ом |
Микросхема одной стороной подключается к аппаратному или программному порту UART контроллера, другой — к шине. Шина состоит из двух проводов, A и B, которые соединяют одноимённые выводы всех трансиверов. Сигнал подаётся на них одновременно, но в противофазе: когда на одном единица, на другом ноль. Так увеличивается разность потенциалов и достигается устойчивость к синфазным помехам, которые наводятся на оба провода сразу и разность не меняют. Чтобы помеха действовала на провода как можно более одинаково, их свивают между собой.


Готовый модуль и его выводы
Микросхеме нужна обвязка из нескольких резисторов, а на концах линии — терминальный резистор 120 Ом, гасящий отражения. Всё это уже есть на готовом модуле на базе MAX485.

- DI — вход передаваемых данных, подключается к TX контроллера
- RO — выход принятых данных, подключается к RX
- DE и RE — выбор направления; их соединяют перемычкой и управляют одним выводом: 1 — передача, 0 — приём
- VCC — питание +5 В, GND — земля
- A и B — линии шины данных
Как организован обмен
У каждого устройства в сети свой уникальный номер. Одно устройство ведущее, остальные ведомые: они молчат и слушают линию. Ведущий отправляет команды по таймеру или по событию; видят их все, но реагирует только тот, чей адрес указан. Если нужен ответ, ведущий переключается на приём, ведомый — на передачу, после чего управление возвращается ведущему. Такой порядок исключает коллизии. Возможны и более сложные схемы — с передачей роли от устройства к устройству или многоуровневые сети.
При прокладке линии рекомендуется делать её по возможности короче, придерживаться линейной топологии, использовать витую пару и держать шину подальше от источников электромагнитных помех.
Пример: один ведущий и два ведомых
В примере ведущим служит Arduino Uno с двумя кнопками и двумя светодиодами, ведомыми — две платы Nano, у каждой по кнопке и светодиоду. Кнопки ведущего управляют светодиодами на соответствующих ведомых, а кнопка каждого ведомого зажигает свой светодиод на ведущем.
На ведущем кнопки подключены к выводам 9 и 8, светодиоды — к 13 и 12; на ведомых кнопка на выводе 2, светодиод на 13. Направлением передачи у всех управляет вывод 6, скорость порта — 9600. Сообщение состоит из четырёх байт: стартовый 0x10, адрес ведомого, команда и стоповый 0x20. Ведущий каждые 100 мс по очереди отправляет ведомым состояние соответствующей кнопки, выжидает 5 мс, пока посылка уйдёт, и переключается на приём. Ведомый, распознав пакет со своим адресом, выставляет светодиод, делает паузу 5 мс, чтобы ведущий успел перейти на приём, и отвечает состоянием собственной кнопки. Программы ведомых отличаются одной цифрой — адресом (0 и 1); ведущему адрес не нужен.
На время загрузки программ шину RS-485 нужно отключать: аппаратные UART всех плат объединены, и прошивка иначе попадёт на все устройства сразу.
Что стоит доработать
- Отказаться от delay(): разделить отправку и переключение на приём, выполняя второе по таймеру.
- Добавить в пакет контрольную сумму — байт, вычисляемый из остальных и проверяемый принимающей стороной.
- Отделить отслеживание событий и выполнение команд от обмена, заведя буферы на приём и на передачу, чтобы длительная операция не задерживала всю сеть.
Протокол можно написать самостоятельно под задачу или взять готовый, например Modbus.
Пределы и варианты расширения
Одним сегментом дальше 1200 м связь не построить, но сеть удлиняют ретрансляторами, дублирующими сигналы между сегментами. Если устройств больше 32, применяют другие микросхемы семейства — MAX1487 (до 128 устройств) или MAX1486 (до 256) — либо делят сеть на связанные сегменты. Рекомендуемые скорости зависят от длины: 62,5 кбит/с на 1200 м, 375 кбит/с на 500 м, 500 кбит/с на 300 м, 1000 кбит/с на 200 м, 2400 кбит/с на 100 м и 10 000 кбит/с на 10 м; окончательно их подбирают опытным путём.
Аппаратный UART предпочтительнее программного, у которого ограничена максимальная скорость. Готовый модуль удобен для прототипов, но терминальный резистор стоит на каждом таком модуле, хотя нужен лишь на концах линии, — это повышает нагрузку и с каждым устройством снижает разность потенциалов. Поэтому для серьёзных изделий с большим числом узлов лучше собственная схема на микросхеме. Через RS-485 можно и обновлять прошивку контроллеров — при правильной разводке, подходящем загрузчике и предусмотренной в программе команде перезагрузки.