
Als nächstes habe ich im Netz nach Accessory-Decodern Ausschau gehalten, vorzugsweise ebenfalls mit Arduinos als Hirn. Man wird auch hier recht schnell fündig.
Einen mich interessierenden Weichendecoder habe ich bei Franz-Peter “MicroBahner” gefunden.
Dieser basiert auf einem Arduino (Nano) und kann gemischte Accessories ansteuern, unter anderem maximal 16 Servos, z.B. um Weichen elektromotorisch zu bedienen.
Hinweis
16 Servos können nur in der Version mit einem der Arduino Megas angesteuert werden, nur diese Versionen der Arduinos haben die notwendige Anzahl 16Bit-Timer. Mit einem
Ardunino Nano, wie hier von mir verwendet, ist bei 12 Servos das Ende der Fahnenstange erreicht, mehr unterstützt die verwendete Servo-Lib auf einem Arduino Nano nicht.
Um diesen Decoder an DCC anschließen zu können, käme wieder der hier beschriebene Adapter zum Zuge, aber da ich Arduino Nano Shields (suche im Netz nach “Shield-Expansionboard-Breakoutboard-I-O-Erweiterung-für-Arduino-Nano”) besitze, die bereits alle IOs des Arduino auf Steckern für Servos zugänglich machen, der Adapter aber die Hälfte der Anschlüsse verdeckt, musste eine Variante des Adapters her.
Update
Neue Version V1.5, siehe unten.
Die Schaltung ist bis auf die alternative Verwendung von IO A0 für den ACK-Impuls (ist bei Version 1 der Anschluss A5) identisch zu der oben Angegebenen, nur das Layout wurde etwas gestrafft.
(Click auf das Bild für volle Auflösung)

Alle Bauteile sitzen zwischen den Sockelstreifen für den Arduino, vier SMD Widerstände sind auf die Unterseite gewandert, DCC wird an der Schraubklemme angeschlossen, der USB-Anschluss des Arduino sitzt gegenüber.
Die Stecksockel für den Arduino habe ich mit langen Pins ausgeführt, so dass der Adapter auf das Expansion-Shield aufgesteckt werden kann, der Arduino sitzt auf dem Adapter und bedient beides. Die links und rechts des Arduino sitzenden Stecker für die Servos sind jetzt frei zugänglich.
Die mit Eagle3D gerenderte Ansicht...

und im Original:

Der für den Weichendecoder zusammengesetzte Platinen-Stapel:

Unten das IO-Expander-Shield, darauf gesteckt der DCC-Adapter und auf diesem gesteckt der Arduino Nano.
Das verwendete IO-Shield nochmal alleine:

