Использование интерфейса RS485 и экономия ног

в 6:39, , рубрики: diy или сделай сам, интерфейсы, контроллер, Песочница, последовательный порт, метки: ,

Однажды мне понадобилось связать между собой больше двух контроллеров, да еще и сделать это на довольно приличном расстоянии. В процессе гугления выбор пал на протокол ModBus в реализации поверх интерфейса RS485. Описания ModBus-а встречаются повсеместно, и в данной статье не рассматриваются. Остановимся более подробно на интерфейсе RS485.

image

Для передачи данных между устройствами чаще всего используется витая пара. По одной паре данные идут в обе стороны, но не одновременно, а по очереди. Все устройства, с которыми необходимо общаться, «садятся» на линию параллельно. Интерфейс использует дифференциальные входы-выходы. Вот основные положения…

Что нам может дать использование этого интерфейса? Из плюсов:
— Возможность передачи на большие расстояния;
— Среда передачи получается достаточно помехозащищенная;
— Простота добавления устройств к уже имеющимся линиям;
— Передача на высокой скорости…

Из минусов — нужно продумать политику арбитража. Продумать протокол так, чтобы либо не возникало ситуаций, когда передать данные пытаются одновременно два устройства, либо пути выхода из подобных ситуаций. Я пошел по первому, более простому пути. Выбрал вариант общения контроллеров Single Master (один контроллер является мастером и либо отправляет информацию любому другому, либо запрашивает от устройства передачу информации)

Классическая схема подключения контроллера к сети RS485 выглядит так:

image

Здесь используется микросхема MAX485 (ad485, st485 или аналогичные). Нога 1 — принятые данные, нога 4 — данные для передачи в линию, а 2 и 3 (на рисунке объединены) для включения приемника или передатчика. При объединении изменением уровня мы меняем направление передачи данных (к нам — от нас). Намеренно не пишу о том, какой из уровней включает приемник, а какой передатчик ибо здесь я сам поймал грабли лбом.
На представленной картинке все правильно нарисовано — здесь приемник включается низким уровнем сигнала, а передатчик — высоким. Я же как-то не обратил на это внимание и решил «улучшить» схему таким образом:

image

Косяк был обнаружен уже после разводки платы и сборки устройства: в дежурном режиме на выходе TxD постоянно «дежурит» логический «1», а в процессе передачи данных появляются «нули». Таким образом у меня все время выключен приемник и включен передатчик.

Мною было придумана два варианта выхода из этой ситуации:
1. Программный. Вместо аппаратного последовательного порта использовать программный, в котором все данные были бы инвертированы на выходе. Плюс — очевиден: не нужно заново изготавливать платы (а их у меня было целых пять).

2. Аппаратный. Поставить инвертор между выходом контроллера и входом преобразователя. Плюсы — тоже очевидны: не нужно писать свои кривые эмуляции последовательного порта.

Был еще и третий вариант — вернуться к изначальной, «не оптимизированной» схеме — но он повлек бы сразу и изменения в плате и изменения в программе — потому был сразу отброшен. Сам трудности создал — сам и преодолевать буду.

Забегу вперед — ничего я не переписывал и платы новые не разводил. Правду говорят — лень двигатель прогресса. Инвертор на одном транзисторе я собрал, ну так, в плане эксперимента, прям на разрезанной дорожке.

Получилось страшно, но оно заработало!

Итоговая схема:

image

Дабы сохранить колорит доделки из smd транзистора и двух выводных сопротивлений, схема нарисована в паинте.
В живую смотрелось так-же неаккуратно и страшно, но после трех слоев лака…

В общем я и по настоящее время таким-же образом экономлю одну ногу микроконтроллера, правда схема претерпела несколько изменений и посадочные площадки я стал разводить заранее.

image

Это часть схемы. Был добавлен резистор, который удержит транзистор в открытом состоянии, в случае отсутствия управления с ноги контроллера. (Если контроллер вынуть из панельки — это не помешает общению остальных устройств).

И кстати, та, самая первая система, вот уже скоро пойдет третий год, как работает.

Автор: Phantom_a666

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js