Digitale DCC-Modellbahnsteuerung mit Arduino

1. DCC im Eigenbau

1.1 Einleitung

Beim Freiluftbahner kommt bald mal der Wunsch auf, seine Fahrzeuge per Funk anstatt mit ortsgebundenen/verkabelten Fahrtrafos zu bedienen. Verwendet man zudem Akkus, riskiert man keinen Stromschlag. Werden diese vom Freiland-Modellzug noch selber mitgeschleppt, gehören Betriebsunterbrüche wegen verschmutztem Gleis der Vergangenheit an. Der Markt bietet solche Fernsteuerungen schon lange an. Für meinen Geschmack allerdings mit etwas zu üppigem Funktionsumfang und bisher nicht im Akku-Fahrstrombetrieb. Darum habe ich für mein Projekt folgendes festgelegt:

  • DCC-Protokoll (Einschränkung auf 8-Bit DCC-Funktionsbefehle)
  • Nur HG 4/4 Dampflok mit Standard-DCC-Adresse 3 unterstützt
  • Lok-Funktionen: Fahrstufe, Vor- Rückwärts, Licht, Sound on/off und Lokpfiff
  • Lok-Geschwindigkeit: 28 Fahrstufen je Fahrtrichtung
  • Basisstation mit zweifarbiger Kontroll-LED für Betriebszustand
  • Basisstation Fahrstrom und Elektronik (uC): 24-Volt Akku 6s-LiPo mit 4200mAh
    (Unterhalb 22 Volt kein vernünftiger Betrieb mit Zahnstange und 12 Prozent Steigung möglich!)
  • Basisstation: Kurzschlusssichere 5 Ampere-H-Brücke (STMicrölectronics L6203)
  • Gleisstrom: Kurzschlusssicher → Kontinuierliche Strommessung und Abschaltung bei Überstrom
  • Funkhandregler mit drei roten LEDs für Betriebszustands (LCD-Displays sind bei starkem Sonnenlicht schlecht ablesbar!)
  • Funkhandregeler: 3.7V-LiPo-Akku (Aufladbar per USB-Kabel)
    Während Ladevorgang: Funkstille und abgeschaltete Anzeige
  • Funkverbindung: ISM-433MHz. (Industrial, Scientific and Medical Band).
  • Mikrokontroller: Adafruit Feather M0 Radio (ATSAMD21G18 ARM Cortex M0, Taktrate 48MHz, 256k Flash-Speicher, 32k RAM)
  • Kein RailCom (Antworten vom Lokdecoder)
  • Weichenumschaltung per Funk

1.2 Das DCC-Protokoll

Modellbahnen werden schon längst digital gesteuert. Zum Beispiel mit dem DCC-Protokoll (Digital Command Control), das von allen Modellbahnherstellern unterstützt wird. Meine Wahl fiel auf DCC, weil es quelloffen ist und man auch entsprechende Normblätter im Internet findet, wie z.B. diese hier:

Das DCC-Gleissignal hat einerseits den Zweck, die Fahrzeuge mit Energie zu versorgen und andererseits, sie mit individuellen Fahrzeugkommandos zu steuern. Das folgende Bild zeigt den Signalverlauf eines Steuerbefehls. Logisch 0 und Logisch 1 wird nicht durch eine Spannungsdifferenz, sondern durch eine verschieden lange Pulsdauer unterschieden. Ein einfaches DCC-Paket besteht aus 44 Bit und setzt sich wie folgt zusammen:

1.3 Arduino als Entwicklungsplattform

Arduino ist eine quelloffene, aus Soft- und Hardware bestehende Physical-Computing-Plattform. Die Hardware besteht grundsätzlich aus einem E/A-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen. Die Programmierung erfolgt in einer C- bzw. C++-ähnlichen Programmiersprache, wobei technische Details wie Header-Dateien vor den Anwendern weitgehend verborgen werden und umfangreiche Bibliotheken und Beispiele die Programmierung vereinfachen.
Beispiel für ein Programm (Sketch), das eine an das Arduino-Board angeschlossene LED blinken lässt:

int ledPin = 13;               //LED an Pin 13

void setup()                   //Wird beim Start des Programms einmalig aufgerufen
{
  pinMode(ledPin, OUTPUT);     //LED-Pin als Ausgang festlegen
}

void loop()                    //Wird ständig wiederholt, bis das Arduino-Board ausgeschaltet wird
{
  digitalWrite(ledPin, HIGH);  //LED anschalten
  delay(1000);                 //1000 Millisekunden warten
  digitalWrite(ledPin, LOW);   //LED ausschalten
  delay(1000);                 //1000 Millisekunden warten
}

