top

DCC-Stellwerk mit Fahrstraßenspeicher

Gerd Heinz

Inhalt


Hier wird ein kleines Weichenstellwerk für DCC (Digital Command Control, Fa. Lenz) auf Basis von XpressNET* für Anlagen mit bis zu dreißig bzw. einhundert Weichen vorgestellt. Dessen Besonderheit besteht darin, daß sich (ohne PC) bis zu dreißig Fahrstraßen als Schaltfolgen von jeweils 30 bzw. 100 Weichen speichern lassen. Je nach Hardware lassen sich mit einem Arduino-MEGA (ATmega2560) dreitausend Weichen speichern, mit einem Arduino-NANO (ATmega328) sind es neunhundert.

Die Aufgaben

Die Weichen einer größeren H0-Anlage mit 24 Weichen wurden bislang teils mit Tastschaltern, teils mit Hand gestellt. Je größer eine Anlage aber wird, umso mehr wird das schnelle Finden einer Weiche zum Problem. So entstand der Wunsch nach einem Stellwerk, daß es gestattet, Abfolgen von Weichenstellungen abzuspeichern, die auf Knopfdruck vordefinierte Fahrstrecken automatisch stellen.

Große Modellbahnanlagen kommen mit PC-gesteuerten Stellwerken daher. Der Amateur indes hat meist wenig Platz dafür und scheut den Aufwand, jedesmal erst einen PC hochzufahren, ehe die Arbeit beginnt. Das Stellen der Weichen über die Loksteuerung (hier Lenz-Compact) ist eher zu unhandlich.

Deshalb sollte ein minimalistisches, handliches DCC-Stellwerk für 100 Weichen entwickelt werden, mit dem 3000 Weichenstellungen in 30 Ketten a 100 Weichen gespeichert und jederzeit wieder abgerufen werden können. Und das alles ganz ohne PC.

Geistige Wegbereiter der Entwicklung waren die Arduino-XpressNET-Library von Philipp Gahtow [1], sowie ein damit realisiertes Mini-Stellwerk von "Robokalle" Karlheinz Marks [2]. Eine Einführung zu XpressNET gibt es bei Wolfgang Kufer auf seiner opendcc-Seite [3]. Der Quellcode ist als Arduino-Projekt unter [5] zu finden, Schaltpläne liegen unter Hardware bereit.


Zum Stellen der Weichen werden 6-fach Schaltempfänger LS150 der Firma Lenz benutzt, die für etwa 50 Euro im Fachhandel zu haben sind. Das Stellwerk selbst wird nur über die XBUS/XpressNET-Buchse der "Lenz-Compact" versorgt.

Natürlich gibt es auch im Handel kleinere Stellwerke als Zusatzmodule. Deren Bedieneigenschaften indes empfand der Autor als wenig geeignet in der Handhabung. Die Bedienung sollte so einfach sein, daß eine Bedienungsanleitung eigentlich überflüssig ist.

So investierte ich vorab einiges Kopfzerbrechen in die Bediensyntax. Wie kann man mit 16 Tasten und einem kleinen OLED eine Funktionalität erreichen, die keine Wünsche offenläßt?

Wer schon einmal Zeichenketten decodiert hat, der erahnt die Problematik: Effiziente Bedienung bedeutet Erkennung verschieden langer Zeichenketten. Und dafür war im ersten Schritt eine widerspruchsfreie Sprach-Syntax zu entwickeln, die z.B. ausschließt, daß in längeren Befehlsketten auch kurze Befehle enthalten sein können.


Startbildschirm

Wird der XpressNET-Stecker gesteckt, erscheint ein Startbildschirm mit den wichtigsten Informationen, Abb.2. Dieser verschwindet, sobald irgendeine Taste gedrückt wird.


Die verwendete Folientastatur ist lautlos. Einem Tastendruck, wie auch einer gestellten Weiche ist deshalb ein charakteristisches Rascheln zugeordnet, sodaß man auch ohne angeschlossene Bahnanlage ein Feedback über eine ausgeführte Aktion erhält.

Mit dem Druck irgendeiner Taste wird die Kettenliste, d.h. die Liste der Fahrstraßen, Abb.2a), 2b) im unteren Teil angezeigt. Auf dem Display huschen oben alle im EEPROM gepeicherten Weichen vorbei - so, daß der Nutzer es bemerken kann.


