Modellbahn-Signaldecoder
Ich habe in letzter Zeit ein Signal für Gartenbahn mit einem eigenen Digitaldecoder gebastelt. So sieht das aus:
Verschiedene Menschen haben mir gesagt, dass das interessant sei, aber sie haben keine Ahnung was ich hier genau mache. In diesem Post will ich mal versuchen, zu erklären, was diese elektronische Schaltung macht:
Das hier ist der Schaltplan:
Und nun versuche ich zu erklären, was das soll und was das tut.
(Und weil die Zielgruppe Leute sind, die sich noch nie mit diesem Thema beschäftigt haben, gleich der Hinweis: Für Leute, die sich mit Elektronik auskennen, ist das vermutlich nicht furchtbar interessant. Außerdem möchte ich auch nicht behaupten, dass ich mir das alles selbst überlegt hätte. Das meiste Wissen hier kommt in dem ich OpenDCC und Mikrocontroller.net gelesen habe; aber ich habe sicher Fehler gemacht und die Leute dort sind definitiv nicht verantwortlich dafür.)
Das Ziel
Zuerst mal müssen die Anforderungen geklärt werden. Mein Ziel ist es, amerikanische Signale vom Typ “Searchlight” (Suchscheinwerfer) zu bauen. Diese Signale haben eine bis drei Lampen. Jede von denen kann über ein interessantes elektromechanisches System verschiedene Farben anzeigen (bis zu drei verschiedene gewählt aus vier verschiedenen Typen).
Dieses mechanische System ist für Modellbahnzwecke nicht praktisch machbar. Statt dessen brauche ich etwas elektronisches. Drei verschieden farbige Leuchtdioden nebeneinander wären etwas groß, und man würde erkennen dass es nicht eine einzige Lichtquelle ist. Es gibt Leuchtdioden, die rot, grün und blau in einem Gehäuse enthalten. Das ist schon besser, aber es ergibt viele Kabel die alle irgendwie im Mast stecken müssen. Die Lösung sieht daher so aus:
Dies ist eine “addressierbare LED”, besser bekannt unter dem Namen Neopixel unter dem ein großer amerikanischer Händler viele verschiedene solcher Typen verkauft. Das besondere ist, dass in ihr ein kleiner Kontrollchip steckt, der die angezeigte Farbe bestimmt. Jede dieser LEDs braucht exakt vier Kabel: Plus (fünf Volt), Minus, Daten rein und Daten raus. Das “Daten raus” der ersten LED kann man direkt mit dem “Daten rein” der zweiten verbinden. Wenn man noch die Kabel für die Stromversorgung verbindet, dann kann man beliebig viele LEDs mit nur drei Kabeln betreiben.
Auf die Datenleitung muss man in einem bestimmten Format schreiben, welche LED welche genaue Farbe kriegen soll. Dafür muss die Spannung ständig zwischen 0 (aus) und 5 Volt (an) gewechselt werden. Die Länge der An-Phase entscheidet ob logisch eine 0 oder 1 übertragen wird. Daraus entstehen die Bytes, die dann die Farbwerte enthalten.
Wegen dieses speziellen Datenformats ist klar, dass es hier eine elektronische Schaltung braucht, und auch die grundlegenden Anforderungen:
- Die Schaltung muss 5V Gleichstrom bereitstellen
- Und die nötigen Daten für die Leuchtdiode im richtigen Format generieren
Der Eingang
Auf der Eingangsseite gibt es viele Optionen. In meinem Fall gehe ich davon aus, dass das Signal mit den Gleisen einer Modellbahn verbunden ist, und dass die Modellbahn digital gesteuert ist. Bei einer digital gesteuerten Modellbahn liegen konstant meistens um die 15 Volt bis um die 25 Volt Spannung an; bei kleinen Bahnen weniger, bei großen Gartenbahnen mehr. Diese Spannung wechselt ständig die Polarität; zuerst ist + auf der linken und - auf der rechten Schiene, dann wieder umgekehrt, dann wieder zurück. Es ist sehr ähnlich wie eine Wechselspannung im normalen Hausnetz, allerdings mit möglichst abrupten Wechseln statt der sanften Sinuswelle.
Diese Spannung hat zwei Aufgaben. Zuerst mal versorgt sie die Loks mit Strom, und andererseits überträgt sie Informationen: Wenn eine Wechsel-Hin-und-zurück-Sequenz kurz ist, bedeutet das eine “1”, wenn sie lang ist, bedeutet das eine “0”. Aus diesen beiden Bits setzen sich dann Bytes zusammen, aus denen wieder Nachrichten bestehen, die z.B. sagen “Lok 3 fahre Geschwindigkeitsstufe 64” oder “Weiche 10 schalte nach links”.
In diesem Decoder nutze ich beides: Die Digitalspannung liefert sowohl die Daten als auch den Strom. Für Loks ist das unvermeidlich, da dort nur die beiden Gleise als Leiter zur Verfügung stehen. Stationäre Geräte wie diesen Decoder könnte man aber auch so entwerfen, dass sie z.B. eine externe Stromversorgung kriegen. In diesem Fall will ich aber möglichst wenige Kabel haben, daher nehme ich hier die einfache Variante.
Damit stehen weitere Anforderungen auf der Eingangsseite fest. Die Schaltung muss:
- Aus der Digitalspannung (15 Volt, Wechselstrom-artig) eine Gleichspannung mit 5 Volt machen
- Das Digitalsignal verarbeiten (decodieren, daher die Bezeichnung Decoder) und daraus die zu zeigenden Farben berechnen.
Berechnung
Diese Umsetzung der Daten ist der entscheidende Punkt hier. Das Digitalsignal hat ein komplett anderes Format als die Leuchtdioden erwarten; deutlich langsamer, aber auch mit ganz anderen Bedeutungen. Speziell kommt dort die Nachricht “Setze Weiche/Signal 10 auf Zustand 0”. Welche Farbwerte das heißt muss jedes Signal selbst festlegen. Es gibt hier keine einfache Schaltung aus wenig Teilen die so etwas machen kann; ich brauche hier einen kompletten Computer.
Praktischerweise gibt es die in erstaunlich klein und billig.
Der ATtiny85 kostet je nach Bestellmenge circa 1€, und er ist kleiner als eine 1-Cent-Münze, aber technisch gesehen ist er im Prinzip ein vollwertiger Computer. Er enthält fast alles wichtige: Eine CPU die (je nach Version) bis zu 20 MHz kann; ein halbes Kilobyte RAM und 8 Kilobyte internen Speicher für das Programm (mehrere Programme wird eher schwierig). Wer Arduinos kennt: Der ATtiny85 ist mit dem ATmega328p im Arduino Uno und Nano verwandt, aber weniger leistungsfähig, dafür billiger und deutlich kleiner.
Was fehlt ist natürlich das meiste drumherum, wie Tastatur und Bildschirm zur Ein- und Ausgabe. Dieser Chip ist vorgesehen für Anwendungen wo so etwas nicht oder nur in sehr geringem Maße gebraucht wird. Bei diesem Chip kann in der Software fast jeder Pin (gut, hier fünf von acht) auf verschiedene Aufgaben programmiert werden: Er kann als Eingang arbeiten, und der Software sagen ob ein niedriger oder hoher Pegel anliegt, also 0 oder 5 Volt, und er kann auch als Ausgang arbeiten und dann explizit einen hohen oder niedrigen Wert schreiben, d.h. den Ausgang auf 5 bzw. 0 Volt legen.
Es gibt auch noch weitere Funktionen für die Pins, z.B. kann er auch analoge Spannungen messen und im begrenzten Maße ausgeben, aber für diese Anwendung brauche ich nur die digitalen Ein- und Ausgänge.
Solche Chips, genannt Microcontroller, gibt es in tausenden Variationen mit sehr unterschiedlichen Leistungen. Sie stecken in so ziemlich allem, was digital gesteuert wird. Waschmaschinen, alles Computerzubehör, jedes einzelne Apple-Lightning-Kabel, Fernseher, Fernbedienungen, erstaunliche Mengen an Komponenten im Auto und so weiter sind alles die Domänen von diesen Mikrocontrollern. Der ATtiny85 ist, wie der Name schon andeutet, eindeutig am untersten Ende der Skala hier (aber es gibt auch noch kleinere), und inzwischen auch da etwas veraltet. Aber er ist sehr leicht zu programmieren und wenig anspruchsvoll, was ihn im Hobbybereich gut macht.
Zum Arbeiten braucht der Chip Gleichstrom im Bereich 3-5 Volt (manche Versionen wie dieser hier können auch weniger) und exakt einen Kondensator. Die 5 Volt Gleichspannung müssen eh schon für die LEDs generiert werden, daher kriegt der Chip sie auch ab. Damit sind für die Berechnung aus Hardware-Sicht nur zwei Bauteile nötig.
Wofür aber noch Hardware nötig ist, ist die Frage, wie man das Programm auf den Chip kriegt. Dafür braucht man einen Programmierer, ein Gerät das man teuer kaufen oder erstaunlich einfach mit einem Arduino selbst bauen kann. Dieser muss mit sechs Kabeln mit dem Chip verbunden werden. Die Standardlösung ist über einen sechspoligen Pfostenstecker, der daher auch hier auf den Decoder muss. Dafür gibt es zum Anschluss Standardkabel.
Man könnte die Kabel auch anders anschließen, zum Beispiel den Decoder auf eine Programmierplatine mit Federkontakten (die man dafür machen müsste) legen, oder im schlimmsten Fall die Kabel temporär anlöten. Aber diese Lösung ist flexibel und einfach, mit dem einzigen Nachteil dass sie den Decoder etwas pieksig macht.
5 Volt Gleichspannung
Die 5V Gleichspannung sind einerseits ein relativ langweiliges Thema im Verhältnis zur aufwändigen Software. Andererseits beschäftigt sich sehr viel der Hardware damit, und es ist die absolute Grundlage des Decoders. Prinzipiell besteht das Problem aus zwei Teilen:
Gleichspannung
Dafür nutze ich hier einen Brückengleichrichter; eine Schaltung aus vier Dioden.
Die Dioden sind so angeordnet, dass sie immer so auf leitend bzw. sperrend schalten, dass die Schiene, die gerade + ist, mit dem internen “+” verbunden ist, und die Schiene, die gerade “-” ist, mit dem internen “-” (auch Masse oder Ground genannt und GND abgekürzt).
Um die Schaltung zu vereinfachen nutze ich hier Doppeldioden; das sind einfach Bauteile die zwei Dioden in einem Gehäuse enthalten, die miteinander und den drei Beinen verbunden sind.
Das erste (unterste) Bein geht an die Kathode der ersten Diode; das mittlere ist mit der Anode der ersten Diode und der Kathode der zweiten verbunden, und das dritte ist mit der Anode der zweiten Diode verbunden. Damit brauche ich nur zwei Bauteile um vier Dioden zu haben. Es gibt auch Gleichrichter als integriertes Bauteil mit vier Dioden, aber diese sind eher für Wechselstrom optimiert und hier nicht ideal.
5 Volt
Das Ergebnis ist, je nach Digitalspannung, etwa 15 bis 25 Volt (höher bei Gartenbahnen). Das brennt sofort die Leuchtdioden und den Mikrocontroller durch. Daher braucht es hier einen Spannungsregler.
Der Spannungsregler hier, der UA78M05, ist ein relativ komplexer Schaltkreis der im wesentlichen einen Transistor hat, der Strom durchleitet, und dann eine Schaltung, die vergleicht, ob die Ausgangsspannung den erwarteten 5V entspricht, und dann je nach Bedarf den Transistor weiter auf oder weiter zu macht. Er braucht ein paar zusätzliche Kondensatoren auf Eingabe- und Ausgabeseite um stabil zu arbeiten.
Eine kleine Gemeinheit hier ist die zusätzliche Diode.
Im normalen Betrieb sperrt diese. Das heißt sie tut nichts und könnte auch weggelassen werden. Beim Programmieren des Mikrocontrollers gibt es aber das Problem, dass die 5V Gleichspannung von außerhalb, vom Programmierer-Gerät kommen. Dann hat der Spannungsregler links 0 Volt, weil kein Gleis angeschlossen ist (sicherheitshalber), und rechts 5 Volt vom Programmierer. Das mag dieser Regler nicht, und er kann dadurch kaputt gehen. Die Diode leitet in diesem Fall die 5V (ungefähr, es fallen etwa 0,7 Volt an der Diode ab) auf die linke Seite weiter. Damit arbeitet der Spannungsregler nicht, aber er geht auch nicht kaputt.
Die genaue Diode hier (eine 1N4148) habe ich genommen, weil ich davon noch welche da hatte.
Der ganze Spannungsregler ist eine sehr einfache Lösung, aber keine gute. Im Prinzip arbeitet er wie ein sich selbst einstellender Widerstand, was auch heißt, dass der Strom, der durch ihn durch geht, vorne und hinten gleich ist und nur die Spannung abfällt. Wenn hinten 5 Volt mit 20 Milliampere rauskommen, dann müssen vorne 15 Volt mit 20 Milliampere reinkommen. Die Differenz von 10 Volt mal 0,02 Ampere gleich 0,2 Watt wird in Wärme umgesetzt. Das ist sehr ineffizient, und erzeugt auch neue Probleme, denn andere Teile der Schaltung dürfen nicht zu warm werden. 0,2 Watt klingt nicht nach viel, aber der Decoder wird schon wärmer als es vielleicht aussieht. Ich denke mit nur drei Leuchtdioden ist es noch im vertretbaren Rahmen, aber es geht auch noch besser.
Die schönere Lösung ist ein sogenannter Schaltregler, der aber mehr zusätzliche Komponenten braucht und deutlich aufwändiger zu konstruieren ist. Für die nächste Version vom Decoder werde ich das mal probieren.
Eingabe
Um das DCC-Signal zu lesen, reicht es, ein einzelnes Gleis auszulesen. Wenn das Gleis gerade das “Plus” Gleis ist, hat es eine klar erkennbare hohe Spannung im Verhältnis zu dem Minus bzw. 0 Volt auf der Schaltung. Wenn es gerade das “Minus” Gleis ist, dann ist es über den Gleichrichter direkt mit der Schaltungsmasse bzw. 0 Volt verbunden. Mit dieser Schaltung kann man zwar “Gleis ist Minus” und “Gleis hat keinen Strom” nicht unterscheiden, aber für einen fest verkabelten Decoder ist das nicht weiter wichtig.
Das Problem ist, dass das Gleis, wenn es gerade Plus ist, eine Spannung von 15 Volt im Verhältnis zur Masse hat. Das ist zu viel für die Pins des Mikrocontrollers. Um das zu lösen nutze ich hier eine Schaltung mit einer Z-Diode.
Die Besonderheit einer Z-Diode (auch bekannt als Zener-Diode, was technisch aber nur für manche von denen richtig ist), ist, dass sie in Sperrrichtung bei einer bestimmten Spannung doch anfängt zu leiten. Hier nutze ich eine für 4,7 Volt. Wenn am Eingang 4,7 Volt oder mehr anliegen, lässt sie so viel Strom durchfließen, dass der Spannungsabfall über die Diode ziemlich exakt 4,7 Volt beträgt; genug um als “an” vom Mikrocontroller erkannt zu werden.
Die Menge Strom, die die Z-Diode leitet, kann sehr schnell sehr groß werden, was dann wiederum die Diode zerstören kann. Deswegen ist ein ziemlich großer Vorwiderstand in der Leitung, um sicherzustellen, dass nur möglichst wenig Strom durchfließt. Der Mikrocontroller selbst braucht keinen Strom aus dem Pin, er misst nur die Spannung. Damit kriegt der Controller immer mit, ob hier eine hohe oder niedrige Spannung anliegt, und kann darüber das DCC-Signal auslesen.
Eine kleine Besonderheit noch: Wie jede Diode hat eine Z-Diode nur zwei Enden, die verbunden werden müssen. Die, die ich hier verwende, kommt aber in einem Gehäuse mit drei dieser Beinchen (es ist tatsächlich das gleiche Gehäuse wie auch die Doppeldioden im Gleichrichter). Ich habe keine Ahnung wieso. Das dritte Beinchen, hier oben rechts, ist intern nicht angeschlossen, und führt auf der Platine nirgendwo hin. Es ist nur festgelötet damit die Z-Diode stabil hält. Damit besteht aber zumindest keine Gefahr, dass man die Diode versehentlich falschrum einbaut.
Bonus: Der Decoder funktioniert auch wenn ich die Z-Diode weglasse und nur den Vorwiderstand nehme. Das habe ich schon getestet. Die zu hohe Spannung, die hinten ankommt, wird über eingebaute Schutzdioden im Mikrocontroller abgeleitet hin zur 5V Versorgungsspannung. Irgendwie. Ich habe nicht 100% Verstanden was da genau passiert und vor allem, wie ich es berechne (ich weiß aus dem Internet das 22 bis 33 Kiloohm hier gut funktionieren, aber ich weiß nicht wieso), deswegen nutze ich lieber die Lösung mit Z-Diode, die für mich klarer verständlich ist. In der nächsten Version des Decoders, die noch mal mehr Komponenten anderswo kriegt, werde ich aber vermutlich darauf verzichten.
Ausgabe
Die Ausgabelogik für den Mikrocontroller ist sehr einfach, denn es gibt keine. Ein Pin des Controllers ist einfach direkt mit der Datenleitung der LED verbunden.
Best-Practices-Anleitungen für diese LEDs empfehlen, noch einen zusätzlichen Widerstand einzubauen, nahe an der LED dran. Da ich maximal drei dieser LEDs anbauen will (vielleicht bis zu 10 falls ich mal eine Signalbrücke baue), habe ich das bisher nicht gebraucht. Wenn doch würde ich den Widerstand vermutlich an die Leuchtdiode anlöten.
Damit ist der Decoder fertig. Na ja, fast.
Ausgabe Teil 2: Bestätigten
Ein Problem bei klassischen digitalen Modellbahnen ist, dass das Protokoll nur in eine Richtung geht. Es gibt keine Möglichkeit für den Decoder Daten zurück zu liefern. Kein Teil der Schaltung hier kann wieder Strom auf die Gleise liefern oder ähnliches.
Meistens ist das kein Problem. Aber gerade wenn ein Digitalsystem einen Decoder einrichten will, zum Beispiel um die Adresse zu setzen, dann wäre es schön wenn man den bestehenden Wert auslesen kann oder mitkriegt, ob der neue Wert gesetzt wurde. Dafür gibt es einen kleinen Hack: Der Decoder in der Lok soll, wenn eine Bestätigung gefordert ist, einfach kurz den Motor der Lok anschalten. Damit erhöht sich der Stromverbrauch des Decoders, und das kann gemessen werden.
Das Problem für meinen Decoder ist, dass kein Motor angeschlossen ist. Er muss also den Stromverbrauch irgendwie anders erhöhen. In der ersten Version hat er das gemacht, in dem er die Leuchtdiode auf voll weiß geschaltet hat. Das funktioniert sogar erstaunlich gut, aber es gibt auch Szenarien wo das nicht reichen könnte, zum Beispiel wenn ich für Spur N kleinere Leuchtdioden mit weniger Leistung nehme.
Die Lösung also: Einfach den Strom über einen Widerstand fließen lassen. Der Widerstand muss ein etwas größeres Gehäuse haben als die anderen, weil er mehr Leistung aushält. Vermutlich würde es einer in einem kleineren Gehäuse auch tun, da die Leistung nur selten und nur kurz (sechs Millisekunden) benötigt wird und er daher nicht so warm werden sollte, aber sicher ist sicher.
Wer genau hinsieht erkennt vielleicht, dass die Schaltung und die Platine beide 47 Ohm sagen, aber der Widerstand selbst 68 Ohm hat. Da habe ich noch mal nachgerechnet und meine Meinung geändert nach dem ich die Platine schon bestellt hatte.
Dieser Widerstand kann nicht direkt mit einem Pin des Mikrocontrollers verwendet werden, da der Mikrocontroller nicht so viel Strom aushält. Daher nutze ich hier einen kleinen Transistor, speziell einen MOSFET vom Typ 2N7002. Der ist schön einfach: Wenn der Mikrocontroller den Ausgabe-Pin auf 5V legt, dann leitet er, wenn er auf 0V geht, leitet er nicht. Weitere Beschattung ist bei diesem Typ nicht nötig.
Das Hauptproblem mit diesem Transistor ist, dass er schon das dritte unterschiedliche Ding im gleichen Gehäuse ist. Es ist genau das gleiche Gehäuse, bekannt als SOT-23, wie auch bei der Z-Diode und den Doppeldioden für den Gleichrichter.
Wenn man sehr viel Licht draufstrahlt, dann kann man vielleicht erkennen, dass jedes dieser Teile beschriftet ist. Diese Beschriftung ist selbst unter den besten Umständen sehr schwer lesbar und ist nur ein Code für das Bauteil; man muss hinterher immer noch in einer Tabelle nachschauen. Im Endeffekt heißt das: Die Bauteile immer in ihrer (beschrifteten) Verpackung lassen, bis man sie braucht, und dann sofort wieder zurück, damit erst gar keine Verwirrung aufkommt.
(Was ich hier bewusst ignoriert habe: Es gibt unter dem Namen Railcom eine recht komplexe Erweiterung des Standards mit dem Decoder antworten können; dafür ist auf dem Decoder zusätzliche Hardware nötig, die ich hier nicht eingebaut habe. Ich müsste dafür vermutlich auch einen anderen Typ Mikrocontroller nehmen.)
Schluss
Das ist alles, was an dem Decoder wirklich dran ist. Den Schaltplan und die Leiterplatte habe ich mit Eagle entworfen. Ich kann nicht behaupten, dass mir das Prorgamm 100% gefällt, aber es kann alles und ist für meine Zwecke auch kostenlos. Damit habe ich auch die Leiterplatte entworfen. Gefertigt wurde sie bei Aisler, wo es Leiterplatten in dieser Größe (ca 2 x 2,5cm) schon ab etwas über 6€ für drei Stück gibt. Zusammengelötet ist das ganze per Hand, und es funktioniert tatsächlich.
Geschrieben am 29. August 2021 um 12:43