Man sieht hier schön die für jeden IO-Pin des Arduino zur Verfügung gestellten Dreifach-Stecker, die wunderbar zu den Anschlüssen der Servos passen.
Die Designunterlagen für den Arduino DCC-Adapter im EAGLE V7.7 Format.
Hinweis
Der hier vorgestellte Decoder benötigt eine getrennte Versorgungsspannung, da der DCC-Adapter keine Möglichkeit vorsieht, die DCC-Spannung zur Versorgung zu verwenden.
Ein Grund für diese Auslassung gegenüber der DigiSpark-Version mit AtTiny85 ist der maximale Eingangsspannungsbereich des auf dem Arduino Nano verbauten Spannungsreglers. Der AMS1117 5.0 auf dem Arduino verträgt maximal 15 V am Eingang, der auf dem DigiSpark verbaute 78M05 verarbeitet hingegen bis 35 V Eingangsspannung.
Ein weiterer, gewichtiger Grund ist der große Kondensator, der nötig wäre, um die aus dem DCC-Signal per Gleichrichter gewonnene Gleichspannung zu sieben. Der hätte auf dem schmalen Board schlicht keinen Platz gefunden.
Achtung!
Die auf dem IO-Board vorhandene Niederspannungsbuchse darf ebenfalls mit maximal 15 V
beaufschlagt werden, da die hier eingespeiste Spannung - abzüglich der Vorwärtsspannung einer Schottky-Diode - direkt auf den Vin-Eingang des Arduino geführt wird.
Nachtrag
Die von Franz-Peter zur Verfügung gestellte Lösung hat mir zu viele Rätsel aufgegeben,
die Einstellung der Endlagen der Servos habe ich z.B. nicht hinbekommen.
Keine Probleme hatte ich hingegen bei dem 4-Servo-Decoder nach Phillip Gahtow.
Also habe ich Phillips Decoder auf den Arduino Nano portiert und um 8 Servos auf deren 12 erweitert. Wie schon weiter oben erwähnt unterstützt die Servo-Lib maximal 12
Servos pro 16Bit-Timer (von denen der Arduino Nano leider nur genau einen (1) hat).
Da der von mir entworfene DCC-Adapter auch die passenden Teile für die Erzeugung eines ACK-Impulses enthält, habe ich diesen, von Phillip schon vorbereiteten Teil des Decoders gleich mit aktiviert und getestet.
Ergebnis: Klappt prima :-)
Die Original-Implementierung von Phillip sieht vor, den ACK-Impuls über Aktivierung und Deaktivierung der Servos zu erzeugen. Das hat leider nicht funktioniert.
Die Sourcen (Arduino Syntax) der aufgeblasenen Version des Gahtow’schen Decoders für 12 Servos mit Arduino Nano gibt es als Download: DCCNanoServo8Bit_v21
Oh, bevor ich es vergesse - der aufmerksame Leser ahnt es bereits... Der Code dieses alternativen Decoders läuft auf der oben beschriebenen Hardware :-)
Die Zuordnung der Arduino Ausgänge zu den Servos ist im Code beschrieben.
Ein Bekannter hat mich auf die Arbeiten von Nico Teering aufmerksam gemacht.
Nico hat mit ArCoMoRa ein alternatives, DCC kompatibles System zur Steuerung von Accessoires, Weichen und Signalen sowie ein LocoNet Rückmeldesystem aufgebaut und bietet preiswerte Bausätze mit erfreulich großem Funktionsumfang an.
Er ist zur Einstellung der Parameter seiner Dekoder einen anderen Weg gegangen, und verwendet den USB-Anschluss an seinen Baugruppen zur Parametrierung.
Die zugehörige Software kommt mit einem Installer für Windows.
Erfreulicher Weise sind die Dekoder von Nico einem Arduino sehr ähnlich aufgebaut, die Firmware lässt sich problemlos auf einem Arduino installieren und funktioniert damit genauso gut wie auf der Original-Hardware.
Da mein oben beschriebener Weichendekoder ebenfalls mit einem Arduino arbeitet, habe ich kurzerhand testweise “Mardec”, den Multifunktionalen Arduino DCC Decoder auf den Nano gespielt und erwartungsgemäß läuft der Weichendecoder damit hervorragend.
Update
Leider sind mir bei der Umsetzung des Weichendecoders in Software ein paar Fehler
unterlaufen, die Zuordnung der Funktionen zu den Pins des Arduino betreffend.
Damit alle Funktionen des Weichendekoders genutzt werden können, müssen bestimmte Signale auf anderen Pins ausgegeben werden. Betroffen sind ACK-Impuls, der Taster um beim Reset oder PowerOn in den CV-Prog-Modus zu gelangen sowie der Anschluss für Servo 12 an Pin A0.
Damit das alles wie in der Software vorgesehen klappt, muss die Hardware geändert werden.
Die Möglichkeit, den ACK-Impuls über eine Auswahl von Pins einstellen zu können, entfällt, der Impuls wird fest über A5 erzeugt. Pin A7 erhält einen externen PullUp Widerstand.
(Click auf das Bild für volle Auflösung)
Der PullUp muss leider direkt an den Pads des Arduino bzw. dessen Sockel angelötet werden (siehe rote Markierung im Bild unten), es ist schlicht kein Platz vorhanden, um den Widerstand ohne Krampf und ohne zusätzliche Drähte frei irgendwo auf dem Board platzieren zu können.
Das Layout der geänderten Schaltung:

Achtung!
Der in der Schaltung angegebene Optokoppler CNY17 muss unbedingt vom Typ CNY17-4 sein. Die “-4” gibt an, dass der Koppler ein CTR (Current Transfer Ratio) von mindestens 160 % (160..320 % lt. Datenblatt) hat, was bei einem Eingangsstrom von
37 mA einen Ausgangsstrom von mindestens 60 mA ergibt. Das entspricht genau dem von der NMRA für einen ACK-Impuls geforderten Wert. Die 37 mA Eingangsstrom ergeben sich aus dem Widerstand von 100 Ω in Reihe mit der IR-LED
im Koppler. Die LED hat lt. Datenblatt eine Durchlassspannung von ungefähr 1,3 V, ergibt mit der Versorgungsspannung von 5 V einen Spannungsabfall von 3,7 V über den Widerstand.
Ein CNY17-1 mit einem CTR von 40..80 % funktioniert nachweislich nicht.
Um den Decoder in den CV-Prog-Modus zu versetzen muss ein Taster an A7 angeschlossen werden, der beim PowerOn oder beim Reset A7 auf Masse zieht.
Die Designfiles der Platine in Version V1.5 im Format Eagle V7.7 stelle ich zur Verfügung.
Ich habe das Design auch nach EasyEDApro portiert und Jürgen hat Platinen von JLCPCB fertigen lassen. Netterweise hat er mir zwei davon zur Verfügung gestellt - Vielen Dank an dieser Stelle!

