Carrera Arduino Codierer
Die Carrera Wagen gehorchen auf mein Kommando. Erzeugung von gültigen Carrera Bits mit dem Arduino.


Als Gegenstück zum Protokollleser mit seinem Manchester-Dekodierer-Algorithmus benötige ich für diverse Carrera-Hacks einen einfachen Carrera Protokollgenerator. Mit einem solchen Generator möchte ich beispielsweise Streckenabschnitte unabhängig von der BB und CU kontrollieren, ein paar Ideen hierzu habe ich auf der Carrduino Startseite bereits skizziert. Am Ende könnte man mit dem Protokollgenerator sogar eine eigene Control Unit, die Carrduino-CU, mit Funktionen ganz nach seinen eigenen Vorstellungen bauen. Nachfolgend werde ich versuchen die Grundlagen zur Erzeugung von gültigen Carrera Datenworten zu erläutern.

Experimentieraufbau des Carrera Codierers Abbildung 1
Fliegender Aufbau der Codierer Hardware während der diversen Testphasen.


Für das Grundverständnis der Carrera Codierung habe ich ein möglichst einfaches und überschaubares Testszenario entwickelt. Es soll ein einziges, gültiges Reglerdatenwort erzeugt und zyklisch an die Wagendecoder "gesendet" werden. Reagieren die Wagen auf die von mir erzeugten Bits, ist der Codierer ein Erfolg. In meinem Fall habe ich mich für die Steuerung des Wagens an Reglerposition Nr. 3 mit der Geschwindigkeit 4 entschieden. Damit die Carrera Wagendecoder die Testbits akzeptieren, wird dieses Reglerdatenwort gemäß der Carrera Protokollspezifikation alle 75 ms wiederholt.

Zur Defintion des Encoders Abbildung 2
Das Reglerdatenwort-2 (Regler an CU-Position 3) in der vollständigen Carrera Protokollsequenz


Das Ganze funktioniert, weil die Wagendecoder nach ihrer Programmierung nur noch auf die für sie bestimmten Datenpakete filtern, den Rest ignorieren sie quasi. Das gilt sowohl für die D124/D132 Wagendecoder als auch für die von mir verwendeten D143 Decoder.

Die Hardware
Zur Ansteuerung der Wagen muss die Bahnspannung von ca. 20 Volt für jedes Bit kurz unterbrochen werden. Die übertragenen Bits sind dabei mit einer Taktrate von 100 µs Manchester codiert, die Details hierzu sind ausführlich auf den Seiten von Stefan Heß dokumentiert. Grundsätzlich kann man die Unterbrechung der Bahnspannung auf zwei Arten erzeugen. Erstens, in dem man die Verbindung zwischen Wagen und dem Minuspol oder Masse unterbricht und zweitens, in dem man vor den Wagen die Verbindung zum Pluspol unterbricht. Die nachfolgende Grafik veranschaulicht die Zusammenhänge.

Ansteuerung der Wagen als High-Side oder Low-Side Abbildung 3
Ansteuerung der Carrera Decoder in High-Side/N-Logik oder Low-Side/P-Logik


Je nachdem auf welcher Seite sich der Schalter befindet, spricht man von einer Low-Side oder High-Side Schaltung. Grundsätzlich sollten die Wagen-Decoder in beiden Schaltungen gleich gut funktionieren. Allerdings ist die Low-Side Schaltung für den Einsatz als Carrera Bahn weniger geeignet. Grund ist, dass die Bahnschienen bei geöffnetem Schalter in der Low-Side Schaltung unter Spannung stehen, in der High-Side Variante sind die Schienen dagegen potentialfrei und im Idealfall geerdet. Bei geöffnetem Schalter ergibt sich in der Low-Side Schaltung zumindest theoretisch die Gefahr, dass man Kurzschlüsse zwischen einer beliebigen Schiene und einer externen, dritten Masse herstellt, kurz gesagt, einen gewischt bekommt. Daher entscheide ich mich für die High-Side Variante und damit einen P-Kanal MOSFET als Schalter.

Erste Experimente mit P-Kanal MOSFET und Arduino Abbildung 4
Erste Experimente mit dem Arduino und einem P-Kanal MOSFET, als Last verwende ich ein 12V Halogenbirnchen