Weichen stellen

Soll eine Weiche gestellt werden, so gibt man ohne jeglichen Schnickschnack die Zehner und Einer der Nummer von 0 bis 99 ein und drückt anschließend den Stern (*) für "Abbiegen" oder das Doppelkreuz (#) für "Geradeaus", Abb.2a) und 2b).


Der Hunderter wird bei Installation bereits im Setup gespeichert, siehe weiter unten. (Alle Weichen eines Stellwerkes müssen sich im selben Hunderter-Bereich befinden.)

Hat man sich vertippt, oder will man eine Weiche ausgiebig testen, kann man auch mehrmals nacheinander Stern oder Raute drücken. Immer die zuletzt gestellte Weiche wird angesprochen.

Als akustisches Feedback gibt ein kleiner Piezospeaker jeden Tastendruck durch einen Klicklaut wieder, sowie jede Weichenbetätigung durch ein Rascheln.


Fahrstraßen

Im unteren Teil der Bilder 2a) und 2b) sind die belegten Fahrstraßen (Kettenregister) zu sehen. Insgesamt stehen 30 Ketten (A0...9, B0...9, C0...9) zur Verfügung. Auf dem Display wird nur gezeigt, ob ein Kettenregister belegt ist, und wie es heißt.

Im Bild 2a) sind die Kettenregister A0, A4, A9, B9 sowie C0 belegt. Im Bild 2b) sind die Kettenregister A0, A3, A9, B9 sowie C0 belegt.


Fahrstraße erstellen

