Подарили тут ребенку железную дорогу от китайского производителя. Выбирали специально с таким прицелом, чтобы не просто "паровозик при нажатии "вкл" катался по кругу, свистел и пыхтел" (ибо такой интереса к такой игрушке хватит минут на 20), а чтобы можно было иметь более-менее сложное путевое развитие, были разные вагоны и локомотивы, а самое главное - чтобы это был т.н. "стартовый набор", к которому можно было бы в дальнейшем докупать рельсы, вагоны и прочие принадлежности.
Собрали, запустили, всё ездит, издаёт звуки, меняет направление движения на стрелках - в общем, ребенок доволен. А папа думает: "Чего-то не хватает..." И пришла в голову идея - сделать управление поездом более "интерактивным" что ли. Благо, те же китайцы сейчас производят много электронных компонентов, из которых можно собрать хоть паровоз, хоть ракету на Луну.
Сказано - сделано. Идём на Aliexpress и начинаем закупаться. Для реализации проекта нам понадобятся: микроконтроллер Arduino (точнее, его китайская "цельнодраная" копия - я взял Pro Micro, хотя на самом деле можно с таким же успехом использовать совершенно любой), стабилизатор питания на 5V, радиоприемник с передатчиком (я взял обыкновенный четырех-кнопочный брелок). Для начала достаточно. В местном магазине, торгующем электронными компонентами, были приобретены транзистор, три диода и микрореле - эти три детали нам понадобятся для выдачи управляющего сигнала с контроллера на двигатель.
Сразу оговоримся, что для первого опыта берём самый "вместительный" из трех локомотивов - чтобы не испытывать дефицит свободного места. Выбор пал на пассажирский тепловоз, призванный изображать DB-Baureihe VT 11.5 - в своё время эти локомотивы использовались в высокоскоростных поездах Trans Europ Express.
Теперь надо написать программу. Итак, что должен уметь наш поезд, функционал управления которым ограничен четырьмя кнопками:
1. Ехать вперёд, при этом нам надо переключать последовательно четыре положения контроллера (от маневрового режима - самый медленный, который способен произвести электродвигатель серии F130, до режима максимальной скорости). Почему четыре? Да просто потому, что в маленькой комнате больше и не надо. Возможно даже, что четвёртый был лишним и его можно было объединить с третьим.
Здесь есть ряд нюансов. Мы ведь хотим, чтобы поезд разгонялся (и тормозил) плавно - как это происходит и в жизни. Это первое ключевое требование. Второй момент - мы должны иметь возможность в любой момент прекратить набор скорости (например, при ограничении скоростного режима на участке пути) и от этого параметра начать замедляться (если, к примеру, мы приближаемся к станции).
2. Ехать назад. При этом алгоритм контроллера такой же, как при движении вперёд, то есть, по сути, мы просто переключаем рукоятку реверса, а контроллером прибавляем счётчик положений от 0 до 4.
3. Экстренно останавливаться при условном "срыве пассажиром стоп-крана" или перемещении тормозного крана в положение экстренного торможения.
Следует учесть, что при соблюдении реальных параметров экстренного торможения (я имею ввиду среднее значение ускорения 0,65 - 0,68) наш игрушечный поезд проедет по комнате порядка 11,5 метров при торможении со скорости эквивалентной 120 км/ч в масштабе 1/87 - очень удобно для демонстрации ребёнку, чем опасно хождение по путям в наушниках и почему игрушечный медвежонок получил условную "железнодорожную травму". Но с точки зрения "играбельности" это торможение не будет восприниматься ни как экстренное, ни как торможение вообще. Поэтому неизбежны "допущения" при определении параметров разгона и торможения.
4. Дудеть (ну, или, выражаясь более профессиональным языком, "подавать сигнал большой громкости" (он же тифон)).
Так выглядит наш локомотив внутри. Всё просто - две батарейки АА, двигатель серии F130, судя по вольт-амперным характеристикам, модели 2190 - самый мощный в линейке, звуковая плата, динамик, светодиод в роли прожектора (почему-то красный и мигающий).
Когда все задачи определены, пишем программу и тестируем её - нет, не на поезде. Для тестирования я изготовил вот такой стенд с двигателем.
Казалось бы, всё хорошо - режимы прибавляются, двигатель разгоняется. Но чего-то по-прежнему не хватает. А не хватает вот чего.
Как было обозначено выше, мы хотим заставить локомотив трогаться плавно и двигаться с минимальной скоростью (каждый, кто хоть раз ездил на поезде, представляет себе, с какой скоростью поезд отходит от платформы). Это, на самом деле, очень сложно реализовать, поскольку для поддержания таких малых оборотов ротора электродвигателя требуется очень большой ток.
Допустим, мы прицепили к локомотиву два вагона. Ток на обмотках достиг значения, при котором двигатель начинает вращаться, и локомотив бодренько их за собой потянул. Затем мы прицепили ещё два вагона - локомотив их потянул, но тронулся более резко - т.к. началу вращения ротора препятствует масса состава. Если же мы прицепим 10 вагонов, то локомотив, вероятно, и вовсе поначалу не захочет никуда ехать, зато потом настолько резко "сдёрнет" весь состав, что от "плавности разгона" не останется и следа.
Для преодоления этой трудности умные люди придумали т.н. "ПИД-регулятор" - пропорционально-интегральной-дифференциальный регулятор, который как раз и служит для формирования управляющего сигнала с целью получения необходимых точности и качества переходного процесса. "ПИД-регулятор формирует управляющий сигнал, являющийся суммой трёх слагаемых, первое из которых пропорционально разности входного сигнала и сигнала обратной связи (сигнал рассогласования), второе — интегралу сигнала рассогласования, третье — производной сигнала рассогласования." (c)
Возникает логичный вопрос: что будет обеспечивать обратную связь с двигателем? Для этого нам потребуется датчик оборотов. Они бывают разные - оптические, магнитные. Китайские производители предлагают целый спектр решений - от отдельных компонентов до уже готовых модулей, представляющих собой двигатель с датчиком в сборе.
Осмотрев конструкцию поезда, я было приуныл - места для датчика в нём не было. Но решение этой задачи я отложил до этапа окончательного монтажа оборудования в корпус локомотива. Для начала я попробовал изготовить датчик самостоятельно, вырезав картонный диск с прорезями и разместив по обеим сторонам от него оптопару - ИК-светодиод и фототранзистор от старой мышки.
В целом, результат получился, но тут я сразу наткнулся на проблему - провод, передающий сигнал с датчика, ловил жуткие наводки при включении двигателя (даже несмотря на керамические конденсаторы во всех местах). Поэтому эксперимент было решено прекратить и купить нормальный датчик в виде готового модуля за 65 рублей. С ним всё пошло веселее (хотя при чтении сигнала в режиме аппаратного прерывания по прежнему пролетали неадекватные значения, которые иначе как наводками я объяснить не могу).
Здесь же пришлось помучиться и с ПИД-регулятором - поскольку у каждого двигателя свой уникальный "комплект" коэффициентов, причем он будет разным для разных режимов работы двигателя.
Для итоговой версии пришлось заказать диск датчика оборотов с пятью прорезями, напечатанный на 3Д-принтере.
Сам же датчик пришлось распилить на две части, разделив оптопару и собственно печатную плату, поскольку в своём первозданном виде он никак не поместился бы в корпус локомотива.
Испытательная поездка показала, что локомотив тянет поезд любой составности с заданными параметрами разгона. Причем, чем тяжелее состав, тем плавнее осуществляется разгон. Таким образом, первая часть эпопеи была успешно завершена.
Переходим ко второй части - не менее интересной, в которой мы научим наш поезд "говорить".