Der Widerstand R1 ist ein sogenannter Arbeitswiderstand und sorgt dafür, dass auf den Schienen auch dann ein sauberes Signal ankommt, wenn kein Wagen als Last auf den Schienen steht oder fährt. Insbesondere im Stillstand sind die Wagen sehr hochohmig, was bei fehlendem R1 dazu führen kann, dass die Signale durch die Leitungskapazität der Bahn und die Kapazitäten des Transistors "verschliffen" werden. Man sagt, die Bahn läuft quasi kapazitiv voll und kann sich das so vorstellen, als ob die Elektronen wegen der hohen Widerstände von der Plus-Schiene der Bahn (Bahn +) nicht schnell genug gegen Masse abfließen können. Der Arbeitswiderstand R1 muss also so gering gewählt werden, dass auch im Leerlauf ein sauberes Signal bei den Decodern ankommt. Die Spannung muss unter allen Bedingungen die volle Bandbreite zwischen GND und bis zu 20 Volt abdecken. Der Widerstand R1 darf anderseits auch nicht zu gering gewählt werden, sonst würde die meiste Energie über den Widerstand abgeleitet und nicht bei den Wagen ankommen. Mit 500 Ω habe ich bei den ersten Experimenten und kurzen Bahnen sehr gute Erfahrungen gemacht. Man kann R1 noch deutlich weiter reduzieren, damit können dann auch längere Bahnen angesteuert werden, allerdings steigt auch die Verlustleistung. Bei 18V und 500 Ω sind es immerhin schon 0,6 Watt, der Widerstand wird also ordentlich warm.

Schaltplan Arduino Carrera Codierer Abbildung 5
Schaltplan des max. 20V P-Kanal MOSFET Treibers.


Der Schalter aus Abbildung 3 wird im Testaufbau durch einen P-Kanal MOSFET ersetzt. Der Arduino kann mit seinen 5V Logikausgängen einen Standard P-MOSFET nicht direkt ansteuern. Dieser benötigt Steuerspannungen von 10 bis 15 Volt, um einen minimalen Einschaltwiderstand zu erreichen. Das Gate wird daher über einen Pegelwandler, bestehend aus einem Standard NPN Transistor Q2 und dem Widerstand R3, angesteuert. Schaltet der Transistor Q2 durch, liegt das Gate des MOSFET nahezu auf Masse und die Gate-Source Spannung liegt damit bei -Vcc, der P-MOSFET steuert also voll durch. Sperrt dagegen Q2, wird das Gate über R3 auf das Potential der Versorgungsspannung angehoben. R3 darf wegen der Miller-Kapazität des MOSFET nicht zu groß gewählt werden, ansonsten kann das Gate nicht mehr schnell genug umgeladen werden. Das Gate würde sich in diesem Fall langsam immer weiter negativ aufladen und der MOSFET steuert irgendwann dauerhaft durch.

Steckbrett Ansicht des ersten Carrera Codierers Abbildung 6
Aufbau des Carrduino Codierers auf dem Steckbrett


MOSFET Q1 und Transistor Q2 invertieren jeweils das vom Arduino kommende Signal. Mit dieser doppelten Invertierung ist die Phasenlage von Bahnsignal und Arduino am Ende wieder identisch. Ein HIGH am Ausgangspin des Arduinos sorgt für eine Bahnspannung von 20V und ein LOW am Arduino zieht die Bahnspannung auf GND. Die Diode D1 dient als Freilaufdiode für eventuelle Störungen durch die Autos und schützt somit den MOSFET vor rückwärtigen Spannungsspitzen. Achtung! R1 vernichtet im Leerlauf die komplette Bahnspannung von bis zu 20 Volt. Damit er der Dauerbelastung statt hält, muss es ein 1 Watt Typ sein, was in der Fritzing Grafik nicht direkt ersichtlich ist. Bei den beiden anderen Widerstände kommen die üblichen 1/4 Watt Typen zum Einsatz. Beim Nachbau bitte auf die Polung des NPN-Transistors achten, die Darstellung in der Fritzing Grafik kann schon mal für Verwirrung sorgen. Und im Testbetrieb immer schön auf die Finger aufpassen, R1 wird je nach Versorgungsspannung lecker warm. Ich war leider wenig lernfähig und habe mir ein paar nachhaltige Spuren in die Finger gebrannt, als ich verschiedene Widerstandswerte im realen Betrieb testen wollte...

