DCC-Modellbahnsteuerung mit Arduino

1. DCC mit ARDUINO

1.1 Zielsetzung

Es soll eine drahtlose Modellbahnsteuerung mit ARDUINO erstellt werden. Die Stromversorgung der Lok erfolgt über einen mitgeführten Akku. Als Protokoll kommt DCC in einer vereinfachten Version zur Anwendung:

  • DCC-Protokoll mit Einschränkung auf 8-Bit DCC-Funktionsbefehle
  • HG 4/4 Dampflok mit Standard-DCC-Adresse 3
  • Funktionen: 28 Fahrstufen je Fahrtrichtung, Vor- Rückwärts, Licht, Sound on/off und Lokpfiff
  • Basisstation mit Anzeige für den Betriebszustand
  • Basisstation Fahrstrom und Elektronik (uC): 24-Volt Akku 6s-LiPo mit 4200mAh
  • Basisstation: Kurzschlusssichere 5 Ampere-H-Brücke (STMicroelectronics L6203)
  • Gleisstrom: Kurzschlusssicher → Kontinuierliche Strommessung und Abschaltung bei Überstrom
  • Funkhandregler mit Anzeige für Betriebszustand (Wegen schlechter Lesbarkeit bei starkem Sonnenlicht kein LCD-Display)
  • Funkhandregeler: 3.7V-LiPo-Akku (Aufladbar per USB-Kabel)
  • Funkverbindung: ISM-433MHz. (Industrial, Scientific and Medical Band).
  • Mikrokontroller: Adafruit Feather M0 Radio (ATSAMD21G18 ARM Cortex M0, Taktrate 48MHz, 256k Flash-Speicher, 32k RAM)

1.2 Das DCC-Protokoll

Digital gesteuerte Modellbahnen verwenden das DCC-Protokoll (Digital Command Control). (Es gibt zu DCC auch Alternativen.)
DCC-Spezifikation:

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

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. Umbau der LGB HG4/4

Bei dieser Umbauversion wird komplett auf DCC verzichtet. Eine RC-Fernsteuerung erteilt Befehle zur Fahrtrichtung und Geschwindigkeit an einen RC-Empfänger in der Lok. Dieser steuert einen MAXON-Baustein mir H-Bridge an, der den Motor steuert.

2.1 Motivation

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 Der Abbau

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.

Das Elektronikschema der Lok:



2.4 Codelistings (Arduino)

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