Der erste und wichtigste Baustein des Carrera Hardware Hackings ist das digitale Lesen, Analysieren
und Verarbeiten der Datenpakete auf der Rennbahn. Dank der hervorragenden Webseiten von
Stephan Heß
ist das Protokoll und alle Details der Datenübertragung zwischen ControllUnit/BlackBox/RedBox
und den Autos bis auf das kleinste Bit bekannt. Ich werde an dieser Stelle daher nur auf
Inhalte eingehen, die für das unmittelbare Verständnis des Decodierers wichtig sind.
Mit Hilfe dieser Informationen und
einem Arduino kann jeder Bastler mit wenig Aufwand und ohne Löterfahrung den
Datenverkehr der Carrerabahn sichtbar machen, ihn analysieren und verarbeiten.
Die nachfolgende Seite erklärt in kleinen Schritten einen möglichen Decodierer
und stellt die notwendige Software zur Verfügung.
Abbildung 1
Experimente mit dem Arduino, einer umgebauten Carrera BlackBox und einem D143 Auto.
Die Hardware
Lasst euch von Abbildung 1 bitte nicht abschrecken. Alles was ihr für den ersten Decodierer braucht
ist ein Arduino, zwei Widerstände, eine Diode und ein paar kurze Drahtlitzen.
Wer den Decodierer ganz ohne Lötkolben aufbauen will, braucht noch eine Steckplatine,
für die meisten Carrera Hacks ist eine Platine mit 100 Polklemmen vollkommen ausreichend.
Alternativ können die paar Teile auch schnell mit dem Lötkolben "fliegend" verdrahtet werden.
Maximal werden also sechs Bauteile benötigt, wobei
der Arduino mit ca. 25,-Euro und das Experimentierbrett je nach Größe mit maximal 9,- Euro
zu Buche schlägt. Die Kosten der restlichen Bauelemente können geflissentlich ignoriert werden, es
sind weit unter 1,- Euro und in den meisten Bastlerhaushalten sind sie "eh schon da".
Der Aufbau der Hardware sieht wie folgt aus:
Abbildung 2
Aufbau des Carrera Decodierers
Die Bahnspannung liegt bei der D124 bei 18 V, bei D132 und D143 sind es nominal 14,8 V. Durch kurze
Unterbrechungen der Bahnspannung werden Signale an die Fahrzeuge und Weichen gesendet, die Firma Stadlbauer
verwendet zur Codierung der Bits mit Hilfe der Bahnspannung den Manchester Code. Die Bits werden zu insgesamt
zehn verschiedenen Datenworten zusammengefasst, die sich zyklisch wiederholen.
Die gesendeten Worte sind unterschiedlich lang und können 8, 10 oder 13 Bit beinhalten,
wobei das erste Bit als Startbit immer eine Eins ist und damit keinen Informationsgehalt hat.
Abbildung 3
Typisches Datenpaket einer BlackBox gemessen am Spannungsteiler.
Die Schaltung
Zur Analyse der Daten im Arduino muss die Bahnspannung auf ein für den Arduino
verträgliches Maß von 5 V reduziert werden. Dafür bietet sich im einfachsten Fall ein
Widerstands-Spannungsteiler an, der die Bahnspannung im Verhältnis 1:4 reduziert.
Für die Widerstände des Spannungsteilers nehme ich R1=22 KΩ und R2=8,2 KΩ.
Am 8,2 KΩ Widerstand ist die Spannung damit um den Faktor 0,27 reduziert, was bei
den 18 V der D124/D132 einen Eingangswert von ca. 4,8 V am Arduino ausmacht.
Die Diode D1 ist eine Standard Diode vom Typ 1N400X, sie schützt vor Verpolung
und entkoppelt den Arduino von der Bahn. Außerdem reduziert die Diode die Eingangsspannung
am Spannungsteiler noch mal um 0,7 V.
Der Ausgang des Spannungsteilers wird mit dem Datenpin 2 des Arduinos verbunden,
der Eingang mit dem Pluspol der Carrera Schiene. Darüber hinaus muss nur noch
eine Masseverbindung zwischen Schiene, Spannungsteiler und Arduino hergestellt werden, schon ist der
Decodierer einsatzbereit.
Abbildung 4
Schaltplan des Carrera Dekodierers
Der Eingang des Arduinos kann zusätzlich über eine Zener Diode parallel zu R2 geschützt
werden. Es bieten sich beliebige Zener Dioden mit einer Durchlassspannung von 5,1 V und einer
Leistung von 0,5 W an, wie z.B. die 1N473- oder BZX79-Typen. Allerdings muss in diesem Fall der
Spannungsteiler angepasst werden, weil die Diode einen Innenwiderstand von einigen
100 MΩ aufweist und damit der Gesamtwiderstand des Spannungsteilers
reduziert wird. Die Eingangsspannung am Arduino darf nicht unter
3 V fallen, ansonsten kommt es zu Fehlmessungen durch Störspitzen auf der Bahn. Die
Motoren der Autos und die Weichen erzeugen deutlich messbare Störspannungen, die sich
im Spannungsverlauf wie nachfolgend abgebildet bemerkbar machen.
Abbildung 5
Deutliche Störimpulse auf dem Bahnsignal verursacht durch die Fahrzeuge. Erst bei einem Trigger
(kleiner Pfeil am rechten Rand) von 0,75 der Eingangsspannung synchronisiert sich das Oszilloskop.
"Hello World"
Für den Einstieg in den Decodierer starte ich mit einem abgespeckten
Programm, das jedes vollständige Datenwort in Echtzeit auf die serielle Schnittstelle
im Binärformat ausgibt. Der Arduino Sketch ist ein minimaler, "quick-and-dirty" Ansatz,
um die Datenworte sichtbar zu machen, er ist die Urmutter meiner Carrera Hacks.
Ich werde in fast allen Hacks auf dieses Grundgerüst, genannt das
Carrera-Skeleton, zurückgreifen.
const int dataPin = 2;
boolean wordChange = false;
long Word = 0;
long currentWord = 0;
unsigned long intervalMicros = 0;
unsigned long previousMicros = 0;
unsigned long currentMicros = 0;
void setup() {
Serial.begin(115200);
pinMode(dataPin, INPUT);
attachInterrupt(0, manchesterDecode, CHANGE);
}
void loop() {
if( wordChange == true ){
wordChange = false;
Serial.println( Word, BIN );}
}
void manchesterDecode(){
currentMicros = micros();
intervalMicros = currentMicros - previousMicros;
if (intervalMicros > 75 && intervalMicros < 125){
previousMicros = currentMicros;
currentWord = currentWord << 1;
if ( digitalRead( dataPin ) == LOW )
bitSet( currentWord,0 );
return; }
if ( intervalMicros > 6000 ) {
Word = currentWord;
currentWord = 0;
bitSet( currentWord,0 );
wordChange = true;
previousMicros = currentMicros;
return; }
}
Der vollständige, lauffähige und mit Kommentaren versehene Code des Carrera-Skeletons kann im
Experimentierkasten am Ende der Seite runter geladen werden.
Die Decodierung der Manchester Bits übernimmt dabei die Interrupt Routine "manchesterDecode".
Die Routine wird bei jedem Flankenwechsel der Bahnspannung aufgerufen und setzt die decodierten Bits
zu ganzen Wörtern in der globalen Variablen currentWord zusammen.
Eine detaillierte Beschreibung des Algorithmus zur Carrera
Manchester Decodierung befindet sich im Artikel
Carrera Manchester Decode.
Sobald alle Bits empfangen wurden, signalisiert der Interrupt das Vorliegen
eines vollständigen Wortes der Hauptschleife void loop() über das Flag "WordChange".
Die Hauptroutine sichert die Bits in einer zusätzlichen Variablen und kann
anschließend in aller Ruhe mit der Verarbeitung des Datenworts beginnen.
Der Analyseteil besteht im "Hello World" lediglich darin,
jedes Datenpaket in Binärschreibweise auf den seriellen Bus auszugeben.
Das ist nicht besonders elegant, hilft aber beim ersten, grundlegenden Funktionstest
und reduziert die Komplexität während der ersten Gehversuche.
"Der Inspektor"
Jetzt geht es darum, Struktur in die serielle Ausgabe zu bringen. Im "Hello World" rauschen
die Datenworte viel zu schnell durch den Bildschirm. Ich möchte die Pakete gerne
lesbar aufbereitet haben und dazu wird der Analysebereich nun weiter ausgebaut.
Die Carrera RedBox/BlackBox/CU sendet in einem vollständigen Protokollzyklus zehn Datenworte,
die sich alle 75 ms wiederholen. Dabei werden die Worte, in denen eine CU Daten empfängt, ignoriert.
Bei BlackBox und RedBox gibt es diese Empfangsblöcke sowieso noch nicht.
Die zehn gesendeten Worte sollen als strukturierter Block mit einer Wiederholfrequenz von zwei
Sekunden auf der seriellen Schnittstelle ausgegeben werden.
Abbildung 6
Aufbau der zehn zyklisch gesendeten Datenworte der D143/D132/D124. Bezeichnungen nach
Stefan Heß
Abbildung 6 zeigt die veränderlichen und festen Teile der gesendeten Datenworte.
Der Zyklus beginnt mit dem sogenannten Programmierdatenwort, dieses hat als
einziges Wort eine Länge von 13 Bit, alle anderen Worte sind mit 8 bzw. 10
Bits deutlich kürzer. Wenn im Programmierdatenwort alle veränderlichen
Bits Null sind, ergibt sich in einer 2-Byte Darstellung folgendes Bitmuster
#0001000000000000bin. Umgewandelt in Hexadezimal oder Binärschreibweise sind das:
#1000hex, #4096dec.
const int dataPin = 2;
int wordCount = 0;
boolean wordChange = false;
long currentWord = 0;
long Word = 0;
long Words[11];
unsigned long intervalMicros = 0;
unsigned long previousMicros = 0;
unsigned long currentMicros = 0;
void setup() {
Serial.begin(115200);
pinMode(dataPin, INPUT);
attachInterrupt(0, manchesterDecode, CHANGE);
}
void loop() {
if( wordChange == true ){
wordChange = false;
if( Word > 4000 )
wordCount = 1;
Words[ wordCount ] = Word;
wordCount++;}
if ( wordCount == 11 ){
for (wordCount=1; wordCount < 11; wordCount++){
Serial.print( wordCount, DEC );
Serial.print( "\t" );
Serial.println( Words[ wordCount ], BIN );}
Serial.println("---------------------------");
wordCount = 1;
delay( 2000 );}
}
void manchesterDecode(){
...
}
Damit steht der Algorithmus des Inspektors fest. Der
Inspektor sucht nach einem Datenwort, das dezimal größer als 4000 ist
und gibt die folgenden 10 Worte auf der seriellen Schnittstelle aus. Anschließend wartet
er 2 Sekunden bevor er sich erneut mit dem Programmierdatenwort synchronisiert.
Der Sketch des Inspektors ändert sich hauptsächlich in der Hauptroutine void loop().
Ansonsten werden zwei neue Variablen eingeführt, einen Zähler wordCount und ein Feld
Words [11] zur Zwischenspeicherung der 10 Worte bis zur Ausgabe, alle
anderen Teile bleiben unverändert. Der vollständige, kommentierte Sketch liegt ebenfalls im
Experimentierkasten am Ende der Seite zum Download bereit.
Abbildung 7
Die Ausgabe des Inspektors, verbesserte Aufbereitung der Daten zur visuellen Analyse
In dem oben abgebildeten Auszug erkennt man in dem ersten Datenpaket
einen typischen Leerlauf-Zyklus, in dem nichts passiert. In dem darauf folgenden Zyklus sind
im Datenwort Nr. 10 die vier Bits der Reglergeschwindigkeit auf High gesetzt.
Gemäß der Tabelle in
Abbildung 6
bedeutet das, dass der Regler an Position 4 in der Zwischenzeit voll durchgedrückt wurde.
Gleichzeitig werden in den beiden Aktivdatenworten Nr. 3 und Nr. 9 die Bits R3 und IE gesetzt, was
nach den Hacks von Stephan Heß ebenfalls auf den aktiven Regler am Anschluss 4 hinweist.
Damit sind die Grundlagen für eigene Analysen gelegt, eine erste praktische Anwendung
des Decodierers ist die
Carrera-Arduino Startampel.
Ich wünsche viel Spaß beim Nachbauen.
Experimentierkasten
Alle Dateien für eigene Experimente zum Download und auf einen Blick
- Fritzing Datei des Decodierers, Fritzing fzz-Datei, fzz
- Carrera CU als Fritzing Bauteil, Fritzing fzpz-Datei, fzpz
- Carrera CU, Fritzing Steckbrett Ansicht, Scalable Vector Grafic, svg
- Carrera CU, Fritzing Schaltplan Ansicht, Scalable Vector Grafic, svg
- Carrera CU, Fritzing Icon, Scalable Vector Grafic, svg
- Schaltplan des Decodierers, als PNG-Grafik, png
- Steckbrett Plan des Decodierers, als PNG-Grafik, png
- Tabelle der Datenworte im OpenDocument Format, ods
- "HelloWorld" Arduino Carrera Decode Sketch, ASCII-Text, ino
- "Inspektor" Arduino Carrera Decode Sketch, ASCII-Text, ino
Erstveröffentlichung: Februar 2013