MOSFET und Leistungswiderstand auf der Carrera CU Abbildung 7
Der P-Kanal MOSFET und der 120 Ω, 3 Watt Arbeitswiderstand auf der Platine der Carrera CU


Ein Blick auf die Platine der CU verrät, dass die Techniker bei Stadlbauer den selben Weg bei der Entwicklung der CU-Platine gegangen sind. Als P-Kanal MOSFET arbeitet in meiner CU ein D417 der Firma Alpha & Omega Semiconductors. Der Transistor ist spezifiziert für eine maximale Drain-Source Spannung von 30 Volt sowie einer Gate-Source Spannung von 20 Volt und verträgt dauerhaft 20 Ampere, er passt also ziemlich genau an die Bedingungen der Carrera Bahnen. Bei R1 ist Stadlbauer etwas mutiger als ich und hat den Widerstand auf radikale 120 Ω gesenkt. Bei 18 Volt Versorgungsspannung werden damit im Leerlauf 2,7 Watt in dem Widerstand verbraten, dementsprechend ist R1 ein 3 Watt Typ und damit das größte Bauelement auf der Platine. Der geringe Widerstand hat natürlich den Vorteil, dass Leitungskapazitäten der Bahnen weniger Einfluss auf die Signalqualität haben können.

Software
Solange nur das eine Datenwort übertragen wird, ist das Gesamtprogramm des ersten Codierers sehr einfach und überschaubar. Der Regler an der CU-Position Nr. 3 wird im Reglerdatenwort-2 übertragen. Zur Erinnerung: Das Reglerdatenwort-2 ist gemäß der Beschreibungen zum Protokolldecodierer zehn Bits lang und wie folgt aufgebaut.

Regler Datenwort Nr. 2 Abbildung 8
Aufbau des Reglerdatenworts-2.


Die Geschwindigkeit wird auf Stufe 4 festgesetzt, die Spurwechseltaste soll nicht gedrückt sein und die Tankfunktion ist deaktiviert. Somit wird das Reglerdatenwort den folgenden, binären Aufbau haben: 1010001000 was dezimal der 648 entspricht. Die Hauptschleife übergibt diesen Wert in einem Intervall von 7,5 ms an den Carrera Codier Algorithmus, der aus dem dezimalen Wert die Manchester Bits für die Bahn generiert. Die Umwandlung der logischen Werte in Manchester Code wird wie beim Decodierer in einer eigenen Seite beschrieben.

Der Codierer erzeugt also anstelle der 10 unterschiedlichen Datenworte alle 7,5 Millisekunden das Reglerdatenwort-2.Die Decodierer in den Wagen bekommen somit die Bits und Worte in der sonst üblichen, zeitlichen Folge, allerdings immer dieselben Bits. Ich bin mir noch nicht sicher ob, die Wagen auf jedes Wort reagieren, oder ob sie nach Empfang des gültigen Wortes die nächsten Bits ignorieren, da normalerweise das nächste für sie gültige Wort erst nach der "protocolSequenz" (siehe Abbildung 2) von 75 ms ankommen würde.

Die oben beschriebene MOSFET Treiberstufe wird an den Pin 3 des Arduinos angeschlossen. Nachfolgend findet ihr hier den reduzierte Arduino Sketch zur Ansteuerung der Stufe. Den vollständigen und kommentierten Code findet ihr wie immer in meinem Experimentierkasten am Ende der Seite.
const int dataOutPin = 3;                                                                                       
const long wordRateMicros = 7500;

unsigned long intervalWordMicros = 0;                       
unsigned long previousWordMicros = 0;                       
unsigned long currentMicros  = 0;                           

void setup() {                                                                                   
  pinMode(dataOutPin, OUTPUT);                             
  digitalWrite( dataOutPin, HIGH );                         
}                                                           

void loop() {                                               
  currentMicros = micros();                                 
  intervalWordMicros = currentMicros - previousWordMicros;  
  if (intervalWordMicros > wordRateMicros) {                
    previousWordMicros = currentMicros;                     
    manchesterEncode( 648 );}        // binary: 0000001010001000, controller 2, speed 4
}                                                           

