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.
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.
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.
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.
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.
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.
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...
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.
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.
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.
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
- Carrera Protokoll Definitionen, Open-Document Datei, odg
- Carrera Protokoll Definitionen, PDF-Datei, pdf
- Schaltplan des Carrduino High-Side Treibers, gEDA Datei, sch
- Schaltplan des Carrduino High-Side Treibers, PDF-Datei, pdf
- Schaltplan des Carrduino High-Side Treibers, PNG Grafik, png
- Carrera Startschiene als vollständiges Fritzing Bauteil, Fritzing fzpz-Datei, fzpz
- Carrera Startschiene, Fritzing Steckbrett Ansicht, Scalable Vector Grafic, svg
- Carrera Startschiene, Fritzing Icon, Scalable Vector Grafic, svg
- Carrera Startschiene, Fritzing Schaltplan Ansicht, Scalable Vector Grafic, svg
- Vollständige Fritzing Datei des High-Side Codierers, Fritzing fzz-Archiv, fzz
- Steckbrett des High-Side Codierers, PDF-Datei, pdf
- Vollständiger Arudino Sketch des Protokoll Codierers, ASCII-Datei, ino
Erstveröffentlichung: Februar 2013
Letzte Aktualisierung: November 2013