Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
anleitungen:oled:display-steuerung [2024/03/23 12:00] – [Bestückung der Display-Steuerung] raily74 | anleitungen:oled:display-steuerung [2025/10/21 21:06] (aktuell) – [Warum gerade diese Lösung und nicht MQTT?] raily74 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | <WRAP important 60%> | + | ====== 740 Display-Steuerung Zugzielanzeiger |
- | In Arbeit... | + | [[raily74@icloud.com|von Michael]]\\ |
- | </ | + | |
- | + | ||
- | ====== 740 Display-Steuerung Zugzielanzeiger | + | |
- | + | ||
- | Die Zugzielanzeiger haben mit der MobaLedLib an sich nichts zu tun. Sie sind ein völlig eigenständiges Projekt und werden **nicht** über den Programm Generator gesteuert. Initiiert wurden sie bereits im Dezember 2015 im Stummiforum durch [[https:// | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | =====Funktionsweise der Display-Steuerung===== | + | |
- | + | ||
- | Die Display-Steuerung entstand ursprünglich als Erweiterung zur 760er Kofferplatine. Die Idee der Platine basiert dabei auf dem [[anleitungen: | + | |
- | + | ||
- | === Warum ein zweiter Arduino? | + | |
- | + | ||
- | Der ursprüngliche Schaltplan sowie der im Github zur Verfügung gestellte Sketch können mit nur einem Arduino ohne Weiteres fünf Displays ansteuern. Dabei nutzt die Schaltung mehrere Mosfets (BS170), um das jeweilige Display anzusprechen. Die Displays schalten also um und verharren mit dem zuletzt empfangenen Text. Immer auf dem aktiven Display (dessen Mosfet aktiviert ist) ist der Arduino in der Lage, einen bewegten Lauftext zu generieren. Dieser stoppt, sobald auf eines der anderen Displays umgeschaltet wird. | + | |
- | Zugzielanzeiger bestehen häufig aus einem in Fahrtrichtung zeigenden und einem entgegengesetzten Monitor. Bei beiden ist die Gleisnummer jeweils außen angeschlagen und somit ist der Bildschirminhalt beider Monitore nie identisch. | + | |
- | Da der Arduino aber nur auf einem Display den Lauftext generieren kann, würde die Verspätung eines einfahrenden Zuges nur auf dem Display in Fahrtrichtung angezeigt, nicht jedoch auf dem am selben Gleis angebrachten Display entgegen der Fahrtrichtung. \\ | + | |
- | + | ||
- | Nun kommt der zweite Arduino ins Spiel. Steuert man diesen mit denselben DCC-Befehlen, | + | |
- | + | ||
- | === Steuern zwei Arduinos also zehn Displays? | + | |
- | Im Prinzip ja. Auch wenn der Lauftext immer nur auf einem Gleis dargestellt werden kann, so nutzt diese Steuerung immerhin vier der zahlreichen Ausgänge jedes Arduinos zur Steuerung der Displays. Beide Arduinos zusammen liefern also Bildinhalte für acht Displays. Eine Platine versorgt daher zwei Bahnsteige mit jeweils zwei Gleisen. Ein Arduino versorgt vier Displays in die eine Himmelsrichtung (▲) und der zweite Arduino die vier Displays in die andere Himmelsrichtung (▼). | + | |
- | + | ||
- | Soll der Lauftext zur gleichen Zeit auf zwei von vier Gleisen angezeigt werden, so muss eine Platine je Bahnsteig zum Einsatz kommen. Die Ausgänge für Bahnsteig 2 bleiben in dem Fall ungenutzt, der zweite Arduino muss trotz allem bestückt werden. Lediglich auf einige Dioden, Mosfets und Wannenstecker kann verzichtet werden (siehe Ende der Bestückungsanleitung). | + | |
- | ===Ist die Display-Steuerung kompatibel mit den Kofferplatinen? | + | |
- | **Jein!** Auch wenn die Kofferplatinen nicht dazu geeignet sind, einen beidseitigen Lauftext anzuzeigen, so ist jedoch die Display-Steuerung in der Lage, die Kofferplatinen zu betreiben. | + | |
- | + | ||
- | Die Arduinos der Display-Steuerung versorgen jedes Display mit den drei Signalen RST, SCL und SDA, sowie der Versorgungsspannung. Die Kofferplatine führt bis auf SDA alles für Vorder- und Rückseite zusammen. Soll nun das Display auf der Vorderseite von einem anderen Arduino angesteuert werden als das Display auf der Rückseite, so sind die Signalleitungen RST und SCL von beiden Arduinos nötig. Das kann die Kofferplatine nicht abbilden. | + | |
- | + | ||
- | Die Kofferplatine ist eine großartige Entwicklung, | + | |
- | + | ||
- | Für die Nutzung mit Kofferplatinen werden statt der 10-poligen Wannenstecker einfach 6-polige eingelötet und einige Bauteile können entfallen.\\ | + | |
- | + | ||
- | Soll die Platine universell eingesetzt werden, sollte sie voll bestückt werden. In dem Fall kann man eine sechsadrige Flachbandleitung wie bei der MobaLedLib gewohnt mit Plus am Pfeil einer zehnpoligen Pfostenbuchse ausrichten. | + | |
- | {{:bilder: | + | Zur alten Anleitung (v2.1): [[display-steuerung_v2.1|zur Vorgängerplatine]] |
- | ===== Stückliste ===== | + | |
- | Nachfolgend findet man die Stückliste | + | |
- | < | + | < |
- | Die Stückliste | + | Hier entsteht die Anleitung zur überarbeiteten Display-Steuerung für Zugzielanzeiger in Version v3.\\ |
+ | Die alte Anleitung | ||
+ | **Die Platine ist in Planung und wird erst nach ausgiebigen Tests veröffentlicht.** | ||
</ | </ | ||
- | ^ Anzahl | + | === Alter guten Dinge sind drei === |
- | | 1 | Board | Platine | 740-Display-Steuerung | + | Mit der ZZA Steuerung v3 wird aus den einzelnen Komponenten endlich ein System. |
- | | 18 | D1-D16, D17, D18 | Schottkydiode, | + | |
- | | 8 | R1-R8 | SMD-Widerstand, | + | |
- | | 9 | R9-R16, R19 | SMD-Widerstand, | + | |
- | | 2 | R17, R18 | SMD-Widerstand, | + | |
- | | 2 | C1, C2 | Vielschicht-Kerko, | + | |
- | | 2 | C3, C4 | Elko radial, 100 uF, 25 V, 105°C, low ESR | [[https:// | + | |
- | | 8 | BS1▲▼-BS4▲▼ | MOSFET, 60 V, 0,5 A, TO-92 | [[https:// | + | |
- | | 1 | LD1117v33 | LDO-Spannungsregler, | + | |
- | | 8 | LED1▲▼-LED4▲▼ | LED 3mm, bedrahtet, gelb | [[https:// | + | |
- | | 1 | 6N137 | Optokoppler | [[https:// | + | |
- | | 1 | Fassung für 6N137 | IC-Sockel, 8-polig | [[https:// | + | |
- | | 2 | +5V, DCC | Stiftleiste - 2-pol, RM 3,5 mm, 90° | [[https:// | + | |
- | | 2 | +5V, DCC | Anschlussklemme, | + | |
- | | 6 | Leader, Follower | Wannenstecker, | + | |
- | | 1 | Switch | Wannenstecker, | + | |
- | | 6 | S_Text+1, S_Rotate, S_GleisX | Kurzhubtaster 6x6mm, Höhe: 20,0mm | [[https:// | + | |
- | | 4 | A1, A2 | Buchsenleiste, | + | |
- | | 2 | A1, A2 | Arduino Nano | [[https:// | + | |
- | ---- | + | Basierend auf Ideen von Tobias, [[https:// |
- | <WRAP pagebreak></ | + | Mich hat diese Idee vom ersten Tag an so fasziniert, dass ich zwei Jahre intensiv daran gearbeitet habe. |
- | === Buchsenleiste teilen === | + | {{: |
- | Die 20poligen Buchsenleiste für A1 und A2 wird per Säge auf die notwendigen Teilstücke abgelängt (jeweils etwa 1mm hinter dem letzten benötigten Bein absägen). Aus einer 20poligen Leiste wird eine 15-polige Buchsenleisten erstellt. | + | |
- | {{bilder: | + | ==== Warum gerade diese Lösung und nicht MQTT? ==== |
+ | Ihr könnt diesen Punkt überspringen, | ||
- | ---- | + | MQTT gilt als moderne, serverbasierte Lösung, bei der das Steuerungsprogramm (z. B. RocRail) die Befehle an einen MQTT Broker sendet (typischerweise ein Raspberry Pi), auf dem die Verwaltung der Zugziele läuft. Sobald der Broker einen Befehl von der Steuerungssoftware bekommt, schickt er die Daten zum ESP. |
- | <WRAP pagebreak></ | + | |
- | ===== Bestückung | + | **<color # |
+ | * Die Zugziele müssen nicht im Arduino Sketch gepflegt werden. Sie werden bequem über die Weboberfläche WYSIWYG eingepflegt. | ||
+ | * Deutsche Umlaute können direkt eingegeben werden. | ||
+ | * Es ist nur ein einziger Befehl | ||
- | Es empfiehlt sich, folgende Reihenfolge bei der Bestückung einzuhalten: | + | **<color # |
+ | * Der Installationsaufwand stellt für den ungeübten Bastler mit wenig IT-Kenntnissen eine zusätzliche Hürde dar. | ||
+ | * Das Umschalten | ||
- | Sofern | + | Als ich das Projekt im Dezember 2023 startete, war RocRail das einzige Programm, das MQTT unterstützte. Ich selbst nutze iTrain, welches MQTT bis heute nicht unterstützt, |
+ | Die im Stummiforum vorgestellte Lösung läuft hingegen komplett auf dem Arduino und wird über die serielle Schnittstelle oder per DCC Befehl gesteuert. | ||
- | 1) Dioden D1 bis D18\\ | + | **<color # |
- | {{: | + | * Steuerbar per serieller Schnittstelle, |
+ | * Kein zusätzlicher Server nötig. | ||
+ | * Steuerbar mit iTrain (Aktionen), TrainController Gold (Bahnwärter) und WinDigipet (Stellwerkswärter) | ||
- | 2) Widerstände R9 bis R16 und R19 (rot) sowie Widerstände R17 und R18 (grün)\\ | ||
- | {{: | ||
- | 3) Widerstände R1 bis R8\\ | + | **<color # |
- | {{: | + | * Aufwändig zu pflegende Zugziele direkt im Programmcode (große Hürde) |
+ | * Deutsche Umlaute müssen in Octal Codes eingeben werden. | ||
+ | * Maximal 100 Ziele im Flash des Arduinos speicherbar. | ||
+ | * Eine Anpassung bzw. Ergänzung der Zugziele setzt zwingend eine USB Verbindung zum Arduino voraus. | ||
+ | * Es sind immer zwei direkt aufeinanderfolgende DCC-Befehle nötig, um das richtige Gleis zu wählen und den passenden Text zu senden. Das können nicht alle Steuerungen (siehe oben) | ||
- | 4) Keramikkondensatoren C1 und C2\\ | + | Obwohl die Nachteile dieser Lösung überwogen, versuchte ich in Ermangelung einer MQTT Unterstützung durch iTrain daher, die Nachteile der Arduino Lösung zu kompensieren. Leider entpuppte sich der Arduino Nano als Sackgasse. Trotz zahlreicher Versuchsaufbauten und passend entwickelter Platinen (v1 und v2), konnte der kleine Mikrocontroller die Zugzielanzeiger nicht stabil |
- | {{: | + | |
- | **Nun geht es mit der Bestückung der THT-Bauteile weiter:** | + | Nach anfänglichen Startschwierigkeiten und ernüchternder Erkenntnisse ebnete |
- | 5) IC-Fassung für Optokoppler 6N137\\ | + | So implementierte Hardi den Page Modus, eine Funktion, bei der nur ein Viertel des Displays aktualisiert werden muss, um den Lauftext in einem Viertel der Zeit zu erzeugen und eine Funktion zur Bildung von Display-Gruppen, wodurch mehrere Displays mit nur einem DCC Befehl dasselbe Zugziel empfangen, egal, ob links- oder rechtsseitige Ausrichtung. Neben den üblichen Anpassungen an die neue Hardware (ESP32) spendiert er dem Sketch knapp 250 vordefinierte Zugziele, um den händigen Aufwand zu minimieren. Eine kurze Recherche ergab dann, dass ich mit knapp einem Dutzend Zeilen Code das WLAN zum Übertragen des Sketchs aktivieren konnte. |
- | {{: | + | |
- | 6) Spannungsregler LD1117v33 mit Wärmeleitpaste, | + | Nun blieben nur noch zwei Nachteile: Die überhaupt nicht intuitive Eingabe der Texte und Einstellungen sowie die zwei aufeinanderfolgenden DCC Befehle. |
- | {{: | + | |
- | 7) Mosfets BS170\\ | + | Die Eingabe der Daten sowie die Umwandlung in den Sketch konnte ich mit einem selbst erstellten Programm abfangen. Dieses macht die Eingabe genauso komfortabel wie die Weboberfläche eines MQTT Servers, bietet dabei aber die Vorteile der Arduino Lösung. |
- | {{: | + | |
- | 8) Anschlussklemmen +5V und DCC (Bild 1) und Buchsenleisten A1 und A2 (Bild 2) \\ | + | Für das versetzte Senden zweier |
- | {{: | + | |
- | {{: | ||
- | |||
- | 9) 10-polige Wannenstecker Leader + Follower (rot), 8-poliger Wannenstecker Switch (grün)\\ | ||
- | {{: | ||
- | |||
- | 10) Kondensatoren C3 und C4 (Bild 1), LEDs 1-8 (Bild 2) inkl. 3D Abstandshalter\\ | ||
- | {{: | ||
- | |||
- | {{: | ||
- | |||
- | 11) Taster\\ | ||
- | {{: | ||
- | |||
- | <WRAP round info 50%> | ||
- | Vielen Dank an Frank für die Bereitstellung der einzelnen Bilder der jeweiligen Bauschritte! | ||
- | </ | ||
- | |||
- | ===== Anschluss-Schema an OLED-Adapter ===== | ||
=== Pin-Belegung des Wannensteckers === | === Pin-Belegung des Wannensteckers === | ||
- | {{:bilder: | + | {{bilder: |
- | + | ||
- | === Zweigleisiger Zugzielanzeiger === | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | Das oben gezeigte Anschluss-Schema gilt für alle sechs Wannenstecker. Auf diese Weise können bis zu 24 Displays an die Steuerung abgeschlossen werden. | + | |
- | + | ||
- | === Eingleisiger Zugzielanzeiger === | + | |
- | + | ||
- | + | ||
- | {{: | + | |
- | ===== Download des Arduino Sketches ===== | + | |
- | + | ||
- | <WRAP round box 80%> | + | |
- | [[https:// | + | |
- | https:// | + | |
- | </ | + | |
- | + | ||
- | ===== Erste Schritte mit dem Sketch ===== | + | |
- | + | ||
- | <WRAP round tip 60%> | + | |
- | Es empfiehlt sich, Hardis ursprünglichen Beitrag im Stummiforum zu lesen, bevor man in das Editieren des Sketchs einsteigt.\\ | + | |
- | [[https:// | + | |
- | </ | + | |
- | + | ||
- | ==== Gleise definieren ==== | + | |
- | Der ursprüngliche Sketch wurde für die Verwendung mit der Display-Steuerung leicht modifiziert. Statt der ursprünglichen fünf Taster verwendet die hier gezeigte Platine sechs Taster und vier statt drei Displays.\\ | + | |
- | Zudem arbeitet die Platine direkt mit zwei Arduinos, welche unterschiedliche Sketches benötigen. Da dieser modifizierte Sketch speziell auf die hier gezeigte Platine abgestimmt ist, steht er alternativ (bald) im Github zum Download zur Verfügung.\\ | + | |
- | + | ||
- | Ohne Anpassung des Sketches hätten die anzuzeigenden Texte (TextMessages.h) zudem immer in zwei Programmen gepflegt werden müssen - einmal für die vorwärts und einmal für die rückwärts gerichteten Displays. In der Praxis wird man nicht alle 100 Texte auf einmal pflegen, sondern immer dann, wenn einem ein besonderer Zug in die Finger gerät und man mit diesem spielt. Das ist der richtige Zeitpunkt zur Anlage seines Textes. Das hätte das Einpflegen der Texte und das Programmieren der Arduinos zum Geduldsspiel gemacht. | + | |
- | + | ||
- | Hier greift der Sketch nun auf eine Besonderheit der Platine zurück. Beide Arduinos sind bis auf einen Unterschied identisch angeschlossen. Arduino 1 wird an Pin " | + | |
- | + | ||
- | Bei der Ersteinrichtung müssen die auskommentierten Zeilen nach Wunsch aktiviert werden, indem die beiden Schrägstriche in der jeweiligen Zeile entfernt werden (1). Der Sketch ist zunächst für ein OLED Panel konfiguriert und eignet sich in der Form für einen ersten Test mit einem über ein Breadboard angeschlossenen Display. Dies ist in der Regel der erste Test, den man nach dem Zusammenbau durchführt. | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | + | ||
- | ==== Texte für die Züge definieren ==== | + | |
- | + | ||
- | Wenn man den Arduino Sketch offen hat, sieht man oben die Reiter für die einzelnen Bestandteile. Einer davon ist die Sammlung der Anzeigentexte (TextMessages.h). | + | |
- | + | ||
- | + | ||
- | ==== DCC Adressbereich definieren ==== | + | |
- | ===== Steuerung per DCC ===== | + | |
- | Der größte Clou der Zugzielanzeiger ist die Möglichkeit, | + | |
- | + | ||
- | ^ Aspekt* | + | |
- | | 0 | n+0 | Rot | Vorangegangenen Textblock auf aktuellem OLED Panel anzeigen | wird zur Automatiksteuerung nicht benötigt | | + | |
- | | 1 | n+0 | Grün | Nächsten Textblock auf aktuellem OLED Panel anzeigen | wird zur Automatiksteuerung nicht benötigt | | + | |
- | | 2 | n+1 | Rot | Vorangegangenes OLED Panel auswählen | wird zur Automatiksteuerung nicht benötigt | | + | |
- | | 3 | n+1 | Grün | Nächstes OLED Panel auswählen | wird zur Automatiksteuerung nicht benötigt | | + | |
- | | 4 | n+2 | Rot | Nächsten Textblock auf OLED 1 anzeigen | Wichtige Funktion nach Verlassen von Gleis 1 | | + | |
- | | 5 | n+2 | Grün | Nächsten Textblock auf OLED 2 anzeigen | Wichtige Funktion nach Verlassen von Gleis 2 | | + | |
- | | 6 | n+3 | Rot | Nächsten Textblock auf OLED 3 anzeigen | Wichtige Funktion nach Verlassen von Gleis 3 | | + | |
- | | 7 | n+3 | Grün | Nächsten Textblock auf OLED 4 anzeigen | Wichtige Funktion nach Verlassen von Gleis 4 | | + | |
- | | 8 | n+4 | Rot | OLED 1 auswählen | Wird als erstes von einfahrendem Zug auf Gleis 1 ausgelöst | | + | |
- | | 9 | n+4 | Grün | OLED 2 auswählen | Wird als erstes von einfahrendem Zug auf Gleis 2 ausgelöst | | + | |
- | | 10 | n+5 | Rot | OLED 3 auswählen | Wird als erstes von einfahrendem Zug auf Gleis 3 ausgelöst | | + | |
- | | 11 | n+5 | Grün | OLED 4 auswählen | Wird als erstes von einfahrendem Zug auf Gleis 4 ausgelöst | | + | |
- | | 12 | n+6 | Rot | Textblock 1 auf aktuellem OLED anzeigen | Wird anschließend mit Verzögerung (<1s) an das aktuelle Display gesendet | | + | |
- | | 13 | n+6 | Grün | Textblock 2 auf aktuellem OLED anzeigen | | | + | |
- | | 14 | n+7 | Rot | Textblock 3 auf aktuellem OLED anzeigen | | | + | |
- | | 15 | n+7 | Grün | Textblock 4 auf aktuellem OLED anzeigen | | | + | |
- | | 16 | n+8 | Rot | Textblock 5 auf aktuellem OLED anzeigen | | | + | |
- | | 17 | n+8 | Grün | Textblock 6 auf aktuellem OLED anzeigen | | | + | |
- | | 18 | n+9 | Rot | Textblock 7 auf aktuellem OLED anzeigen | | | + | |
- | | 19 | n+9 | Grün | Textblock 8 auf aktuellem OLED anzeigen | | | + | |
- | | … | | + | |
- | | 110 | n+55 | Rot | Textblock 99 auf aktuellem OLED anzeigen | | | + | |
- | | 111 | n+55 | Grün | Textblock 100 auf aktuellem OLED anzeigen | | | + | |
- | + | ||
- | Mit der oben gezeigten Tabelle ist das Erstellen einer Regel ganz einfach. Zunächst legt man im Arduino Sketch im Reiter „TextMessages.h“ einen passenden Text für den Zug seiner Wahl an. Dabei empfiehlt es sich, die Beispieltexte auszukommentieren oder bei Nichtgebrauch zu löschen. Texte sollten unbedingt von 1 bis 100 fortlaufend ergänzt werden und nicht im Nachgang sortiert werden. In den meisten Fällen wird man den soeben angelegten Text mit seiner Zeilennummer einem Zug zuweisen. Ergänzt man nachträglich oberhalb dieser Zeile einen weiteren Text oder sortiert die Texte um, gehen diese direkten Verknüpfungen aus Zug und Zeilennummer verloren. | + | |
- | + | ||
- | Nun geht es an die eigentliche Verknüpfung. Die Verknüpfung wird hier am Beispiel von iTrain gezeigt. Zur Erstellung einer „Wenn/ | + | |
- | + | ||
- | In einer Aktion werden die Bedingungen und die Ausführung miteinander verknüpft. | + | |
- | + | ||
- | Beispiele für die Bedingung: \\ | + | |
- | - ein bestimmter Block ist belegt \\ | + | |
- | - im Block befindet sich ein bestimmter Zug (DCC-Adresse) \\ | + | |
- | - die Fahrtrichtung ist vorwärts/ | + | |
- | - die folgenden Weichen führen zu einen bestimmten Gleis \\ | + | |
- | + | ||
- | Alle oben genannten Bedingungen sollten in einer „Und-Bedingung“ erfasst werden, sodass nur ausgeführt wird, wenn alle Anfragen mit „Ja“ beantwortet werden. | + | |
- | + | ||
- | Die Ausführung schaltet lediglich zwei DCC Adressen. Auch hier ein Beispiel: An Gleis 3 soll der Text Nr. 6 angezeigt werden. Dazu wird zunächst die DCC Adresse n+5 auf Rot gesetzt (entspricht Aspekt 10) und mit einer kurzen Verzögerung die Adresse n+8 auf Grün (entspricht Aspekt 17). | + | |
- | + | ||
- | <WRAP round info 80%> | + | |
- | *) Der Aspekt ist eine spezielle Funktion in iTrain. Dazu wird ein beliebiger DCC Adressbereich mit maximal 128 Adressen in einen virtuellen „Drehschalter“ mit bis zu 256 Schaltstellungen verwandelt. Das macht das Senden der Display- und Textwahl einfacher. Die Programme WinDigipet, TrainController und RocRail werden ähnliche Möglichkeiten bieten, wenn auch unter anderem Namen. \\ | + | |
- | Hinweise zur Vorgehensweise dieser Programme bitte gern im Forum posten. | + | |
- | </ | + | |
- | + | ||
- | ---- | + | |
- | <WRAP pagebreak></ | + | |
- | + | ||
- | ===== 3D-Gehäuse - Display-Steuerung ===== | + | |
- | Eignung für 3D-Drucker: [[3d_druck: | + | |
- | + | ||
- | <WRAP round box 60%> | + | |
- | [[https:// | + | |
- | https:// | + | |
- | </ | + | |
- | + | ||
- | {{: | + | |
- | ===== Schaltplan ===== | + | |
- | + | ||
- | {{: | + |