1.4 Die Hardware der Basisstation

Lokomotive mit Güterwagen als Träger der Basisstation und des LiPO-Akkus:

1.5 Zusatzfunktion Weichensteuerung

Weicheantrieb mit Funksteuerung: Eigentlich war eine drehbare Weichenlaterne vorgesehen, die anzeigen würde, ob die Weiche auf «Gerade» oder «Abzweigend» steht. Nun kommt aber ein sogenanntes Zwergsignal zum Einsatz, das gemäss den SBB-Fahrdienstvorschriften den Rangierbetrieb regelt und nicht Weichenstellungen anzeigt. Um trotzdem sichtbar zu machen, wie der Zug die Weiche passieren wird und dabei die SBB-Fahrdienstvorschriften einigermassen zu erfüllen, besteht der Kompromiss darin, eine abzweigende Weiche mit «Fahrt mit Vorsicht» bzw. bei Geradeausfahrt mit «Fahrt» zu signalisieren. Bei besetzter Weiche oder während der Weichenumstellung zeigt das Zwergsignal «Halt». Das Weichenherz wird je nach Weichenstelung umgepolt. Als Gleisbesetztmelder wirkt eine IR-LED zur Distanzmessung bzw. Fahrzeugdedektierung. Die Ausgangslage der Weiche ist «Gerade» und wird per Funk auf «Abzweigend» umgestellt. Nach der Passage der Zuges oder nach einem Timeout keht die Weiche automatisch in die Ausgangsposition zurück. Die Schaltelektronik (uC) wird über das Gleis mit Strom versorgt. Bauteilliste:
  • Mikrokontroller: Adafruit (3177) Feather M0 Radio (ATSAMD21G18 ARM Cortex M0, Taktrate 48MHz, 256k Flash-Speicher, 32k RAM)
  • ISM 433MHz Antenne Molex inkl. uFl-Stecker (Die aufklebbare Flachantenne ist unter dem Gehäusedeckel angebracht)
  • Gleisbesetztmelder: Adafruit (3316) VL6180X Time of Flight Distance Ranging Sensor 5..100mm
  • Weichenherzpolarisierung: Adafruit (3191) 10-Ampere Power Relay FeatherWing (Non-latching type relay)
  • Weichenmotor/Servoansteuerung: Adafruit (2928) 8-Channel PWM or Servo FeatherWing
  • Weichenmotor/Servo: Miniatur-Servo KST X08 HV V6.0 im Alugehäuse und mit Metallgetriebe
  • Brückengleichrichter mit 470uF Elektrolytkondensator und L7805CV (Linear Fixed Voltage Regulator, 5V, 1.5A, TO-220)
  • 3 weisse LEDs mit Vorwiderständen




1.6 Codelistings (Arduino)

Extras ∇ ARDUINO C-CODE GEMEINSAMER HEADER
∇ ARDUINO C-CODE DER BASISSTATION
∇ ARDUINO C-CODE DES FUNKHANDREGLERS
∇ ARDUINO C-CODE DER WEICHENSTEUERUNG


1.7 Programmiertipps: Rechnen mit binären Operatoren

Beim Low-Level-Programmieren von z.B. Mikrokontrollern (Arduino) und in der Kommunikation können Berechnungen auf binärer Ebene (HEX, BIN) Vorteile bringen, wie z.B. eine schellere Programmausführung.

x >> n bedeutet: Bitfolge x um n-Stellen nach rechts verschieben (Rechts fallen die Bits heraus)
x << n bedeutet: Bitfolge x um n-Stellen nach links verschieben (Neue 0-Bits werden rechts eingefügt)
& AND/UND (AND-WHT: 00=0 / 01=0 / 10=0 / 11=1) Nicht zu verwechseln mit logischem AND &&
| OR/ODER (OR-WHT: 00=0 / 01=1 / 10=1 / 11=1) Nicht zu verwechseln mit logischem OR ||;
^ XOR (Exklusives ODER WHT: 00=0 / 01=1 / 10=1 / 11=0)
~ NOT/NICHT/INVERTER (Bsp. 1011 wird zu 0100)
(Die zur Verfügung stehende Bitbreite ist zu beachten! Stichwort: Data-Overflow)

Ganzzahlige Division durch 2
Zahlenbeispiel 1: 12 div 2 = 6
12 = 1100
1100 >> 1 = 110
110 = 6

Zahlenbeispiel 2: 15 div 2 = 7
15 = 1111
1111 >> 1 = 111
111 = 7

Restwert (Modulo) bei Division durch 2
LSB prüfen: 0→Rest-0, 1→Rest-1

