Einkanal-Unidecoder

Unidecoder_1CH - Nachdem ich für meine Modellbahn den UniDecoder entwickelt hatte wollte ich auch meinen Sohn mit seiner Märklin C-Gleis Anlage mit Signalen und Bremsstrecken versorgen. Die Idee war, speziell für die "Teppichbahn" eine eigene Variante mit ähnlichen Elementen zu generieren:

Eine später hinzugekommene Idee war:

Ursprünglich hatte ich vor, das ganze mit dem PIC16F18346 zu realisieren. Umgesetzt wurde das dann zunächst auf Lochrasterplatine für ein A-Muster in Durchstecktechnik. Als ich das Layout für das B-Muster in SMD-Technik fertig hatte, war Microchip aber tief in der durch den Ukraine-Krieg ausgelösten Chipkrise gefangen - den PIC16F18346 gab es in SO20 nicht zu kaufen.

Als Lösung kam mir dann der PIC16F18446, der zusätzliche Peripherieeinheiten hat und in die Schaltung passte. Die nötigen Anpassungen an der SW waren relativ einfach.

Unidecoder mit Gehäuse und Ausfahrsignal am Gleis

Ansteuerung mit der Kombination Mobile Station 2 + Gleisbox

Die Mobil Station 2 (kurz MS2) hat gegenüber der älteren MS1 den Vorteil, dass sie auch Schaltdecoder für die Weichen- und Signalansteuerung bedienen kann. Die Steuerung hat folgende Eigenschaften, die beim Design des UniDecoders 1Ch berücksichtigt wurd

Anmerkung: Die neueste Firmware der MS2 (von 2025) unterstützt auch POM für Loks.

Der Einkanal-Unidecoder soll an das Märklin C-Gleis adaptiert sein

Die Idee, den UniDecoder 1Ch in das C-Gleis von Märklin zu integrieren hat zu folgenden Details geführt:

Modell des UniDecoder 1Ch im Gehäuse. Die 3D-Ansicht der PCB ist das Wireframe-Modell aus Eagle - die Bauhöhen sind nicht korrekt wiedergegeben.

Wird das Gleis abgebaut (was bei einer Teppichbahn manchmal nach wenigen Stunden Spielzeit der Fall sein kann), dann bleiben Gleisstück, Decoder und Signal beeinander. Man muss die Isolierstücke einsammeln (damit sie nicht verloren gehen, sie werden beim nächsten Aufbau gebraucht) und die 3 zusätzlichen Anschlüsse abziehen.

Erzeugung der Bremsspannung

Wie beim usprünglichen UniDecoder erfolgt die Erzeugung der Bremsspannung über dieselbe Schaltung; die Bremsspannung wird per Einweggleichrichtung als negative Spannung relativ zum Gleisanschluss "0" generiert, wobei es eine Strombegrenzung (jetzt mit Beschränkung auf ca. 600mA, da nur eine Bremsstrecke) und einen Übertemperaturschutz gibt.

Damit kein (in H0-Abmessungen) riesiger Kondensator integriert werden muss ist die Kapazität des Speicherkondensators auf nur noch ca. 10% der Kapazität beim UniDecoder beschränkt worden. Das bedeutet, dass z.B. ein auf Digitaldecoder umgebauter, alter ICE mit angeschalteter Glühlampen-Innenbeleuchtung wohl nicht mehr flackerfrei im "Halt" stehen kann solange das mfx-Protokoll aktiv ist. Für moderne Loks mit LED-Beleuchtung sollte das aber keinen Unterschied machen.

Natürlich unterscheiden sich die Komponenten, da diesmal SMD-Bauteile verwendet werden. Durch den moderneren Transistor (Leistungstransistor mit Stromverstärkung ~400 gegenüber dem beim "alten" UniDecoder eingesetzten Typ mit nur ~60) ist auch der Ruhestrom der Bremsspannung weit geringer.

Aufbau der Bremsstrecke

Wie beim ursprünglichen UniDecoder gibt es eine Aufteilung in Brems- und in Halteabschnitt. Ein Relais mit zwei Umschalterkontakten schaltet die Abschnitte entsprechend.

Stellung Relais Bremsabschnitt Halteabschnitt Verhalten der Lok
Fahrt Gleisspannung B Gleisspannung B Lok fährt in Signalstellungen Hp1, Hp2 und Hp0/Sh1 durch. Ist bei Gegenfahrt generell aktiv.
Halt Bremsspannung V- Spannungslos Lok wird in Signalstellung Hp0 bis zum Stillstand gebremst. In Gegenrichtung wäre das Signal nicht passierbar.

 Das Relais hat eine Bauhöhe, die es gerade nicht erlaubt, die PCB direkt in das Gleis zu platzieren (das Märklin C-Gleis hat einen definierten Bauraum für eine kleine PCB, in den sich beispielsweise Ansteuer-Elektroniken für Lichtsignale unterbringen lassen ohne dass man eine Box neben dem Gleis oder unter der Modellbahn hat).