Will man eine Fahrstraße als Weichenkette erzeugen, gibt man die Weichennummern jeweils gefolgt von der Stellrichtung (* oder #) und einem Pluszeichen ein (das ist hier die Taste D).

Ist man fertig, wird die Kette bei Eingabe des Kettennamens (hier A0) und einem abschließenden Pluszeichen im EEPROM gespeichert. Das letzte Pluszeichen nach dem Kettennamen ist wichtig - die Kette wird erst damit dauerhaft im EEPROM abgelegt.


Vergißt man zwischendurch das Pluszeichen nach einer Weicheneingabe, ist das auch nicht schlimm. Es werden nur die Weichen gespeichert, die seit dem letzten Plus wieder mit einem Pluszeichen bedacht wurden.


Kette ausführen

Möchte man eine Fahrstraße stellen (Kette ausführen), so drückt man den Kettennnamen gefolgt von einem *, also zum Beispiel C9* . Es raschelt dann solange, bis die Kette in Echtzeit abgearbeitet ist: Die gewünschte Fahrstraße ist gestellt!



Kette löschen

Um eine Kette wieder aus dem EEPROM zu löschen, wird der Kettenname gefolgt von einem # gedrückt, also zum Beispiel A0# siehe Bild 5c).



Syntax-Beispiele


Sonstiges

Um zu verhindern, daß eine Weiche durchbrennen kann, ist die Steuerung so programmiert, daß jede Weichenaktivierung im XpressNET nach 100 Millisekunden wieder zurückgenommen wird. Erst danach wird bei Abarbeitung einer Kette die nächste Weiche gestellt. Zusätzlich nimmt auch die LS150 in der default-Einstellung die Weichenaktivierung nach 100 Millisekunden zurück.

Um ein Einbrennen des OLED-Displays zu verhindern, wird der Bildschirm bei Untätigkeit etwa nach 15 Minuten abgeschaltet. Er erscheint beim nächsten Tastendruck wieder.


Setup-Menue

Um das Stellwerk an eigene Bedürfnisse, d.h. an schon vergebene Loknummern oder ähnliches, anpassen zu können, können die 100 stellbaren Weichen (0...99) in einen beliebigen physischen Adressbereich der Anlage rangiert werden. Beim Drücken der Tasten ABC hintereinander erscheint dazu das Stellwerk-Setup.


Mit A0/A1 wird Lenz oder Roco fixiert (Funktion ist noch frei und ohne Wirkung).

Mit B0...9 wird die Hunderter-Stelle der Weichen-Adresse im physischen Adressraum fixiert, Tabelle 1.

Tabelle 1: Weichen im Adressraum

BAdr. phys.
00...99
1100...199
2200...299
......
9900...999

In Abb.6 wurde mit dem Befehl B1 die Registeradresse 1 festgelegt: Der physische Adressraum der Weichen im XpressNET liegt damit zwischen 100 und 199: Die Weiche, die mit der Adresse 0 gestellt wird, betätigt physisch die Weiche, die auf dem 6-fach Schaltempfänger LS150 mit der Lenz-Compact auf Adresse 100 programmiert wurde. Dieser Adreßraum ist praktikabel, wenn anderes Zubehör schon die Adressen unter Einhundert belegt.

Mit C00...30 wird die Bus-Adresse des Stellwerks im XpressNET festgelegt (XnetAdr ist in Abb.6 die 28).

XpressNet ist ein RS485-Simplex-Bus, d.h. immer nur ein Teilnehmer darf senden. Die Lenz-Compact verwaltet den Buszugriff. Hätten zwei Stellwerke dieselbe Xnetadr, so wären Datenkollisionen durch gleichzeitigen Buszugriff zweier Stellwerke möglich.


Betrieb mit mehreren Stellwerken

Reicht die auf 30 begrenzte Anzahl von Fahrstraßen nicht aus, so können mit einem LA152-Adapter von Lenz auch mehrere DCC-Stellwerke parallel versorgt werden. Der Betrieb ist problemlos möglich, solange die Stromaufnahme der an den Bus angeschlossenen Geräte die Stromversorgung der Lenz-Compact nicht überfordert (12 Volt; 2 Ampere).


Sollen mehrere Stellwerke benutzt werden, so ist lediglich darauf zu achten, daß sie mit verschiedenen XpressNET-Adressen (Xnetadr) versehen werden.

Werden zwei Stellwerke z.B. auf die Xnetadr von 27 und 28 eingestellt (Abb.7), dann kann man von beiden aus alle Weichen der Anlage stellen, sofern derselbe Hunderter-Offset eingestellt wurde. Auch kann man bei beiden Stellwerken verschiedene Fahrstraßen voreinstellen. Mit zwei Stellwerken sind dabei 60 Fahrstraßen mit je 100 Weichen bedienbar.

Werden die Weichen auf verschiedene Hunderterbereiche rangiert (Tabelle 1), dann lassen sich entsprechend doppelt soviele Weichen stellen. Sollten 100 Weichen nicht ausreichen, wäre es also möglich, ein Stellwerk mit B1 und das andere mit B2 zu programmieren, damit wären dann bei je 30 Fahrstraßen 200 Weichen (von 100 bis 299) stellbar: Ein Stellwerk stellt dabei die Weichen von 100 bis 199, das andere die von 200 bis 299.


Hardware

Das Stellwerk wurde auf einem Board Arduino-MEGA-R3 auf Basis des ATmega2560 realisiert, von dem zwei serielle Schnittstellen für USB-VCP (Debugging und Programmierung) sowie für XpressNET (über einen RS485-Wandler) genutzt werden.


Als Gehäuse kam ein durchsichtiges ARD-Mega-Case1 von Pollin zum Einsatz, welches aber stark modifiziert werden muß (Anm.: Es gibt wohl auch geeignetere Gehäuse). Um Winkelstecker verwenden zu können, wurde der Innenraum der oberen Abdeckung freigefräst. Auch wurde eine weitere Acrylplatte aufgesetzt, auf der die Folientastatur aufgeklebt ist und unter der das OLED befestigt ist.

Zusätzlich wird auf den Arduino-MEGA eine Lochraster-Leiterplatte gesteckt, auf der der RS485-Wandler (LTC485) zusammen mit einer 4-fach Schraubleiste sowie zwei LEDs mit Vorwiderstand sitzen. Zu steckende Verbinder sind auf den Buchsenleisten des MEGA weiß markiert.

Die Portnummern der Folientastatur liegen zwischen 32 und 46. Hintergrund dafür ist die flexible Anschlußleitung der Folientastatur, die nicht geknickt werden darf und deshalb S-förmig verlegt werden muß. Um sie vor scharfen Pins der Leiterplatte zu schützen, wurde die selbstklebende, grüne Schaumfolieneinlage zwischengelegt.


Auf Widerstände zur Impedanzanpassung wurde in Anbetracht der kurzen Länge des RS485-XpressNET-Kabels zur Lenz-Compact von 2 Metern verzichtet, siehe das Oszillogramm. Reflexionen werden dabei noch nicht beobachtet. Auch Widerstände zum Biasing (A gegen +5V, B gegen GND) sind nicht eingezeichnet, da diese im Host vorhanden sind.

Bedient wird über eine Folientastatur mit 16 Tasten. Die in den Schaltungen eingezeichneten Keypads sind Folientastaturen von Funduino (1,95 Euro). Um den unhörbaren Tastendruck sicher wahrnehmen zu können, wurde ein kleiner Piezo-Lautsprecher integriert.

Das verwendete 1,3-Zoll I²C-OLED (5 Volt, az-delivery.de, 8 Euro) mit 128x64 Pixeln bietet Platz für 16x8 Zeichen. Im Standby-Mode wird das Display abgeschaltet, dann leuchtet eine blaue LED im Gehäuse.

Schwer zu finden sind die bei Lenz üblichen 6/4-poligen Telefonkabel (6p 4c) und Buchsen. Hier wird man bei Reichelt fündig unter den Begriffen:
"Modular-Einbaubuchse 6/4 schwarz" (Art.-Nr. MEBP 6-4S, 25 Cent) bzw.
Westernkabel 2x Stecker 6-polig belegt, 3,0m" (Art.-Nr. WK 6-6 3M, 84 Cent).
Vorsicht bei Verwendung von Telefonkabeln, diese sind oft gekreuzt! Um diese Gefahr zu meiden, wurde am Stellwerk ein Kabel mit einem XpressNET-Stecker 6/4 angebracht.


Software

Schaltungen und Sourcecodes finden sich unter [5]. Der Sourcecode stellwerk.ino dokumentiert sich ausführlich selbst, einfach mal mit einem Texteditor reinschauen!

Vorab sind Bibliotheken in Arduino zu importieren:

Auch die Library signmag.h wird gebraucht, sie sollte sich im Verzeichnis des *.ino-Files befinden:
#include "signmag.h" // Vorzeichen-Betrag-Funktionen des Autors [5]

Der Quellcode compiliert sowohl für einen Arduino-MEGA (ATmega2560), als auch für einen Arduino-NANO (ATmega328) mit anderer Pinbelegung und kleinerem Kettenspeicher (maximal 30 Weichen pro Kette statt 100 beim MEGA). Dazu ist in der Arduino-Software (hier v1.8.9) lediglich das richtige Board einzustellen über (Werkzeuge/Board: ...).

Für die Softwarentwicklung ist die Verwendung des Arduino-MEGA recht nützlich, da zum Debugging UART-Ausgaben über USB-VCP auf den seriellen Monitor erfolgen können. Einen Eindruck vermittelt der Logfile.

Beim NANO entfällt allerdings entweder die USB-VCP-Schnittstelle oder XpressNET. Er besitzt in Hardware nur eine einzige serielle Schnittstelle. Mit der kann entweder Code hochgeladen werden, oder XpressNET betrieben werden. Beides zusammen geht beim NANO nicht (ist aber im Betrieb eigentlich auch nicht erforderlich), siehe dazu auch die Schaltung oder den Quellcode [5].


Weil der NANO auch ein kleineres EEPROM hat, können damit nur je 30 Weichen pro Kette gespeichert werden, insgesamt stehen beim NANO also 30x30 = 900 Kettenspeicherplätze zur Verfügung. Tippt der Nutzer versehentlich mehr als 30 Weichen ein, ist das auch kein Problem: die letzte Weiche im Kettenspeicher wird dann immer wieder überschrieben.

Im Stromverbrauch ist der NANO mit 35 mA (35,4 mA) an 12 Volt deutlich sparsamer als der MEGA mit 90 mA (89,4 mA).

Um EEPROM-Speicherplatz zu sparen, wird jede Weiche intern mit nur einem Byte codiert. Das Vorzeichen stellt die Stellrichtung dar, der Betrag die Weichennummer. Um auch Weiche 0 (Null) betätigen zu können, brauchen wir damit eine +0 und eine -0. Im üblichen Zweierkomplement kommt aber nur eine Null vor. Um eine +/- Null zu erhalten, wird eine kleine Library (signmag.h) für Vorzeichen/Betragsdarstellung eingebunden, die das interne Speicherformat der Weichen im EEPROM bestimmt.

Der Struktur nach ist der EEPROM-Speicher im wesentlichen zweigeteilt.
Das 1-dimensionale Blocklängenregister (Blockregister), geschrieben ab boffset, mit bsize = 0...29 ~ A0...C9 hat 30 Byte, hierin sind nur die Kettenlängen jeder Fahrstraße eingetragen. Dazu kommt der 2-dimensionale Kettenspeicher der Dimension (bsize mal ksize) geschrieben ab koffset, mit (MEGA ksize=100, NANO ksize=30).

Beim Aufruf einer Kette (z.B mit A0*) wird die Kettenlänge (z.B. klen=47) der gespeicherten Fahrstraße aus dem Blockregister gelesen. Mit dieser Info wird die im Kettenspeicher abgelegte Fahrstraße von 0 bis zum Index (klen-1) ausgelesen.

Bleibt noch zu erwähnen, daß die Software-Komplexität nicht ganz vernachläßigbar ist. Aber das System ist auch mit Fehleingaben nicht aus der Ruhe zu bringen. Es schweigt dann einfach, bis wieder ein sinnvoller Befehl vorbei kommt.


Inbetriebnahme

Bei der ersten Inbetriebnahme waren drei Weichendekoder LS150 angeschlossen, der Dritte war zwar schon verdrahtet, aber noch nicht auf eine Startadresse programmiert. Das Stellwerk bekam über XpressNET soviele Interrupts, daß der Bildschirm dunkel blieb. Die Sende-LED flackerte ununterbrochen, Stellwerk und Zentrale unterhielten sich munter. Erst nach Programmierung des Dritten LS150 funktionierte das Stellwerk einwandfrei.

Allerdings gibt es ein Problem, welches bislang unverstanden blieb. Die drei Decoder LS150 wurden ab der physischen Adresse 100 programmiert, d.h. Anfangsadressen waren 100, 106 und 112. Mit der nullten Weiche wurde aber die Adresse 99 angesprochen. Der erste Decoder schaltete dafür nur fünf Weichen, d.h. die 100 fiel aus.

Als Lösung wurden die Decoder ab 101 programmiert, d.h. auf die Nummern 101, 107, 113. Nun ist die nullte Weiche, die die Adresse 100 ins XpressNET gibt, vorhanden und alle Weichen lassen sich stellen. Allerdings mit einem Versatz um eins. Die Weiche, die auf der Lenz-Compact die Nummer 101 hat, ist auf dem DCC-Stellwerk die Nummer 0 (mit Setup B1). Eigentlich hätte man erwarten müssen, daß die Weiche 0 wegfällt, und die Weiche 1 die physische Adresse 101 steuert. Hier wäre das Wissen eines Experten gefragt, der XpressNET genauer kennt.


Danksagung

Vielen Dank an Philipp Gahtow für die XpressNET-Library und an Karlheinz Marks für seine tolle Anregung. Dank geht aber auch an Bernd Baschin, dessen Wunsch zur Speicherbarkeit von Fahrstraßen zur treibenden Kraft der Entwicklung wurde.

Gerd Heinz im März 2022


Quellen

[1] Philipp Gahtow: XpressNET Client Library v2.6 (Link); Download XpressNet.zip at sourceforge

[2] Karlheinz Marks: Turnout-Keyboard - ein einfaches Stellwerk: (Link)

[3] Wolfgang Kufer: Informationen zum XpressNET auf opendcc.de (Link)

[4] Kraus, Oli: Monochrome Graphics Library U8g2 for Arduino: (Link); Download master.zip at github

[5] Heinz, G.: Arduino-Sourcecode mit Library signmag.h, Logfile, kurze Bedienungsanleitung, Schaltung Arduino-NANO und Schaltung Arduino-MEGA.


*XpressNET is a trademark of Lenz Electronic GmbH



top

URL http://www.gheinz.de
Kommentare bitte an info@gheinz.de
Besucher seit dem 6. 12. 2021: