On the Internet nobody knows you are a Frog

-- Sandra Loosemore

Управление макетом
12 октября 2015

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

Сначала чуть-чуть теории. Когда я рассказывал о командной станции, то мимоходом упоминал про возможность управления стрелками, светофорами и другим оборудованием с помощью того же протокола DCC. Моя командная станция это, естественно, умеет. Нажимаешь на изображение стрелки и она посылает соответствующую команду на рельсы. А дальше… А вот дальше кто-то должен эту команду услышать и, собственно, стрелку переключить. Занимается этим устройство с нехитрым названием “декодер”. Стоимость у них довольно высокая, да и удовольствия от покупного готового несколько меньше, чем от сделанного своими руками. Вот отсюда и берется желание попробовать самому.

Схему взял готовую, хотя ее и пришлось отладить. Библиотеки для распознавания команд тоже есть готовые, так что написать программку, распознающую команды тоже несложно. (И боже мой, как же приятно писать на Си, а не на Джаве!) Проверил: команды распознаются, вроде бы, все хорошо, но… Сервомоторчик для управления стрелкой ведет себя странно. Вместо того, чтобы замереть в указанном ему положении, он мелко-мелко дрожит (по-английски это называется “jitter”). Непорядок. По советам из Интернета попробовал разные сервомоторчики - не помогло. Пришлось разбираться глубже.

Отладка программы, управляющей устройством, да еще и без операционной системы - не самое простое занятие, так что времени потратил много. В итоге, пришел к выводу, что дело в мощности процессора. Для тех, кто в программировании разбирается: анализ входящего DCC сигнала построен на прерываниях: перешел сигнал через ноль - сгенерировалось прерывание. Дальше программным способом выделяем нули и единички, собираем их в байты и анализируем. Вроде бы несложно. И работает безупречно. Однако, управление сервомотором ведется через так называемый ШИМ (широтно-импульсную модуляцию, она же PWM). Так вот, при частоте исходного DCC сигнала в десятки килогерц, прерывания возникают десятки тысяч раз в секунду. Их обработка съедает довольно много ресурсов у процессора и тот не в состоянии формировать импульсы одинаковой длительности. С точки зрения сервомотора это выглядит как требование отклоняться каждый раз на чуть-чуть другой угол. Вот он, бедняга, и дрожит.

Решений тут может быть много. Самое простое - использовать две платы Ардуино вместо одной (при цене в $2 за штуку, это все еще намного дешевле покупной электроники). Одна плата Ардуино анализирует DCC-команды и, когда нужно перевести стрелку, выставляет на соответствующей ножке, скажем, единицу. Другая плата постоянно анализирует состояние этой самой ножки (для чего прерывания не нужны). Увидев единицу, она формирует PWM заданной длительности, причем практически идеальный, проверял осциллографом. Дрожание прошло. Совсем. При любом сервоприводе.

Пока разбирался, схема была собрана без пайки. Вот так:

Убедившись, что все работает, спаял один экземпляр на кусочке макетной платы.

На видео ниже видно, как касание иконок на командной станции приводит в движение сервопривод (это вот та штука справа на кусочке дерева) или переключает светодиоды, имитирующие светофор.

Получилось! Причем главное тут - в удовольствии от процесса, разумеется 😄. Теперь можно делать печатные платы и собирать уже готовые модули.