Урок 61. Аппаратная реализация интерфейса RS-485. Объединение плат Ардуино в локальную сеть RS-485.

Связь Ардуино через RS485

В уроке расскажу об аппаратной реализации интерфейса RS-485. Разработаем распределенную систему аналогичную системе из  предыдущего урока, только с использованием сети RS-485.

Предыдущий урок     Список уроков     Следующий урок

Для подключения к линии связи RS-485 применяются дифференциальные передатчики и приемники.

 

Передатчик должен формировать два противофазных сигнала.

Сигналы RS485

При этом стандарт RS-485 предъявляет к нему довольно жесткие требования:

  • высокое быстродействие;
  • работа на низкоомную и емкостную нагрузку;
  • защита от коротких замыканий;
  • отключение от линии (перевод в 3 состояние).

Дифференциальные приемники должны выделять разность между сигналами линий. И это при значительном уровне синфазных помех (-7 … +12 В) и высоком быстродействии.

Реализовать такие функции на дискретных элементах крайне сложно. Проще использовать интегральные приемопередатчики.

 

Приемопередатчики (драйверы) интерфейса RS-485.

Существует большое количество различных типов приемопередатчиков (драйверов) RS-485. Я предпочитаю использовать микросхемы ADM485, SP485, MAX485. Это однотипные микросхемы разных производителей. Функциональные возможности, параметры, назначение выводов у них совершенно одинаковые.

Драйвер RS-484 Производитель Ссылка на документация
MAX485 Maxim Integrated Products MAX481-MAX1487.pdf
ADM485 Analog Devices ADM485.pdf
SP485 Sipex SP485.pdf

Микросхемы выполнены в 8 выводном корпусе и имеют низкую цену.

По моей партнерской ссылке на момент написания статьи:

  • микросхема MAX485ESA стоит всего 8 руб;
  • микросхема MAX485SPA стоит 15 руб;
  • модуль конвертера TTL в RS-485 можно купить за 45 руб.

Купить драйверы RS485

В 8 выводном корпусе драйвера реализованы приемник и передатчик с параметрами, полностью соответствующими стандарту RS-485. Выходы передатчика и входы приемника объединены в микросхеме.

Драйверы RS485

Для преобразования интерфейса UART в RS-485 достаточно одной такой микросхемы.

Схема преобразования интерфейса UART в RS485

Если необходима гальваническая развязка, приходится использовать оптроны. Например, по этой схеме.

Схема преобразования интерфейса UART в RS485 с гальванической развязкой

Питание драйвера (+5 V INT) в этом случае должно быть гальванически развязано.

 

Объединение нескольких плат Ардуино в локальную сеть RS-485.

В качестве примера практической реализации сети RS-485 переработаем распределенную систему из урока 59 на сеть RS-485.

Новая схема локального контроллера будет выглядеть так.

Схема

Пояснять особенно нечего. Я добавил драйвер RS-485 по стандартной схеме включения.

Внешний вид

Такие же преобразования произошли со схемой центрального контроллера.

Схема

Все контроллеры подключены параллельно двухпроводной линии связи. Локальные контроллеры получают питание 5 В от центрального контроллера.

Линия у меня не длинная, скорость передачи низкая (9600 бит/сек). Поэтому в терминаторах нет необходимости. Для устранения неопределенности состояния линии при отключенных всех передатчиках к схеме центрального контроллера добавлены 3 резистора.

Схема смещения

Вся система теперь выглядит так.

Общий вид системы

 

Программное обеспечение.

Резидентное программное обеспечение центрального и локального контроллера осталось прежним:

sketch_59_2.ino - центральный контроллер;

sketch_59_1.ino  - локальный контроллер.

Загрузить программы в платы Ардуино необходимо до запайки драйверов RS-485. Иначе они будут блокировать сигналы RxD и мешать загрузке из Arduino IDE.