Die die derzeitige Lösung besteht darin, die PCB so unter das C-Gleis zu legen, dass das Relais auf einer Seite des Gleises liegt.

Gegenfahrterkennung

Märklin-Bremsstrecken mit negativer Bremsspannung und anschließendem, unbestromtem Haltebereich sind ohne weitere Technik nicht für aus Gegenrichtung einfahrende Loks passierbar - die Lok würde innerhalb von wenigen cm Fahrtstrecke ohne Beleuchtung stehen bleiben.

Aus diesem Grund ist es weiter notwendig, eine Belegungserkennung sowohl auf dem Brems- wie auch im Haltebereich separat durchzuführen. Der Ansatz, auf den Stromsensor im Haltebereich zu verzichten wurde verworfen, da dies bei im Haltebereich stehender oder zu langsam fahrender Lok zu einem Hin- und Her-Schalten des Relais geführt hat. 

Anders als beim ursprünglichen UniDecoder war aber zunächst keine Rückmeldung über ein Bussystem wie S88 angedacht, auch weil die MS2 keinen Rückmeldebus unterstützt.

DCC-Decoder

Der Decoder ist dieses Mal als reiner DCC-Decoder ausgelegt. Das ist zunächst einmal Faulheit, weil ich keine Lust hatte, den kompletten simultanen MM2-DCC-Decoder des UniDecoder zu übernehmen. Generell fallen bei den einfachen Funktionsdecodern des DCC exakt so viele Informationen aus dem Decoder wie beim MM2-Funktionsdecoder, so dass die SW-Schnittstelle beider Varianten was die Ansteuerbefehle zum Signal angeht kompatibel ist.

Der DCC-Decoder implementiert:

Treiber für die Signalansteuerung

Wie beim UniDecoder wird auch beim UniDecoder 1Ch wieder der ULN 2830 verwendet. Der kann eigentlich vier Doppelspulenantriebe antreiben:

Besonders die EasyLine-Signale von Schneider Modellbahnzubehör können sehr einfach mit dem UniDecoder 1Ch angesteuert werden.

Mittels CV lässt sich das Dimming der LEDs beeinflussen, so dass sowohl die Helligkeit angepasst werden kann als auch ein Vorbildähnliches Ein- und Ausschalten der LEDs erreicht werden kann.

Dadurch, dass die Gleisspannung mit Treibern geschaltet wird lassen sich auch Formsignale ansteuern.

Spannungsversorgung für den UniDecoder 1Ch

Um möglichst Teppichbahn-tauglich zu sein sollte der UniDecoder 1Ch ohne zusätzlichen Stromanschluss auskommen. Ja, das kostet Strom aus dem Gleis, aber:

In Summe sind das dauerhaft etwa 70mA in Fahrt-Stellung und bis herunter auf 12mA in Halt-Stellung - das entspricht 0.5 - 1.5W, so dass das 36W-Netzteil einer Startpackung durchaus 8 bis 12 UniDecoder vertragen kann, bevor die größere Last Probleme bereiten kann.

Mein Testaufbau mit 4x UniDecoder 1Ch benötigt

Da im Realbetrieb immer ca. 50% der Signale "Halt" zeigen wird, kann man im Schnitt wohl mit 30 mA oder 0.6W pro UniDecoder rechnen.

CV lesen und Schreiben ohne RailCom und Programmiergleis

Die Kombination aus Märklin MS2 und Gleisbox kann eigentlich keine CVs von stationären Decodern ändern. Generell bestehen bei dieser Kombination folgende Einschränkungen was das DCC-Protokoll betrifft:

Da die Programmierumgebung des DCC verwendet wird, werden beim Lesen und Ändern von CVs keine (Lok-)Adressen mitgeschickt, sondern die MS2 geht davon aus, dass die Lok der einzige Decoder auf der Strecke ist. Dadurch sind die Ansteuerungen aber auch für einen stationären Decoder (so der die Programmierumgebung unterstützt) zu gebrauchen - aber halt nur für einen, oder man ändert an allen Decodern alle CVs gleichartig...

Die DCC-Programmierumgebung selektiv nutzen

Um nicht alle Decoder auf einmal zu ändern, reagiert ein UniDecoder 1Ch nur dann auf das Lesen und Schreiben in der Programmierumgebung, wenn er auf Stellung Hp1 (Fahrt) konfiguriert wurde. Jeder andere UniDecoder geht zwar in den vorgeschriebenen Stromsparmodus,  ignoriert aber sämtliche Befehle bis die Programmierumgebung wieder beendet wurde.