Multiplikation mit dem Faktor 2
Zahlenbeispiel: 13 mul 2 = 26
13 = 1101
1101 << 1 = 11010
11010 = 26

Addition von 2 Bits inkl. Übertrag (Volladdierer)
(A=1.Bit, B=2.Bit, S=Summe, C1=Übertrag In, C2=Übertrag Out)
S = (A^B) ^ C1
C2= (A&B) | (C1&(A^B))

Zahlenbeispiel 1+0+1=10 oder 2
A = 1 (1. Bit)
B = 0 (2. Bit)
C1= 1 (Bit aus der vorangegangenen Binärstelle)
S = 0 (Summe)
C2= 1 (Übertrag in die nächste Binärstelle)

Bit auslesen
Zahlenbeispiel: Zweites Bit von links auslesen
a=0110
b=0011
c=0100
a & c = 0100
b & c = 0000

Bit setzen
Zahlenbeispiel: Zweites Bit von links setzen
a=0010
b=0110
c=0100
a | c = 0110 (Bit wurde gesetzt)
b | c = 0110 (Bit war schon gesetzt)

Bit löschen
Zahlenbeispiel: Zweites Bit von links löschen
a=0010
b=0110
c=0100   (Hinweis: ~c = 1011)
a & ~c = 0010 (Bit war schon gelöscht)
b & ~c = 0010 (Bit wurde gelöscht)


2. Meine HG4/4 als RC-Dampflok - Ein Totalumbau

2.1 Produktekritik

Mit der Modell-Zahnraddampflok HG-4/4 (Art.-Nr.26270/71) verspricht Märklin/LGB eine beinahe kompromisslose Umsetzung des Originals in Metallbauweise. Trotzdem soll der 4-achsige 6-kg-Brocken durch den Radius-1 gepeitscht werden.

Bewegtes Zahnstangentriebwerk bei Lokstillstand ist zwar vorbildgerecht, erfordert aber einen zusätzlichen Motor (M) für die "Antriebs-Attrappe".

Das funktionelle Zahnrad ist mit einem Zahnriemen mit der einzig direkt angetriebenen vierten Achse verbunden.

Ein energiehungriger Rauchgenerator und ein komplexes 4-kanaliges Belüftungssystem mit Kleinstventilatoren im Kesselgehäuse sorgen für Dampf und Rauch. Ganz im Gegensatz zum Kamin, qualmt der Ejektor wie ein Fabrikschlot, was Videoaufnahmen vom Original auch so zeigen. Die Zylinder dampfen je nach Betriebssituation. Leider pausiert die "Dampfshow" regelmässig, vermutlich zwecks Abkühlung. Auch ein kleiner Lautsprecher ist verbaut. Die Lok ist eine echte, wenn auch etwas kostspielige Bereicherung der Lokvitrine.

Anfänglicher Freude ist im rauen Outdoor-Einsatz allerdings Ernüchterung gewichen: Die limitierte Stromaufnahme an zwei von vier Achsen (Radius-1 sei Dank), erfordert ihren Tribut. Das Killerargument ist aber der Zahnstangenbetrieb bei vorbildgerechter Bergfahrt (12%-Steigung), wo die 6kg schwere Zugmaschine scheitert. Ab zwei DFB Zweiachser geht nichts mehr. Die Lok war zwecks Motorentausch schon bei Märklin/LGB in Göppingen, leider ohne Erfolg. Das Fahrzeug ist einfach zu schwach motorisiert! So habe ich also meine Garantieansprüche beerdigt und zu Schraubenzieher und Zange gegriffen und das Ding mal gründlich ausgemistet. Rein kommt ein Maxon-Motor und eigene Elektronik, dazu eine Funkfernsteuerung und ein Wagen mit Batterie für die Energieversorgung der Lok. So vermeide ich DCC-Protokoll und Gleisputzkolonne.

2.2 Zerlegen und Ausschlachten der Lok

Die Märklin/LGB-Gebrauchsanweisung schweigt sich leider darüber aus, wie das kleine Dampfross (Modell-Zahnraddampflok HG-4/4 LGB-Art.-Nr.26270 und 26271) zerlegt werden muss. Vielleicht helfen die folgenden Bilder einem allfälligen Nachahmer weiter. Bitte aber bedenken, dass eine allfällige Werksgarantie erlischt, wenn die Lok durch eine "unqualifizierte" Person geöffnet wird.

1. Schritt - Lösen von verschiedenen Klebeverbindungen:
Unterhalb der Rauchkammertür (E), an den beiden Laternen auf der Lokrückseite (F),(G) und die Lokaufstiege links und rechts der Rauchkammertür (A),(B),(C),(D).

