1Случился как-то заказик — сделать автоматическое движение трёх составов. Сапсан и два метропоезда. В масштабе TT. Да, можно было сделать вообще без затей, простым переключением полярности. Но  как-то не кошерно новые поезда с dcc-шными разъёмами так запускать. Да и на первый взгляд протокол управления не показался сложным. 4Сапсан был быстро перекрашен из ICE-3. Но вот с метровагонами пришлось повозиться, ничего похожего в продаже не нашёл. Решил делать сам. Пока занимался электрикой, друже с Туапсе быстренько сваял 63D5 модель и разложил по частям, которые я вырезал и покрасил. А моторная тележка была взята от первого попавшегося похожего покупного локомотива.  От него же перекочевал и свет.98

В интернете нашлась куча схем выходных каскадов «бустеров». И самая простая, на L298N, сразу пошла в проект. Без сложностей прошёл и выбор датчиков положения составов. Токовый. Один из рельсов режется на части. С какой из этих частей идёт снятие тока, там приблизительно и поезд. Есть пара нюансов. Точность срабатывания сильно зависит от загрязнённости рельса и колёс. А ещё от того, со скольких осей снимается напряжение . Тут пришлось отключать одну из них. Нехорошо конечно, но зато остановки происходили с точностью до сантиметра.
10Сам датчик прост — в разрыв питания одного рельса вставлен короткозамкнутый диодный мост, что даёт падение напряжения на нём, которого достаточно чтобы включить оптопару. Две детали, плюс два резистора  — весь датчик. В обвяке l289, кстати, не многим больше. В итоге, бустер, шесть датчиков, и контроллер, причём все не smd, уместились в платку 80х90мм.

Но, как говорится, это присказка была, дальше то, ради чего вся статья.

Основы протокола DCC есть даже в википедии. dcc-packetДлина периода единички 116 мкс, нуля — 200 мкс. Кстати, обратите внимание, в спецификациях указывают длительность полуволны. Я на этом факте как-то потерял много времени..

Простой пакет состоит из преамбулы, двух информационных байт, байта проверки и разделительных старт/стоп битов. В моём случае, поскольку адреса локомотивов по умолчанию одни и те же, нужно было ещё и перепрограммировать их. То бишь городить подобие настоящей командной станции. А в этом режиме используется уже два или три instruction byte. Но вот чтобы разобраться в этих трёх байтах  пришлось хорошенько полазить в этих трёх документах от NMRA.

S-9.2 DCC Communications Standard

S-9.2.1 DCC Extended Packet Formats

S-9.2.2 DCC Configuration Variables

S-9.2.3 DCC Service Mode

Там несколько сотен страниц мелким шрифтом. Несмотря на это, всё уместилось в tiny2313. И рабочая автоматика и станция программирования локомотивов. Вообще, чтобы просто запустить свежекупленный поезд ему нужно скормить всего лишь такую штуку: «1111111111|0|00000011|0|01001000|0|01001011|1» И он поедет. Даже фары включит, если подключены к декодеру.

Разберём из чего это состоит. После блока единичек, их должно быть десять или больше, идёт адрес. Он равен 3 по умолчанию у покупных декодеров (возможно не у всех). Старший нолик в нём показывает, что адрес короткий, семибитный. Единичка в старшем бите показывает, что будет использоваться 14-ти битный адрес. Можно использовать широковещательный адрес, это все нули, команду следующую за этим адресом должны выполнять все декодеры. На адрес 0xff никто внимания не обращает.

Байт инструкции сложнее. Старшие три байта определяют что будет твориться дальше.  Если это 010 или 011, то это движение вперёд и назад. Тогда младшие четыре бита означают скорость, остановку или экстренное торможение. Реакция на bit 4 зависит от конфигурации декодера и может либо реагировать на FL кнопку командной станции либо быть младшим битом скорости. Если у нас 100 и 101 вначале байта, то активизируются выходы F1 — F12.  Если же старшие три единички то будем программировать CV — переменные конфигурации. В S-9.2.2 они описаны. При этом инструкция состоит уже из двух или трёх байт. Например, да изменения адреса с третьего на пятый можно сделать так: «1111111111|0|00000011|0|11101100|0|00000000|0|00000101|0|11101010|1″ . 

Последний байт проверки , «error detect», получается побитовым XOR всех значащих байтов. В нашем первом случае двух. 00000011^01001000=0101011.

Я описал тут лишь малую толику возможностей, которые нужны для старта. Всё остальное есть в стандарте. Но это уже тема для самостоятельного изучения.

Вот полноценная командная станция для ЖД макета. Плюс шесть датчиков положения.

2 3