Sein mit dieser Platine aufgebauter 12-Servo-Weichendekoder stellt sich so dar:

Das verwendete Shield unterscheidet sich in der Farbe des Boards, entscheidender sind für mich aber die farblich gekennzeichneten Stecker für die Servos. Bei dem von mir verwendeten Shield muss ich nicht überlegen, wie herum der Servostecker “richtig” sitzt.
Die zugehörige Software wurde ebenfalls überarbeitet, im Wesentlichen musste die Pinzuordnung und deren Initialisierungen geändert werden, sie hat jetzt den Stand V2.2. Im Beschreibungsteil am Anfang der INO-Datei hat sich ebenfalls einiges geändert, bitte beachten.
Update
Die beschriebenen Änderungen am Code sind nur teilweise eingeflossen :(
Hier die korrekte Version der Decoder-Firmware: DCCNanoServo8Bit_v23
Update
Um die initiale Befüllung der Decoder mit den Weichenadressen zu vereinfachen, habe
ich eine kleine Routine implementiert, die mit der Anfangsadresse für den gegebenen Decoder gefüttert wird und dann beim ersten Start des Decoders die CVs passend befüllt
. Damit das erfolgt, muss das Define INITADRCVS in Zeile 508 aktiviert werden und die gewünschte Adresse der ersten Weiche in Zeile 513 eingetragen werden, dann der
Decoder mit der so geänderten Firmware programmiert und einmal gestartet werden (Spannung anlegen). Anschließend muss das Define INITADRCVS in Zeile 508 wieder
auskommentiert und die jetzt wieder ursprüngliche Firmware erneut geflasht werden. Diese Erweiterung ist in der Decoder-Firmware V2.4 enthalten: DCCNanoServo8Bit_v24
Update
Da ich in letzter Zeit mehrfach neue Versionen der Firmware erstellen musste, habe ich
neben der Ausgabe der Versionsnummer über die serielle Schnittstelle beim Start des Decoders auch noch das Build-Datum der Version angehängt. Zusätzlich werden die
aktuell definierten Weichen-Adressen aus dem EEPROM gelesen und aufgelistet. Die Ausgabe stellt sich so oder ähnlich dar:
DCC-Accessorydecoder fuer 12 Servos - V2.5 (21.05.2025)
CV 10 - 0 -- CV 11 - 1 --> Adresse 1
CV 20 - 0 -- CV 21 - 2 --> Adresse 2
CV 30 - 0 -- CV 31 - 3 --> Adresse 3
CV 40 - 0 -- CV 41 - 4 --> Adresse 4
CV 50 - 0 -- CV 51 - 5 --> Adresse 5
CV 60 - 0 -- CV 61 - 6 --> Adresse 6
CV 70 - 0 -- CV 71 - 7 --> Adresse 7
CV 80 - 0 -- CV 81 - 8 --> Adresse 8
CV 90 - 0 -- CV 91 - 9 --> Adresse 9
CV 100 - 0 -- CV 101 - 10 --> Adresse 10
CV 110 - 0 -- CV 111 - 11 --> Adresse 11
CV 120 - 0 -- CV 121 - 12 --> Adresse 12
Analogwert 1023
Normal-Mode aktiv -> Schalter LINKS
Die aktuelle Version der Decoder-Firmware V2.5 stelle ich zur Verfügung.
Um Unsicherheiten bei der Belegung der Steckerleisten des Adapters auszuräumen, hier das korrekte Anschlussschema für 12 Servos:

Rot eingerahmt die Nummern der verwendeten Arduino Pins, die grünen Kreise markieren den jeweiligen Pin am Stecker, der das Servosignal ausgibt, in grüner Schrift die den Pins zugeordnete Servonummer.
Hinweis
Die Funktionalität der Schaltung als DCC-Monitor mit der Sniffer-Software von RudyB ist unverändert gegeben.