Der UniDecoder, der auf "Fahrt" steht reagiert und nutzt den Stromverbrauch des Relais und der LEDs (alle Ausgänge werden simultan aktiviert) für die nötigen ACK-Pulse um die Rückmeldung zu geben. Damit lassen sich CV-Werte ausgeben und Programmieranweisungen bestätigen.

POM mit neueren Firmware-Versionen

Die neueste MS2-Firmware unterstützt auch "Programming on the main", hierbei wird aber vermutlich nur mit Lok-Adressen gearbeitet. Ich habe mir die DCC-Signalisierung dabei noch nicht angeschaut, es wäre aber evtl. möglich mit einer vergleichsweise hohen Lok-Adresse als Substitut diese Funktionalität zum Schreiben von CVs im UniDecoder selektiv zu nutzen.

Blockabschnitt-Steuerung ohne Zentraleinheit oder PC

Als ich die ersten beiden UniDecoder 1Ch fertig hatte wurde mir klar, dass es zwar schön ist mit der MS2 neben den Loks auch Signale und Weichen steuern zu können - dass aber für eine vorbildähnliche Ansteuerung der Signale die beschränkte Benutzeroberfläche der MS2 den Spielspaß deutlich einschränken würde.

Mir kam dann aber die Idee, den im UniDecoder verbauten  µController dazu zu verwenden, eine Blockstrecken-Steuerung zu realisieren. Das unterscheidet sich fundamental von der Art, wie sonst bei Modellbahnen eine automatische Steuerung realisiert wird - die UniDecoder müssen das nämlich untereinander hinbekommen, es gibt keinen Chef der das für die kleinen Boards erledigt.

Grundidee - der Bus

Die Grundidee besteht darin, dass die UniDecoder einen gemeinsamen Bus benötigen, mittels dessen sie ihren Zustand untereinander verteilen können. Die Anforderungen an den Bus sind wie folgt:

  1. Der Bus muss als "Multimaster-Bus" funktionieren. Jeder UniDecoder muss jederzeit in der Lage sein, Information auf den Bus zu legen oder von dort zu lesen.
  2. Kollisionsvermeidung: So weit wie möglich sollen Kollisionen vermieden werden - und zwar ohne dass die Reaktionszeit des Busses zu weit leidet.
  3. Es muss eine funktionierende Kollisionserkennung geben. Falls Kollisionen nicht erkannt werden können, geht Information verloren.
  4. Er sollte vom Microcontroller alleine, bestenfalls mit wenigen Zusatzkomponenten realisierbar sein.

Leider hat keiner der derzeit im Modellbau verwendeten Busse alle der aufgeführten Eigenschaften:

S88

Der S88-Bus ist eine Daten-Einbahnstraße in Richtung Zentraleinheit: nur die näher am Master befindlichen Teilnehmer erhalten die Daten von weiter entfernten Modulen um sie "durchzureichen". Außerdem fehlt die Adresse, diese ergibt sich durch die Reihenfolge am Bus.

BiDiB und andere auf RS-485 basierende Busse

Der BiDiB genannte Bus kann außer Rückmelden auch Steuern. Er benötigt aber einen Master, außerdem basiert die Ausführung für die Verkabelung von Funktionsdecodern auf RS-485, das keine Kollisionen erkennen kann (der Sender ist für die Daten auf dem Bus während des Sendens "taub").

CAN-basierte Busse (Märklin, ...)

Hier ist das Hauptproblem, dass der verwendete µController keinen CAN-Bus-Controller enthält. Der müsste als zusätzlicher Baustein ergänzt werden.

SWART (Single-Wire Asynchronous Receive/Transmit)

SWART ist eine Abart von UART. Statt unidirektional einen Sender mit einem Empfänger zu verbinden wird je Busteilnehmer ein gemeinsamer Anschluss zum Senden und Empfangen verwendet. Durch einen zentralen oder mehrere verteilte Pull-Up-Widerstände wird ein "passiver" Ruhezustand des Busses definiert (logisch "1"), während die Busteilnehmer nur auf "aktiv" ziehen können (logisch "0"). Jeder Busteilnehmer kann senden und gleichzeitig empfangen, wodurch sich Kollisionen erkennen lassen.

LIN verwendet dasselbe Prinzip, verlangt aber 12V Betriebsspannung und zusätzliche Komponenten.

Die Signalisierung mit 5V hat sich aber bei den UniDecodern als zu störanfällig erwiesen, da bei Flanken des Gleissignals Spannungen bis 4V (!) auf die Signalleitung im passiven Zustand übersprechen.

DWART (Differential-Wire Asynchronous Receive/Transmit)

Der funktionierende Bus war dann DWART. Er benutzt dasselbe Prinzip wie SWART, benutzt aber neben der "normalen" UART-Signalisierung eine weitere Leitung mit invertierten Pegeln, aber gleicher Aufteilung in "aktiv" und "passiv". Anders als der CAN-Bus wird dabei keine Terminierung verwendet, da sich der Bus bei deutlich niedrigeren Datenraten bewegt (ich verwende 19.2 kBit/s statt bis zu 1 MBit/s bei CAN), so dass der Bus elektrisch keine "Leitung" darstellt, sondern auf der gesamten Länge als ein Potential betrachtet werden kann.

Wie bei RS-485 gibt es zwei Kontakte:

Auf der Seite des Microcontrollers werden beide Signale über die EUSART (A) sowie eine der CLC-Einheiten (als Invertierer geschaltet) generiert.

Die Auswertung erfolgt über einen der Komparatoren, womit auch überlagerte Gleichanteile bis nahezu der Versorgungsspannungsgrenzen abgefangen werden können.

Der Bus erlaubt es, den Zustand des Hauptsignals und der Belegung zwischen den verbundenen UniDecodern auszutauschen.

Automatik-Funktionen

Die Automatik-Funktionen wurden so angelegt, dass über eine weitere Doppel-Adresse folgende vier Funktionalitäten angesteuert werden können:

Adresse Funktion Verhalten
ungerade "Rot" Alle Signale werden auf Hp0 / "Halt" gestellt. Kann genutzt werden, um die Strecke für Fahrt(en) in Gegenrichtung zu blockieren. Allerdings werden auf der Strecke befindliche Züge in Fahrtrichtung dabei ebenfalls blockiert, das Gleis lässt sich nicht mehr räumen.
"Grün" Automatikbetrieb: Signal schaltet bei Vorbeifahrt auf "Halt", nach Freiwerden des Blockabschnitts auf "Fahrt". Die Strecke hält mehrere aufeinanderfolgende Züge auf Abstand voneinander. Es muss (wie bei Blockstreckenbetrieb üblich) mindestens 1 freie Blockstrecke mehr vorhanden sein als Züge, ab einer freien Blockstrecke vor jedem Zug (= halb so viele Züge wie Blockstrecken) ist flüssiger Betrieb möglich.
gerade "Rot" Automatik ist abgeschaltet. Es gelten die Signalstellungen die per Gleissignal definiert wurden. Bei Aktivieren dieser Stellung springen auch von der Automatik auf "Halt" gestellte Signale unvermittelt auf die per Gleissignal definierte Stellung (!).
"Grün" Halbautomatik: Signal schaltet bei Vorbeifahrt auf "Halt", aber nicht mehr wieder auf Fahrt. Einmalige Durchfahrt eines Zuges ist möglich. Danach ist das Gleis geräumt und gesperrt. Simuliert "Token"-Betrieb auf einer eingleisigen Strecke.

Erneutes Betätigen schaltet Signale einmalig auf Hp1 / "Fahrt", deren Folgeabschnitt frei ist.

Wenn in obiger Tabelle das Umschalten auf Hp1 / "Fahrt" beschrieben ist, gilt das in identischer Weise für Hp2 / "Langsamfahrt" falls diese Signalstellung vom Gleissignal definiert wurde. Signale, die vom Gleissignal auf Hp0 / "Halt" oder Hp0/Sh1 / "Halt/Rangieren erlaubt" gestellt waren werden durch die Automatik nicht verändert und behalten ihre Stellung.

Als Adresse habe ich bei mir für die erste Gruppe von automatisch gesteuerten UniDecodern 1Ch die Adresse 319 gewählt, was die letzte ungerade Adresse bei der MS2 ist (d.h., man kann von Adressen 1+2 einfach zu 319+320 wechseln um die Automatikfunktion zu beeinflussen oder abzuschalten).

Die Automatik erlaubt es für jedes Signal zwischen bis zu 5 (konfigurierbaren) Folgeabschnitten zu wechseln:

Neben dem aktivierten Automatikbetrieb ist weiterhin eine manuelle Ansteuerung jedes Signals möglich:

Es gibt außerdem ein Schutz vor fehlerhaft "Rot" zeigendem Signal:

Die Blockabschnitt-Steuerung ist so einfach implementierbar, dass sie sowohl mit der MS2 als auch jeder anderen Zentraleinheit bedient werden kann. Derzeit existiert noch keine Anschlussmöglichkeit des DWART-Busses an z.B. S88, diese lies sich jedoch auch mit Hilfe eines µControllers realisieren.