2. Schritt - Lösen von Schrauben am Triebwerk:
Am Triebwerk müssen zwei Schrauben (A) und (B) entfernt werden. Um an der linken Seite an die Schraube (B) zu gelangen, muss zuerst das Kupferrohr (C) vorsichtig gelöst und entfernt werden. (Das Foto rechts zeigt das bereits demontierte Kupferrohr)

3. Schritt - Fahrwerk vom Aufbau trennen:
Zuerst müssen die drei Schrauben (A), (B) und (C) gelöst werden. Die violett markierten Schrauben aufdrehen, falls man die Achsabdeckungen entfernen möchte. Die rot markierten Gewindelöcher dienen ausschliesslich der Fixierung der Lok auf dem mitgelieferten Verpackungs-Gleisprofil.

4. Schritt - Lokaufbau entfernen:
Der Lokaufbau nun sorgfältig abheben. Fast alle elektrischen Verbindungen laufen über die Federpinleiste (Rote Pfeile in der Bildmitte). Nicht aber die Kabel für die rückseitigen Laternen (Roter Pfeil rechts). Darum Vorsicht beim Abnehmen des Lokaufbaus.

5. Schritt - Rauchgenerator entfernen:
Möchte man den Rauch- und Dampfgenerator erreichen, muss man zuerst das Blech an der Kesselunterseite entfernen. Dazu müssen die sechs mit grünen Pfeilen markierten Schrauben gelöst werden. Der Rauchgenerator ist mit (D) markiert. Er beinhaltet ein komplexes Belüftungssystem mit vier Lüftern. Auf der Höhe des Wasserkastens kann man den Lautsprecher erkennen. Bevor man das Rundlaufblech abnehmen kann, muss man vorher vorsichtig das Zahnstangensignal vom Wassertank lösen.

6. Schritt - Alles muss raus:
Fahrgestell mit Antriebsmotor (M) und Hilfsmotor (Z) für den Antrieb des sonst funktionslosen Zahnstangentriebwerks. Beim Tender erkennt man den Lokdecoder mit darunterliegenden Stützkondensatoren.

Diesem Motörchen wird von Märklin/LGB zugemutet, in einer "vorbildsgetreuen" Rampe mit 12%-Steigung den 6kg Brocken inkl. Anhängelast bergauf zu bewegen.

2.3 Der Wiederaufbau

Den Bühlermotor wurde durch einen MAXON RE30 (268213) ersetzt. Als PWM-Motorensteuerung dient der MAXON-Servokontroller ESCON Module 50/5 (438725). Die Ansteuerung und Funkstrecke erfolgt mit Arduinos von Adafruit Feather M0 Radio with RFM69 Packet Radio ISM 433MHz. (3177). Das Zahnstangentriebwerk wird neu wie bei der KISS-HG4/4 durch die Zahnstange angetrieben.

Die Lokomotive wird von einem umgebauten Personenwagen begleitet. Dieser führt einen BOSCH Akku zur Stromversorgung mit. Die Kupplungen wurde ebenfalls am gesamten Rollmaterial ausgetauscht. Anstatt dem schwierig anzusehenden LGB-Flaschenöffner eine Klauenkuplung nach amerikanischem Vorbild.



Das Elektronikschema der Lok:



Das Printplattenlayout:



Und der Bestückungsplan:



Der Funkhandregler für die beiden Loks:



2.4 Codelistings (Arduino)

Extras ∇ ARDUINO C-CODE DER HG 4/4
∇ ARDUINO C-CODE FÜR DEN FUNKHANDREGLER


2.5 Nachwort zum Umbau

Zweifelsohne wurde durch diesen Umbau, manche mögen es vielleicht Downgrading nennen, der Funktionsumfang der Lok aufs Wesentliche reduziert und auch die Garantieansprüche haben sich damit erledigt. Dafür erfüllt das Ding nun endlich das, was es schon ab Märklin/LGB-Werk hätte erfüllen sollen, nämlich als Zugpferd anstandlos zwei, drei einfache Wagons vorbildgerecht den Berg hinaufzuziehen. Da aber, abgesehen von der mangelhaften Traktion, auch Schall und Rauch nicht richtig überzeugten, werde ich nichts von dem je vermissen. Am wenigsten der vom fahrenden Zug per Einbaulautsprecher abgegebene Glockenklang einer sich schliessenden Bahnschranke - sozusagen eine mitreisende Bahnschranke ;-) Als grosses Plus werte ich die ab jetzt gleisunabhängige Stromversorgung der Lok.