void manchesterEncode(word dataWord){  
  // for more see:  http://www.wasserstoffe.de/carrera-hacks/manchester-encode/index.html                          
}
Programmiert man an einer CU, BB oder RB ein Fahrzeug auf den Regler Nr. 3 und setzt diesen Wagen auf eine Bahn, die vom Carrduino Codierer kontrolliert wird, so zieht dieser Wagen brav und artig relativ langsam seine Runden. Damit ist es geschafft, ich kann tatsächlich mit relativ einfachen Mitteln gültige Bits für die Carrera Decoder erzeugen. Der Arduino kann also ohne Weiteres die volle Kontrolle über die Bahn übernehmen.

Arduino steuert zwei D143 Wagen Video 1
Zwei D143 Wagen werden mit konstanter Geschwindigkeit Stufe 8 (Reglerdatenwort 656 dezimal) angesteuert.


Ausblick
Der vorgestellte Codierer ist der Grundbaustein für eine vollständige Carrera Arduino Control Unit, die Carrduino-CU, CCU. Allerdings sind dazu sowohl in der Hardware als auch in der Software noch ein paar Anpassungen notwendig. Zunächst wird der Arduino Sketch soweit angepasst, dass alle zehn Datenwörter zyklisch gesendet werden und nicht nur ein einziges. Im nächsten Schritt wird die Zeitzählschleife (micros) durch Timer und entsprechende Interrupts ersetzt. Damit wird der Prozessor entlastet und die Wiederholrate der Datenworte kann exakter eingehalten werden. In der darauf folgenden Ausbaustufe werden die statischen Reglerdatenworte durch dynamische ersetzt. Der Geschwindigkeitswert wird dazu über ein Poti ermittelt und in einer Variablen gespeichert. Es folgen Spurwechseltaste und damit auch die Möglichkeit die Wagen zu programmieren. Die Rückmeldungen der Peripherie an die CCU erfordern dann noch mal ein paar wesentliche Änderungen an Hard- und Software und bilden damit einen letzten, wesentlichen Entwicklungsschritt der CCU.

Luxus Codierer mit einer Gegentakt Endstufe Abbildung 9
Planungen für den Carrduino Luxus Codierer mit einer Gegentakt MOSFET Endstufe.


Die High-Side Beschaltung über den P-Kanal MOSFET und den Arbeitswiderstand R1 ist für die Testaufbauten zweckmäßig, weil sie übersichtlich und damit leicht nachvollziehbar ist. Auch im Hinblick auf möglichst niedrige Herstellungskosten ist die Schaltung sicherlich sinnvoll. Als Selbstbauer habe ich allerdings die Freiheit es besser zu machen. Super edel wäre beispielsweise die in Abbildung 9 gezeigte Gegentakt-MOSFET Endstufe. Damit sind saubere und steile Signalflanken möglich, Bahnkapazitäten haben noch weniger Einfluss auf die Signalqualität und die Verluste durch den sonst notwendigen Widerstand fallen fast komplett weg. Hier ist also noch viel Spielraum für weitere Hacks...

Experimentierkasten
Alle Dateien für eigene Experimente zum Download und auf einen Blick

  1. Carrera Protokoll Definitionen, Open-Document Datei, odg
  2. Carrera Protokoll Definitionen, PDF-Datei, pdf
  3. Schaltplan des Carrduino High-Side Treibers, gEDA Datei, sch
  4. Schaltplan des Carrduino High-Side Treibers, PDF-Datei, pdf
  5. Schaltplan des Carrduino High-Side Treibers, PNG Grafik, png
  6. Carrera Startschiene als vollständiges Fritzing Bauteil, Fritzing fzpz-Datei, fzpz
  7. Carrera Startschiene, Fritzing Steckbrett Ansicht, Scalable Vector Grafic, svg
  8. Carrera Startschiene, Fritzing Icon, Scalable Vector Grafic, svg
  9. Carrera Startschiene, Fritzing Schaltplan Ansicht, Scalable Vector Grafic, svg
  10. Vollständige Fritzing Datei des High-Side Codierers, Fritzing fzz-Archiv, fzz
  11. Steckbrett des High-Side Codierers, PDF-Datei, pdf
  12. Vollständiger Arudino Sketch des Protokoll Codierers, ASCII-Datei, ino


Erstveröffentlichung: Februar 2013
Letzte Aktualisierung: November 2013

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