MAX485 и промышленный RS-485 в проекте на Arduino: обзор и подключение
Где заканчивается TTL и начинается RS-485
На коротком проводе от Arduino до датчика UART-уровни 3,3–5 В живут спокойно. Но стоит сигналу уйти на теплицу или в щитовую — наводки и разница земель съедают биты. Выход — RS-485: линии дифференциальные, бит кодируется разностью между двумя проводами, а помеха, наведённая на оба провода сразу, приёмником вычитается. Классический чип для этого — MAX485; вся спека ниже взята из datasheet Maxim (Rev 10).
Что внутри и что в паспорте
MAX485 — приёмо-передатчик на один драйвер и один приёмник, питание строго 4,75–5,25 В. Спящего режима у него нет: по таблице datasheet он потребляет 500–900 мкА в любом состоянии. Скорость — до 2,5 Мбит/с; MAX483 и MAX487 из того же семейства в десять раз медленнее (250 кбит/с), зато фронты у них пологие — меньше выбросов и отражений даже без идеального терминатора. Приёмчик — 1 unit load с входным сопротивлением 12 кОм, значит до 32 устройств на шину (у MAX487/MAX1487 — четверть нагрузки и 128 устройств).
| Параметр | Значение по datasheet |
|---|---|
| Питание VCC | 4,75–5,25 В, ток 500–900 мкА |
| Скорость | до 2,5 Мбит/с |
| Дуплекс | полудуплексный, одна пара A/B |
| Драйвер | 1,5 В на 27 Ом (RS-485), 5 В без нагрузки |
| Порог приёмника | |A−B| > +200 мВ — высокий уровень, < −200 мВ — низкий |
| Гистерезис входа приёмника | 70 мВ (при VCM = 0) |
| Входное сопротивление приёмника | 12 кОм (1 UL), до 32 устройств; MAX487 — 48 кОм, 128 шт. |
| Ток КЗ драйвера | 35–250 мА, термозащита в Hi-Z |
| Напряжение на A, B | −8…+12,5 В (absolute maximum); working common-mode −7…+12 В |
| Защита драйвера | фолдбек-ограничение тока + термозащита |
Восемь ног и как их читать
Распиновка по Pin Description, DIP/SO:
| Ногa | Имя | Смысл |
|---|---|---|
| 1 | RO | выход приёмника UART-уровней: A−B > +200 мВ — «1», A−B < −200 мВ — «0» |
| 2 | /RE | разрешение приёмника, активный ноль: 0 — RO работает, 1 — RO в Hi-Z |
| 3 | DE | разрешение драйвера: 1 — чип управляет линией, 0 — выходы в Hi-Z |
| 4 | DI | вход драйвера UART-уровней: KiNESS низкий — Z=0, Y=1; высокий — Z=1, Y=0 |
| 5 | GND | земля |
| 6 | A | прямая линия, по совместительству неинвертирующий выход драйвера |
| 7 | B | инверсная линия, по совместительству инвертирующий выход драйвера |
| 8 | VCC | 5 В |
/RE и DE логически зеркальны, поэтому их часто соединяют вместе: DE на +5 В — чип передаёт, на 0 — слушает. Пока DE=0, выходы A/B в третьем состоянии и не мешают ни соседям, ни приёмнику.
Схема для Arduino и ESP32
Стык к datasheet: топология — как на Figure 1 (Typical Half-Duplex RS-485 Network), терминатор Rt на 120 Ом между A и B ставится на обоих концах линии при длинных проводах и высокой скорости.
- Где взять 3,3 В. Питание по паспорту 4,75–5,25 В, ниже не заведётся. Для 3,3-вольтового контроллера берите родственное семейство MAX3483/MAX3485 — оно рассчитано на 3,0–3,6 В.
- RO на RX. У Uno это пин 0 (или SoftwareSerial), у Mega — Serial1 (19). У ESP32 UART2 обычно GPIO16 — сверяйте по своей плате.
- DE и /RE соединяются вместе на GPIO — пин направления.
- Между двумя устройствами — витая пара. Терминатор 120 Ом ставится только на краях шины, не в середине.
Схема: RO на GPIO16, DI на GPIO17, DE и /RE вместе на GPIO4; линия — витая пара между A первого чипа и A второго, B первого с B второго, по 120 Ом между A и B на краях.
Рабочий код обмена
#include
#define RX_PIN 16 // RO приёмника MAX485
#define TX_PIN 17 // DI драйвера MAX485
#define DIR_PIN 4 // DE и /RE вместе: HIGH — говорим, LOW — слушаем
HardwareSerial RS485(2); void setup() { pinMode(DIR_PIN, OUTPUT); digitalWrite(DIR_PIN, LOW); // стартуем в режиме приёмника RS485.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); Serial.begin(115200);
} void loop() { // ---- передача ---- digitalWrite(DIR_PIN, HIGH); delayMicroseconds(50); // драйвер выходит из Hi-Z не мгновенно RS485.print("temp=23.7C\n"); // одно сообщение закончилось \n RS485.flush(); // дождались, пока уйдёт байт за байтом delayMicroseconds(50); // теперь можно ронять DE digitalWrite(DIR_PIN, LOW); // отдали линию соседу // ---- приём ---- if (RS485.available()) { String line = RS485.readStringUntil('\n'); Serial.println("Got: " + line); } delay(1000);
}
Главное правило кода — дожимать буфер (flush) перед сбросом направления: сбой этой пары строк даёт половину всех глюков RS-485.
Ошибка новичка №1: забытый полудуплекс
Пока DE держится HIGH, свой приёмник молчит: входы заняты. Отсюда два правила: направление переключается всегда, и очередь на шине не возникает сама — одно устройство говорит, остальные слушают.
Почему «висяк» не значит «висяк»
У приёмника есть встроенный fail-safe: если A и B висят в воздухе, RO гарантированно держит высокий уровень — это прямо по datasheet (receiver input has a fail-safe feature). Обрыв линии вы увидите не как поток «мусора», а как стабильные единицы. Но fail-safe не заменяет терминатор: пока никто не передаёт, сигнала на шине нет.
Частые ошибки
- Подают 3,3 В на VCC. Питание по паспорту 4,75–5,25 В, ниже чип не заведётся; для 3,3-вольтовой платы — MAX3483/MAX3485.
- Забывают отпустить DE. Пока DE=1, передатчик держит линию, и чужие передачи под свои биты уже не слышны. Обязательно digitalWrite(DIR_PIN, LOW) после каждой передачи.
- Перепутали A и B. A первого узла обязан идти на A второго: поменяете местами — инверсия полюсов, приёмник покажет бессмыслицу.
- Не ставят терминатор при длинной линии. На скоростях выше ~200 кбит/с и проводах в десятки метров без 120 Ом на краях — отражения и срыв байта. Для коротких проводов и низких скоростей MAX483 с пологими фронтами потянет, у MAX485 терминатор обязателен.
- Гонят на максимуме без нужды. Для 9600 бод хватит MAX483/MAX487; быстрый обмен — только MAX485.
- Путают полярность DE и /RE. DE активен единицей, /RE — нулём. Их часто соединяют вместе (это нормально), а вот подключить DE как «активный ноль» — типовой промах.
- Ищут спящий режим. У MAX481/483/487 он есть (RE=1, DE=0 → около 0,1 мкА), у MAX485 его нет — он всегда потребляет около 500 мкА. Для батарейного проекта берите MAX481.
Где почитать дальше
RS-485 хорошо ложится рядом с другими видами связи проекта: Bluetooth-модули HC-05/HC-06 закрывают ближнюю зону без проводов, а измерение тока INA219 покажет, что происходит по 5 В, когда на шине живут 32 узла.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.