Обмен данными по сети происходит под управлением библиотек Tiny_ModBusRTU_Master и Tiny_ModBusRTU_Slave.

В программах, которые мы использовали в уроке 59, для организации сети через интерфейсы UART объекты ModBus создаются следующим конструктором:

Tiny_ModBusRTU_Slave slave(1, 8, regTable, 6, 13); // создаем объект ModBus

Последний параметр задает номер вывода для управления передатчиком RS-485 (сигнал DE). Для интерфейса UART этот вывод не нужен. Можно было параметр не задавать и сэкономить один вывод микроконтроллера. Но я его задал с номером 13 – светодиод общего назначения. Светодиод светился, когда в контроллере происходила передача данных.

Теперь мы подключили сигнал разрешения работы передатчика (DE) к 13 выводу. Поэтому программное обеспечение осталось прежним. В реальных разработках лучше использовать другой вывод.

 

Проверка работы системы.

Проверка ничем не отличается от тестирования системы-прообраза. Подал питание. Покрутил переменные резисторы, погрел термодатчики, понажимал кнопки. Все работает, данные отображаются на дисплее центрального котроллера. Ошибок обмена нет.

Дисплей системы

Имитировал ошибки обмена – нажал кнопку сброса локального контроллера.

Сообщение об ошибках

Посыпались ошибки на дисплее для данных обоих контроллеров.

В системе-прообразе на интерфейсе UART при нажатии сброса были ошибки только одного локального контроллера. Второй работал нормально. Происходит это, потому что при состоянии сброса микроконтроллер переводит все свои выводы в плавающее состояние (бросает в воздухе). Сигнал разрешения работы передатчика RS-485 за счет светодиод с резистором (вывод 13) переходит в состояние лог. 1. Для передатчика это разрешающий уровень. В результате выход драйвера блокирует линию связи.

Если необходимо, чтобы при отключении микроконтроллера сигналом сброса линия связи не блокировалась необходимо использовать для сигнала DE другой вывод. Также надо подключить его к земле через резистор сопротивлением 5…10 кОм.

Помехоустойчивость сети.

Все, что было написано по поводу сети RS-485 в предыдущем уроке в полной мере справедливо по отношению к нашей системе.

Длина линии связи теперь может достигать 1200 м. Скорость обмена можно увеличить. По сравнению с сетью через интерфейс UART схема незначительно усложнилась, но помехоустойчивость и все остальные параметры повысились. Получилась сеть совершенно другого качественного уровня.

 

В следующем уроке продолжу тему обмена данными между платами Ардуино.

Предыдущий урок     Список уроков     Следующий урок

5 комментариев на «Урок 61. Аппаратная реализация интерфейса RS-485. Объединение плат Ардуино в локальную сеть RS-485.»

  1. Здравствуйте! Спасибо за статью! Скажите пожалуйста, нужно-ли защищать приемопередатчик MAX495 от наводок в линии супрессором?

    • Здравствуйте!
      Да конечно. Если линия длинная и есть опасность высоковольтных импульсных помех то надо защищать. Поставить 3 пробивных стабилитрона (супрессора) между линиями A B, A C, B C.

  2. Добрый день! Спасибо за ваши уроки. У меня не получается передать с одной ардуины на другую показания трех датчиков температуры. Вместо вольтметра в вашем коде показания второго датчика работает, а третий никак не могу настроить. С уважением Виталий.

    • Здравствуйте!
      Передайте сначала просто последовательность байтов. Убедитесь, что они принимаются правильно. Затем упаковывайте в байты значения температуры. Можете открыть тему на форуме сайта.

      • Здравствуйте! У меня все получилось. Сперва не мог понять что делает 2 в (regTable+2), и что надо было ставить для третьего датчика температуры( поставил +4). Но пока не увеличил регистры хранения с 6 до 8 ничего не получалось. Тему открою чуть попозже. Сперва определюсь сколько данных мне надо передавать в проекте. Большое спасибо за уроки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *