В ушедшем году у меня наконец сошлись вместе время - знания - желание - деньги - уровень и доступность техники, чтобы сбыть старую мечту и собрать макет системы диспетчерской централизации.
Внешне это выглядит пока не очень, для теста я не ставил цели скрыть монтаж.
(Фото без обрезки: )
Зато систему интересно смотреть в динамике. В ролик встроены комментарии, немного поясняющие происходящее.
Вот ещё ролик, здесь маневровые передвижения. Только при заказе светофоров немного промахнулся, поэтому вместо белого нижний огонь на выходном пока желтый :Х
Основным элементом управления является сеть из ардуинок. Но с точки зрения локомотива это аналоговая система - скорость задается напряжением на рельсах. Для точной остановки перед сигналами выделяется часть пути, где напряжение снижается. Структурная схема системы выглядит как-то так:
Мне было интересно реализовать управление от лица диспетчера, чтобы всё было завязано на один пульт, по возможности близкий реальному (в отличие от RocRail / TrainController). Это удалось, за исключением управления движением при маневрах - там пультик с командами составителя (хотя можно зажать кнопку "вперед", если не надо останавливаться посередине пути). В принципе, нет проблемы сделать физические пульт и табло, подключив их в ту же сеть контроллеров, но экранный вариант удобнее и гибче.
Пульт сделан на основе систем "Нева"/"Луч" (поскольку есть маневровые передвижения, то скорее второй). Программа написана с нуля, но источником вдохновения и части информации (наряду с ТУ-16) был, конечно, симулятор Zork'а, которому пользуясь случаем говорю большое спасибо (оттуда также позаимствована часть графики). Поскольку размер системы очень маленький, пульт и табло условно совмещены в одном окне. Если кто-то хочет половить баги в пульте - могу скинуть, там можно "покататься" в отладочном режиме без реального макета. Скриншот пульта крупным планом:
А вот как это выглядит при управлении реальным участком:
(фото с pultneva.ru)
Некоторые технические подробности описаны под вторым катом. [Если вдруг кому-то интересно]В принципе, ничего существенно оригинального в техническим плане система не содержит - просто сеть микроконтроллеров с релейной логикой, управляющих ключами. Чуть более детально архитектуру можно нарисовать так:
Система разделена на три уровня: компьютер, контроллер-ретранслятор и исполнительные контролеры рельсовых цепей.
Компьютер, помимо реализации интерфейсов для человека и контроллеров, выполняет довольно сложные для ардуинок проверки условий безопасности и работает на высоком уровне абстракции - с маршрутами, примерно как и оборудование в диспетчерской плюс частично станционная МРЦ. Исполнительные контроллеры решают задачу путевых устройств: на основе полученной по сети информации об открытии других сигналов, положении стрелок и приказов о направлении движения и открытии своего сигнала, они определяют, какое именно показание он будет иметь (Ж, З, Жм...) и какое напряжение выдавать на рельсы с учетом показаний сигналов и обеспечения плавности пуска. Ретранслятор только передает приказы контроллерам и ответы компьютеру. У меня была идея агрегировать в нем информацию о занятости секций, но с точки зрения отладки программ оказалось проще передавать ответы/приказы по одиночке без изменений.
Монтаж контроллеров выполнен на типовых платах двух видов: одна управляет двумя станционными путями либо перегонными блок-участками, другая - парой стрелочных секций, тупиков и других коротких цепей. Таким образом, легко набрать модули на любое путевое. Программы же контроллеров, несмотря на аналогичность основной части кода, надо несколько модифицировать под своё положение индивидуально (как на каждой станции, видимо, монтируется свой набор перемычек на типовых стативах с реле).
Основных технических проблем, с которыми пришлось помучиться в процессе разработки, было три.
Главный вопрос - детекция занятости рельсовых цепей. Нужно было поймать доли миллиампера, если за красным сигналом остался вагон. В качестве измерительного шунта я поставил встречно включенные диоды, и даже 10кОм в цепи (а иногда и плотно прижатая к рельсам рука) приоткрывали один из них достаточно, чтобы создать на переходе легко измеримое падение напряжения около 0,5В. Для надежности в контроллеры заложен алгоритм, который выполняет несколько серий измерений и отбирает экстремальные значения измеренных напряжений (они оказались более информативны) перед принятием решения о занятости. В нечетном направлении система работает вполне уверенно, а вот при обратной полярности, увы, хуже (на видео заметны некоторые капризы стрелочных секций). Предположительно, проблема в утечках через входное сопротивление АЦП ардуинок. Можно ещё поточнее понастраивать пороговые напряжения и поискать серию диодов с более удачной ВАХ на малых напряжениях. Может быть, у кого-то есть идеи или принципиально иные решения по теме - буду благодарен :)
Вторая проблема - замыкание соседних цепей локомотивом, проходящим изостык. Пришлось усложнить силовую часть и каждой секцией РЦ управлять двумя каналами ШИМ (для Ч и Н направлений), вставив туда по защитному диоду. Кстати, несмотря на ряд (непреднамеренных))) попыток, сжечь драйвер L298N ни 6, ни 12 вольтами так и не удалось :)
Третья, которую решал уже в январе - связь контроллеров между собой. Изначально в системе использовался протокол i2c, однако он оказался довольно капризен и, главное, контроллер-мастер регулярно зависал в определенных режимах работы. К собственному удивлению, проще и эффективнее оказалось написать свою логику связи, использовав по возможности имеющиеся линии. Заодно - вероятно, поскольку библиотеки i2c использовали внутренние таймеры контроллеров - улучшился ход локомотивов :) Кажется, в системе есть ещё большая доля потерь команд в COM между компом и ретранслятором, можно попытаться их поустранять, но поезда идут медленно и высокое быстродействие тут не требуется.
Что хочется сделать когда-нибудь (если вдруг дойдут руки)))? - Забороть проблемы с определением занятости. - Отрисовку ГИДа. Прибытия и отправления фиксируются автоматически, но программа пока не может присваивать номера поездов и логически связывать события отправления и прибытия в единые линии хода. - Конечно, создать более сложную систему на несколько станций :) только очень уж громоздкий получится проект. - Может быть, перевести управление на Сетунь. Может быть, сделать более реальное управление от лица машиниста. С другой стороны, очень хочется сохранить идеологию управления одним диспетчером и избежать развития шизофрении местного управления. - Применить в исполнительной сети нормальный протокол связи. Может, поразбираться с CAN или чем-то промышленным. А может, найти способ увязать-таки имеющийся пульт с DCC.