Carrera Protokolldecodierer mit Arduino
"Hello World" - wie man mit möglichst geringem Aufwand das Carrera Datenprotokoll sichtbar machen kann.


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.

Fortgeschrittene Experimente mit dem Arduino-Protokollleser 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:

Aufbau des Dekodierers 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.

Datenpaket auf der Carrera D132 Schiene 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.

Schaltplan des Dekodierers 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.

Störfeuer durch Fahrzeuge und Weichen 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.

Aufbau der Datenpaket auf der Carrera Schiene 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.

Ausgabe des Inspektors auf der seriellen Schnittstelle 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

  1. Fritzing Datei des Decodierers, Fritzing fzz-Datei, fzz
  2. Carrera CU als Fritzing Bauteil, Fritzing fzpz-Datei, fzpz
  3. Carrera CU, Fritzing Steckbrett Ansicht, Scalable Vector Grafic, svg
  4. Carrera CU, Fritzing Schaltplan Ansicht, Scalable Vector Grafic, svg
  5. Carrera CU, Fritzing Icon, Scalable Vector Grafic, svg
  6. Schaltplan des Decodierers, als PNG-Grafik, png
  7. Steckbrett Plan des Decodierers, als PNG-Grafik, png
  8. Tabelle der Datenworte im OpenDocument Format, ods
  9. "HelloWorld" Arduino Carrera Decode Sketch, ASCII-Text, ino
  10. "Inspektor" Arduino Carrera Decode Sketch, ASCII-Text, ino


Erstveröffentlichung: Februar 2013

Home / Carrera-Hacks   -   CC BY-NC-SA   -   Impressum   -   Kontakt
Powered by: bluefisch, Arduino, Fritzing, LibreOffice , Inkscape and the gimp