Те, кто долго жил в Москве, наверняка вспомнят метропоезда типа «Яуза». Хоть они и вызывали самые противоречивые мнения что у пассажиров, что у работников метрополитена, можно с уверенностью сказать, что для своего времени в нашей стране они были уникальными.
Итак, в сегодняшней статье попробуем запустить часть приборной панели от теперь уже навсегда исчезнувшей модели поезда метро. Узнаем, как всё это устроено и работает. Традиционно будет много интересного.
❯ Суть такова
Многие из жителей Москвы (где и эксплуатировались такие поезда) успели застать их в работе. Появившиеся в девяностые годы, эти поезда проработали на линии двадцать с лишним лет. Было выпущено немало модификаций, среди которых были как опытные, так и современные. Позднее их наработки использовались при создании более поздних вагонов — «Русич» и «Юбилейный», также кузов аналогичной конструкции имеет рельсовый автобус РА1.
Летом 2019 года их поголовно списали, тем самым завершив их пассажирскую эксплуатацию. Остался только один экземпляр, который хотели оставить для музея московского транспорта.
❯ Обзор оборудования
Тем уникальнее экземпляр, доставшийся мне. Редкая деталь от уже безвозвратно ушедшего в историю поезда — что может быть круче?
А достался мне цифровой скоростемер из кабины машиниста. Он же блок индикации АЛС-АРС.
На просторах удалось найти фото пульта машиниста (на КДПВ, он хоть и в лучшем качестве, но другой модификации). Чёрная панель со шкалами и есть тот самый блок индикации.
А вот и мой экземпляр. Девайс в отличном состоянии, если не считать слоя пыли и потёртостей. Характерный запах метро тоже в наличии.
Итак, на передней части находятся три светодиодные шкалы трёх цветов: красная показывает предельную скорость, зелёная — текущую, жёлтая — предупредительную. Правее светодиодный индикатор, отображающий текущую скорость, шкала ускорения и индикатор направления движения.
На обратной стороне и с боков ничего интересного, только отверстия для вентиляции.
На правом торце находятся разъёмы 2РМ, обозначенные как X1 и X2. Можно предположить, что один из них служит для питания, а другой для управления. Ну что же, скоро разберёмся.
Заводская табличка. Мой блок имеет номер 13.
❯ Внутренности
Первоначально я понятия не имел, с какой стороны подступиться к этой штуке. В интернете удалось найти документацию на систему АЛС-АРС вагонов «Яуза» и «Русич», однако принципы работы отдельных её блоков там не отражались. Поэтому оставалось только экспериментировать.
Что мы делаем, когда к нас в руки попадает интересная железка? Правильно: мы её разбираем.
Для разборки необходимо открутить два винта слева (один из которых под пломбой, которая у меня давно выкрошилась) и шесть со стороны разъёмов (по периметру корпуса). После этого весь металлический кожух легко снимается.
Внутри нас ждут три платы. Условно их можно разделить на плату управления, плату драйверов и плату индикации.
От разъёмов идут жгуты проводов.
Чтобы разделить эти платы, необходимо выкрутить шесть винтов под плоскую отвёртку, стягивающих их вместе. На фото самая нижняя плата. Увы, с другого ракурса заснять не вышло, иначе мешают провода. Но позднее я это постараюсь компенсировать более детальными фото.
Промежуточная плата.
А вот и плата индикации.
Децимальные номера на платах.
В первую очередь нас интересует, конечно, самая нижняя плата. Именно к ней приходят жгуты проводов от разъёмов. А это значит, что исследовать надо в первую очередь её.
На плате микроконтроллер КР1830ВЕ31, рядом чип памяти от Atmel. Вообще, эти две микросхемы — единственные два пластиковых корпуса во всём устройстве. Всё остальное — металлокерамика. По линиям питания микроконтроллера находим питание и землю. Они действительно выведены на маленький разъём, как я и думал.
Ну что же, пробуем включать?
❯ Первый запуск
Для начала нам понадобится ответная часть от разъёма. В данном случае — 2РМД18КУН4Г5В1. Маркировка на блочной части стёрта, так что выбирал чисто по размеру и числу контактов. Второй разъём имеет модель 2РМДТ30Б24Ш5В1В. Ответная часть к нему — 2РМД30КПН24Г5В1. Вообще, необязательно использовать именно такие, они имеют несколько модификаций, отличия которых (устойчивость к температурам, экранирование, прямой или угловой патрубок) для нас несущественны.
Итак, припаиваем провода и подаём пять вольт. И ничего. Некоторое изучение схемы выявило ещё один толстый провод, идущий от одного из штырьков этого разъёма. Подача на него пяти вольт дала результат. Как можно понять, одна линия служит для питания электроники, другая — для индикации.
Блок сразу после подачи питания. Видно некое подобие самотестирования — все шкалы зажжены.
Через секунду текущая скорость и ускорение гаснут. Всё, больше ничего не происходит. Ну что же, уже какой-то результат.
Распиновка маленького разъёма, таким образом, получилась следующая:
- Питание индикации
- Земля
- Питание логики
- Земля
Для запуска необходимо запараллелить линии питания и земли и подать на них пять вольт.
❯ Интерфейс
Разумеется, мне захотелось как-то поуправлять этим всем. А это значит, что надо разобраться, по какому интерфейсу работает эта штука и чего она вообще хочет.
Осмотр нижней платы выявил наличие двух очень похожих цепей на оптопарах 3ОД129А. Выводы светодиода были подключены напрямую к внешнему разъёму.
Попытка замкнуть выводы фотодиода была успешной — на шкалах что-то изменилось. По-видимому, входной сигнал подаётся именно сюда. Осталось только понять, что это.
Подключим через резистор в 220 Ом источник сигнала. Но на простой прямоугольный сигнал устройству было всё равно — шкалы только мерцали. По-видимому, это какой-то интерфейс.
«Скорее всего, это UART...» — подумалось мне. С этими мыслями я подключил блок к последовательному порту и стал пробовать отправлять что-то на разных скоростях, попутно наблюдая цветомузыку на шкалах.
Чего-то осмысленного удалось добиться на скорости в 9600 бод — отправка пары сотен байт 0x01 вызвала зажигание одного сегмента на шкале ускорения. 0x02 смог зажечь два. Всё, больше ничего не было.
К слову, следует помнить, что оптопара подключена к разъёму напрямую, поэтому обязательно использование внешнего резистора, иначе девайс может сдохнуть.
❯ Оживляем шкалы
Для проверки я решил отправить последовательно байты от 0x00 до 0xFF. И это оказалось неплохим решением — на основных шкалах стали заметны какие-то изменения. Далее я слал байты уже «прицельно» — не в таких больших количествах и определённые значения. Осложняло то, что, получив байт, панель сразу реагирует на него, а не ждёт, пока все данные придут.
Итак, в итоге я пришёл к выводу, что отправлять надо нечто вроде:
<data><00h><00h><00h>
Это давало какой-то эффект, но не отправляло девайс в разнос.
Практически тут же удалось оживить зелёную шкалу. За неё отвечает первый байт пакета. Каждые четыре единицы символизируют одно деление шкалы.
Далее поддалась жёлтая. Оказалось, что жёлтая и красная работают не на возрастание, а на убывание, то есть максимальное значение означает погашенную шкалу, а минимальное — полностью горящую.
Потыкав ещё немного, запустил красную.
В итоге формат пакета данных оказался такой:
<green><00h><00h><00h><red><00h><00h><00h><yellow><00h><00h><00h>
❯ Ускорение
Теперь очередь ускорения. Я долго пытался понять, где находятся его байты и даже тщетно приписывал такую же четвёрку в конец пакета, на что блок просто гас. В итоге оказалось, что нужное значение спрятано в шестом байте пакета — в среднем между красным и жёлтым. Таким образом, истинный вид пакета данных оказался таким:
<green><00h><00h><00h><red><00h><acceleration><00h><yellow><00h><00h><00h>
Значение этого байта может лежать в одном из двух диапазонов — 99-F5 — разгон, 00-0F — торможение. Всю линию сразу засветить нельзя. Одной единице байта соответствует одно деление шкалы.
Пробуем посылать пакет, и вот результат:
❯ Индикаторы
Как можно было заметить, в течение всех опытов два светодиодных индикатора не горели. А это значит, что самое время попробовать их оживить.
И для начала посмотрим поподробнее на плату индикации. Для этого откручиваем винты по периметру передней части и снимаем сначала металлическую рамку, а затем и пластину из оргстекла с надписями. Тут нас встречает куча светодиодных линеек, а также два индикатора. Всё импортное, никаких отечественных АЛСов с их никакущей яркостью.
Отдельного внимания заслуживает указатель направления движения. Это не просто световое поле, это матричный светодиодный индикатор. Изначально они выпускались для использования в качестве знакосинтезирующих, но тут почему-то он выполняет роль единичного. Что мешало поставить два обычных светодиода или два световых поля, мне неведомо.
Резисторные сборки, установленные на плате индикации.
❯ Индикаторы
Поскольку достучаться до индикаторов по последовательному порту не вышло, логично предположить, что управляются они извне.
На нижней плате обнаружились две микросхемы 514ИД2, являющиеся драйверами семисегментных индикаторов. Прозвонка выявила, что четвёрка линий данных от каждого чипа ведёт напрямую к тому же 2РМу. Но тут тоже не всё так очевидно: как оказалось, питание на них подаётся отдельно. И выведено оно не на маленький разъём, а на большой. Это тоже необходимо учесть при подключении. По сути схема с семисегментными индикаторами — отдельная независимая цепь.
Пробуем подать какую-то комбинацию, и… индикатор оживает! Индикаторы управляются независимо, то есть всего для их подключения надо восемь проводов.
❯ Световое поле
Настала очередь последнего элемента — указателя направления движения.
И, как оказалось, с ним всё ещё проще — достаточно притянуть к земле одну из ножек разъёма, чтобы оно заработало.
❯ Распиновка
Теперь, когда назначение всех контактов известно, можно определить и распиновку управляющего разъёма. Она тут оказалась вот такая:
- D0 первого индикатора
- D1 первого индикатора
- D2 первого индикатора
- D3 первого индикатора
- D0 второго индикатора
- D1 второго индикатора
- D2 второго индикатора
- D3 второго индикатора
- Вперёд
- Назад
- -
- -
- Корпус
- -
- RX-
- RX+
- -
- -
- -
- 5 В (инд.)
- Земля (инд.)
- -
- -
- -
❯ Что же с этим всем не так?
Увы, в ходе поиска формата пакета я столкнулся с одной проблемой, решить которую у меня так и не получилось. Дело в том, что пакет этот принимается лишь сразу после запуска контроллера. Если попробовать обновить данные, то панель гаснет. Я пробовал много вариантов форматов пакетов, но понять, в чём же дело, у меня не получилось.
❯ Вот как-то так
Как можно видеть, этот экземпляр оказался весьма интересным и поистине уникальным устройством. Конечно, сейчас этот блок вряд ли для чего-либо можно приспособить, но, конечно, сам факт того, что его удалось завести без какой-либо документации, уже не может не радовать.
Такие дела.
Возможно, захочется почитать и это:
- ➤ Испытываем удачу в домашних условиях
- ➤ Разбираемся с подключением блока индикации от системы автоведения поезда
- ➤ РЖДфон десять лет спустя
- ➤ Постройка двигателя мотосерфа | или 5 стадий принятия неизбежного
- ➤ SSD технологии древних: DiskOnChip
Комментарии (56)
KotovladeletsGT
26.06.2023 08:16+2Итак, в сегодняшней статье попробуем запустить часть приборной панели от теперь уже навсегда навсегда исчезнувшей модели поезда метро.
У вас тут опечатка. А вообще большое вам спасибо за такой прекрасный отчёт о представителе отечественной транспортной электроники - было очень увлекательно читать. Надо будет купить мне резисторных сборок планарных отечественных, они на платах очень неплохо смотрятся.
MaFrance351 Автор
26.06.2023 08:16+2Исправлено, спасибо.
Вообще, очень люблю отечественные чипы в металлокерамике. Как раз из-за этого тоже.
vindy123
26.06.2023 08:16+5Как это "некуда применить"!? Сам собой напрашивается плагин для винампа который бы делал из этой красоты трёхполосный визуализатор звука
MaFrance351 Автор
26.06.2023 08:16+4А когда ничего не играет, то отображать загрузку ЦП, использование памяти и ещё что-то.
kafeman
26.06.2023 08:16+4Увы, в ходе поиска формата пакета я столкнулся с одной проблемой, решить
которую у меня так и не получилось. Дело в том, что пакет этот
принимается лишь сразу после запуска контроллера. Если попробовать
обновить данные, то панель гаснет. Я пробовал много вариантов форматов
пакетов, но понять, в чём же дело, у меня не получилось.Пробовали сделать break? Довольно частый разделитель пакетов/кадров в подобных протоколах.
MaFrance351 Автор
26.06.2023 08:16+1О! А вот это надо попробовать. Даже не думал с этим поиграться...
MaFrance351 Автор
26.06.2023 08:16+2Увы, не прокатило. После повторной отправки пакета всё так же гаснет.
Vlad-sl
26.06.2023 08:16+2С впаяной пзу прошивку можно считать прищепкой, но перед этим надо перерезать дорожку питания.
или придется подпаиваться проводами к ножкам если не прищепки.
Тоже надо будет считать прошивку с редкого учебного стенда на мпк 589.
sergio_nsk
26.06.2023 08:16+1Мне кажется, что жёлтая рекомендованная скорость не должна пересекаться с красной максимальной, то есть жёлтая шкала вообще не должна начинаться от правого края.
MaFrance351 Автор
26.06.2023 08:16Ну так она и не заходит. Даже больше скажу: даже на 90 она не заходит, максимальная скорость в метрополитенах этой страны — 80 км/ч.
На последнем фото я попытался изобразить, как примерно это выглядело в работе.sergio_nsk
26.06.2023 08:16На последнем изображении рекомендованная скорость от 68 до 100, а недопустимая от 90 до 100. Может быть я не так понимаю жёлтую шкалу, тогда какой смысл рекомендации от 0 до 68 км/ч?
MaFrance351 Автор
26.06.2023 08:16+1Это скорее ещё одно ограничение. На картинке вон стоит 68. Наваливать, скажем, 80 можно, но уже с предельной бдительностью.
То есть красная шкала — та, выше которой вообще нельзя, жёлтая — можно, но с осторожностью.firyst
26.06.2023 08:16+2На просторах интернета можно найти принцип работы данных скоростемеров. Все три шкалы задействуются только на линиях с определенной системой сигнализации АЛС-АРС. Если не вдаваться в подробности, работает это следующим образом: в метро весь путь разделён на блок-участки с разным ограничением скорости. Красная шкала показывает предельную скорость на текущем участке; при превышении этой скорости срабатывает автоматическое торможение. Желтая шкала показывает ограничение скорости на следующем блок-участке, то есть машинист знает, с какой скоростью он должен ехать, чтобы не превысить скорость при переходе на следующий участок. Есть картинка, описывающая работу сигнализации, однако сами шкалы показаны не совсем верно (почему-то их сделали на возрастание, а не на убывание, как на вашем экземпляре).
Есть даже видео с работой этой системы на "Русиче" (на нем используется аналогичный скоростемер). В данном случае поезд скорее всего начал догонять впереди идущий, поэтому система постепенно снижала допустимую скорость.
Про системы сигнализации почитать чуть подробнее можно тут.
p0isk
26.06.2023 08:16+2Всё импортное, никаких отечественных АЛСов с их никакущей яркостью.
И тут же фотография матричного индикатора АЛС340, ну как так...
dlinyj
Снимаю шляпу за крутейший реверс-инженеринг такого крутого устройства. Это настоящая история, особо подивило наличия такого количества отечественных компонентов. Но, на сколько я знаю, отечественная электронная промышленность и выживала только за счёт транспорта.
По теме реверса, самый верный путь — это внимательно посмотреть распиновку ПЗУ (убедится что линии адреса приходят на соответствующие ножки контроллера), и затем отпаять её и сдампить. После чего дизассемблировать. Это предок 8051 архитектуры, и там ассемблер весьма простенький и легко читаемый. За одно можно понять формат пакетов, понимая архитектуру контроллера. Размер ОЗУ там небольшой, значит куда-то всю посылку он должен распихивать и после парсить.
Задачка, только на первый взгляд кажется сложной, но она очень интересная.
MaFrance351 Автор
У меня были мысли выпаять ПЗУ и прочитать. Но тогда подумалось, что демонтаж её из залитой лаком платы, а потом и засаживание назад будет не самым простым испытанием с риском запороть эту плату. Но, как оказалось, подобрать формат пакета было не так уж и просто.
Насчёт транспорта и электронной промышленности — всё так и есть.
Вообще, было бы очень круто раздобыть ещё что-то из такого оборудования, как можно заметить, технологические решения там часто были весьма и весьма интересными.
dlinyj
Здесь нужна смелость и уверенность в действиях. На одном производстве мы делали залаченные платы, и при браке их перепаивали и по много раз. Каждый раз лак удалялся механически.
Из химических способов (прошу только понять, что я не истина последней инстанции, может кто посоветует что-то более полезное), можно использовать ИПП-8А. Только работать в полиэтиленовых перчатках (остальное растворяет), и глаза защищать (слепота).
В общем, это в любом случае будет полезным опытом.
MaFrance351 Автор
Но сначала всё же стоит потренироваться на дохлых. Так как запороть плату этого устройства ну вообще не хочется.
dlinyj
Запороть двухслойку надо иметь недюжий талант :). Но тренировка никогда не будет лишней;)
MaFrance351 Автор
По закону подлости именно на какой-то редкой/дорогой/сложной плате этот талант обычно и удаётся проявить...
iliasam
Бывает гадкий текстолит, от которого дорожки при нагреве очень легко отрываются.
dlinyj
К сожалению, очень часто...
iliasam
А что, если Reset контроллера зажать, и подключить ПЗУ к программатору проводами?
MaFrance351 Автор
Кстати, тоже можно попробовать.
dlinyj
Не забываем про подтяжки. Так угробить схему значительно выше вероятность.
MaFrance351 Автор
Это относится ко всем ПЗУ с параллельным интерфейсом?
dlinyj
Я бы не рисковал, потому что надо давать питание, питание если подавать на микросхему с программатора, то будут питаться и другие микросхемы, тока может не хватить. Если питать внешне, может поплохеть программатору. В общем, если хочется рискнуть, понимая что на тот свет может отправится плата и программатор, то можно.
Но риска больше, чем выпаять и впаять панельку.
VelocidadAbsurda
Поскрести лак скальпелем со стороны пайки, дальше греть (с той же стороны), пока ROM не выпадет, не прикладывая к нему больших усилий, ничего не случится. Даже в самом крайнем случае (вырвалась металлизация отверстия) при установке назад (можно и в панельку, кстати) просто хорошо припаять ножку с обеих сторон к тому, что осталось на поверхностях - сама ножка заменит утраченное. Ну и в пределе - это два слоя, всегда можно «малой кровью» кинуть перемычку откуда угодно куда угодно, риск невелик и более предсказуем, в отличие от «внутрисхемного» подхода выше.
dlinyj
Да, поставить панельку здравая мысль, главное чтобы было место на буртерброд.
MaFrance351 Автор
Не, места не хватит. Разве что на шлейфе эту панельку вынести, чтобы в более удобном месте запихнуть.
Ну и тут отказ от панельки понятен — чтобы не вывалилось от вибраций и тряски.
roman901
По высоте?
Я вместо панелек ставлю два куска цанговых гребенок - получается по ширине почти 1 в 1 как оригинальный чип, да и надежность получше.
dlinyj
Что за цанговые гребенки?
MaFrance351 Автор
dlinyj
Есть готовые панельки такие же.
Другое дело, что высота всё равно будет.
makkarpov
А если прищепка + логический анализатор? Прошивка так или иначе считывается самим контроллером при работе, просто подключить сверху анализатор и снять лог, после чего разобрать его уже на компьютере. Абсолютно неинвазивный метод получается.
MaFrance351 Автор
Тоже возможно. У анализатора должны быть достаточно высокоомные входы, чтобы работе схемы это не помешало.
dlinyj
Это может занять годы, реально.
MaFrance351 Автор
Анализ того, что было считано?
dlinyj
Логический анализатор — это последний путь, когда другие методы не помогают. В вашем случае, самый правильный — считать прошивку и дизассемблировать её. Проще говоря, есть пути реверса, которые проходят все:
makkarpov
Что именно? У EEPROM-а обычный параллельный интерфейс, парсер его не должен представлять существенную сложность. Единственная проблема - обычных 16 каналов будет недостаточно. Нужен будет либо анализатор на 32 канала, либо два синхронизированных 16-канальных. Результат - такой же бинарник прошивки (не будет только адресов, к которым МК никогда не обращался), но полностью неизвазивным методом. Без выпаивания, отрезания дорожек, снятия лака и прочих подозрительных операций.
dlinyj
В общем, я рекомендую не заниматься глупостями. Не инвазивно можно прочитать микосхему, как советовали выше, перерезав питание.
makkarpov
Перерезание питания - это инвазивная операция. Пусть и небольшая.
Если МК за время работы (когда на него подавали данные и он исполнял программу) не обращался к какому-то адресу памяти - значит, этот адрес памяти для исполнения программы не очень важен. Но да, есть шанс потерять ветку, на которую не зашли (хотя условие её достижимости будет видно).
Не очень понял, какую кучу данных мы получим, если встрянем в цикл. Да, будет чтение повторяющихся ячеек, но EEPROM на то и EEPROM, что ячейку достаточно увидеть один раз. Не нужно анализировать всю трассу исполнения, достаточно просто узнать содержимое памяти по конкретному адресу. Сколько раз этот адрес будет прочитан - дело десятое.
Я не уверен, какая была схемотехника микросхем того времени (тем более советских), но с современными микросхемами даже при отрезанном питании я бы ожидал паразитной запитки процессора через ESD диоды на I/O ножках. Допускаю, что на советских микросхемах их могли не ставить.
dlinyj
У автора задача, получить парсинг данных. Если дёт сравнение с областями памяти, то если автор не сможет сгенерировать последовательности, которые попадут в те области, которые он хочет получить (чтобы узнать эти самые последовательности), то он их не получит. Нельзя себя за косичку из болота вытащить.
Вот, да, это мне и не нравится. Я об этом тоже писал.
IDDQDesnik
Есть теоретическая очень маловероятная возможность, что контролер в начале работы вычитывает всю прошивку для проверки контрольных сумм или типа того. Но я бы на это не рассчитывал.
MaFrance351 Автор
Не думаю. Если даже пакеты данных без этого сделаны.
XenRE
Да нормальная тема с пассивным дампером. Можно использовать отладку с ПЛИС, написать прошивку чтобы она сразу раскладывала данные по адресам — и останется погонять девайс чтобы выполнились все ветки. Что не выполниться — то и не нужно, либо при изучении будут выявлены условия захода в эти ветки — тогда просто додампить недостающее.
Приконнектиться тоже несложно — можно взять любую микросхему в похожем корпусе, высверлить кристалл, припаять провода к ее выводам и просто надеть вторым этажeм на ПЗУ.
MaFrance351 Автор
Суть-то в том, что надо узнать, что ему хочется получить для полноты пакета. Методом подбора это добыть не вышло. Так что есть возможность, что по нужному адресу он не зайдёт никогда. А то, возможно, он просто крутится в одном цикле, откуда потом вылетает, получив не то, что ожидалось.
Можно, конечно, пробовать отправлять все возможные варианты пакетов заданной длины, тогда, конечно, задача только в одном — угадать нужный формат меньше чем за время тепловой смерти вселенной.
О чём, собственно, и говорил dlinyj, что на это запросто могут уйти годы.
makkarpov
Да увидите вы и условия циклов, и условия ветвлений. Вы не увидите тела неисполненных веток. Условно, вы видите следующий код (допустим, на x86, а не 8051, в него я не умею):
Ветка не выполнилась и неизвестно, что внутри, но как заставить её выполниться - достаточно очевидно.
XenRE
Именно так, в первом заходе например будет видна проверка на сигнатуру ожидаемого пакета (либо ее 1й байт), далее посылаем эту сигнатуру - ветка раскрывается и т.д. За несколько итераций будет сдамплено все нужное, годы тут тратить совершенно не на что.
mpa4b
Это не "предок", а самая натуральная mcs-51 архитектура, аналог 80c31.
dlinyj
Прошу прощения, вы совершенно правы. Тем более, тогда всё сильно проще.
VT100
А есть ли у "тридцатьпервого", как у "пятьдесятпервого"?
P.S. Какой же микроЦАП (uDAC) сделал хабру новый редактор!? Гоните его ссаными трапками!
dlinyj
Пользуюсь старым редактором, и сижу на старой версии хабра, покуда возможно. Новой не могу пользоваться.
MaFrance351 Автор
Спасибо, запомню.