Endlich ist sie fertig, die Version 1.0 der MobaLedLib
Hallo MobaLedLib Anhänger,
eigentlich wollte ich die neue Version der Bibliothek pünktlich zum ersten Geburtstag heraus bringen. Aber da waren noch ein paar „Kleinigkeiten“ zu machen. Dann dachte ich, dass der Beitrag #900 eine gute Gelegenheit für die Veröffentlichung wäre. Ich war ja auch schon fast fertig…
Aber es kommt immer anders als man Denkt. In der Zwischenzeit sind fast 4 Wochen vergangen in denen ich intensiv an den Programmen gearbeitet habe. Und wenn die Beitragsnummer #1000 nicht vor der Tür stehen würde, dann hätte ich sicherlich auch noch weitere Verbesserungen eingebaut. Es fehlt ja noch so unendlich viel. Aber ich muss auch mal wieder an was anderes denken können…
Was ist neu?
- Die wichtigste Neuerung der Bibliothek ist das Charlieplexing Programm. Es hat mich sehr lange beschäftigt.
- Parallel dazu hat Harold an dem „Farbkasten“ gefeilt (Farbtestprogram). Damit können die Farben und Helligkeiten der LEDs Live verstellt werden und in die Konfiguration übernommen werden.
- Auf mehrfachen Wunsch kann die MobaLedLib jetzt auch kaputte Neonröhren simulieren.
- Das Fernsehprogramm ist auch vielfältiger geworden. Jetzt können die Preiser auch mit Schwarz-Weiß TV berieselt werden. Das ist tatsächlich ein riesen Vorteil. Die alten SW-Filme waren deutlich besser als das was wir Heutzutage auf 150 Kanälen präsentiert bekommen.
- Neben diesen Neuerungen habe ich noch viele kleine Verbesserungen eingebaut
Details: Charlieplexing: Das Charlieplexing hat mich schon lange gereizt. Ich habe es (trotz Elektrotechnik Studium) erst vor etwa zwei Jahren entdeckt. Charlieplexing ist ein Verfahren mit dem man viele LEDs mit wenigen Kabeln ansteuern kann. Das ist auf der Modelleisenbahn z.B. bei Lichtsignalen sinnvoll. Damit können 12 verschieden LEDs mit nur 4 Kabeln betreiben werden. Diese Kabel können wie Lorenz das hier
💡 MobaLedLib: 768 LEDs, Servos, Sound, …………… Stammtisch am 27.10.21 (28) zeigt komplett im Mast verschwinden. Das ist Sensationell.
Die Arbeiten von Lorenz, Matthias und Ronny waren auch der Grund warum ich mich endlich daran gemacht habe das Charlieplexing Programm zu erstellen. Die Hardware dazu hatte ich ja schon im Juli gezeigt (
💡 MobaLedLib: 768 LEDs, Servos, Sound, …………… Stammtisch am 27.10.21 (14)).
Die obere der Platinen hier zeigt die Bestückung für das Charlieplexing:
Unten rechts der 4-polige Stecker im Rastermaß von 2mm für das (Viessmann) Signal. Der Winkelstecker darüber wird dabei nicht benötigt.
Das untere Modul zeigt die Variante für Servo Motoren. Aber dazu gibt es noch keine Software (Und fragt nicht wann ich das mache. Ich habe erst mal genug programmiert.).
Achtung: Die Anordnung der Platinen ist falsch. Wenn man mehrere Platinen miteinander verbindet, dann bekommt die „untere“ den Wannenstecker über den die Platinen mit Spannung und Daten versorgt werden.
Prinzip des Charlieplexing:Beim Charlieplexing werden zwei LEDs antiparallel geschaltet. Die eine hat ihren Pluspol an der Leitung 1, die Andere an der Leitung 2. Wenn man Plus an die erste Leitung anschließt, dann leuchtet die erste LED. Schaltet man den Pluspol dagegen an die zweite Leitung, dann sperrt die erste LED und die Zweite leuchtet.
(Bild: By Matthiaspaul - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=28150690)Das ist erst mal noch unspektakulär. Zwei LEDs und zwei Kabel. Doch wenn man das Ganze mit drei Leitungen macht wird es schon interessanter:
(Bild: By Matthiaspaul - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=28150690)Jetzt können 6 LEDs angesteuert werden. Bei der MobaLedLib verwenden wir 4 Leitungen und können damit 12 LEDs ansprechen!
Details dazu findet man z.B. hier:
https://en.wikipedia.org/wiki/Charlieplexing50 Hz / 60 Hz:Jetzt ist es aber so, dass die LEDs nicht gleichzeitig leuchten können ;-( Das kann man aber umgehen in dem man sie ganz schnell nacheinander einschaltet. Das menschliche Auge sieht das nicht, wenn nur schnell genug umgeschaltet wird. Wenn also mehrere LEDs gleichzeitig leuchten sollen, dann wird kurz die LED 1 und dann kurz die LED 2 und so weiter angeschaltet. Damit man das nicht sieht sollten alle LEDs innerhalb von 20 ms (50Hz) einmal leuchten. Das ist sicherlich auch ein Grund warum unser Stromnetzt mit 50 Hz betrieben wird. Neonröhren leuchten nämlich auch nicht permanent sondern flimmern mit eben diesen 50 Hz. Darum werden auch Video Aufnahmen bei uns mit 50 Hz gemacht. Hat man versehentlich 60 Hz eingestellt, dann flimmert es ganz schrecklich in Räumen welche mit Neonlicht oder LEDs beleuchtet sind.
Das Phänomen hat man auch bei unseren LEDs. Wenn sie mit 50 Hz aktualisiert werden, dann flimmern sie bei einer amerikanischen Videoaufzeichnung. Das geht aber gar nicht. Es gibt nichts Schlimmeres als flackernde LEDs in einem Video. Darum betreibe ich die LEDs mit 300 Hz. Bei dieser Frequenz fühlen sich 50 Hz und 60 Hz Kameras wohl.
Dazu muss der Prozessor die LEDs mit einer Frequenz von 12*300Hz = 3.6 kHz umschalten. Er muss alle 0.28 ms die Spannung an den Anschlüssen verändern. Das ist für einen Prozessor kein Problem. Man programmiert einen Interrupt der den Prozessor alle 0.28 ms unterbricht damit er die nächste LED ansteuert wenn diese leuchten soll.
Helligkeit dimmen:Aber das ist leider noch nicht alles. Wenn man die Helligkeit der LEDs verändern will, dann muss man die Zeit in der eine LED leuchtet verändern.
Eine variable Helligkeit ist ganz wichtig damit die Signale schön langsam ihre Zustände wechseln wie das bei den alten Birnen der Bahn so war.
Dazu wird die Interrupt Frequenz einfach noch ein bisschen erhöht. Wenn man 16 verschiedene Helligkeiten darstellen will, dann verwendet man eine Frequenz von 12*300Hz*15 = 54 kHz (Die „Helligkeit“ 0 benötigt keine Zeit. Darum wird in der Formel die 15 verwendet.).
Das ist jetzt aber schon viel für unseren kleinen Prozessor. Er wird jetzt alle 18.5 us in seiner Arbeit unterbrochen damit er Plus- und Minuspole vertauschen kann. Dabei muss er auch noch peinlichst genau darauf achten, dass er nicht die falsche LED an macht oder versehentlich einer LED den Saft zu früh abdreht. In der Zeit zwischen zwei Interrupts kann er gerade mal 296 ASM Befehle abarbeiten abzüglich der Zeit die er im Interrupt verbringt.
Mehr als 16 Helligkeitswerte:Das war mir aber immer noch nicht genug. 16 Helligkeitswerte reichen nicht aus für ein sanftes Auf- oder Abblenden einer LED. Ganz kritisch wird es wenn man die Helligkeit einer LED reduzieren will weil diese sonst heller als die anderen wäre. Weiße und Blaue LEDs leuchten deutlich heller als ihre grünen und roten Kollegen. Wenn die Helligkeit der weisen LED halbiert werden soll bleiben nur noch 8 Helligkeitswerte übrig. Das sieht dann gar nicht mehr gut aus.
Darum habe ich nach einer Möglichkeit gesucht wie man die Dauer in der eine LED mit Strom versorgt wird weiter unterteilen kann ohne die Interrupt Frequenz zu erhöhen.
Ich versuche das mal an dem folgenden Bild zu erklären. Hier sieht man Helligkeitsverläufe dreier LEDs. Jede LED hat einen eigenen Zeitabschnitt indem sie angesprochen wird. Die Kästchen zeigen den Bereich jeder LED. Dabei besteht ein Bereich aus 15 Interrupt Perioden. Zuerst bekommt die rote LED Zugriff auf die Charlieplexing Leitungen. Sie nutzt etwas weniger als die Hälfte „Ihrer“ Zeit zum Leuchten. Die grüne LED nutzt etwas mehr Zeit als die Hälfte und die blaue LED nur eine Interrupt Periode.
Die LEDs werden wie oben gefordert mit 300 Hz aktualisiert.
Wenn man jetzt hingeht und innerhalb eines Zeitabschnitts zwei LEDs anspricht dann verdoppelt sich die Aktualisierungsfrequenz der LEDs. Sie werden jetzt mit 600 Hz aktualisiert ohne dass die Interrupt Frequenz verändert wurde.
So eine hohe Updaterate ist aber nicht nötig. Darum kann man die Anzahl der Helligkeitsschritte verdoppeln. Damit wird das Bild gestreckt:
Jetzt haben wir wieder 300 Hz, es sind aber 32 Helligkeiten möglich! Das ist doch Klasse!
An der blauen LED sehen wir aber ein Problem dieser Methode. Da sie nur eine Interrupt Periode lang an ist kann sie nur in jedem zweiten Kästchen angeschaltet werden damit die Helligkeit erhalten bleibt. Diese LED wird also nur noch mit 150 Hz aktualisiert. Wenn man genau hinschaut sieht man diesen Effekt auch bei den anderen beiden LEDs. Auch sie sind unterschiedlich lange in zwei aufeinanderfolgenden Abschnitten aktiv. Diesen Unterschied von 18.5 us sieht man aber nicht.
Im Programm habe ich nicht zwei LEDs sondern acht in einen Zeitabschnitt gepackt. Dadurch können die LEDs jetzt
mit 128 verschiedenen Helligkeiten angesteuert werden ohne dass der Prozessor mehr zu tun hat.
Hat mir irgendjemand folgen können?
Nein, dann ist Euch sicherlich auch nicht aufgefallen, dass die LEDs bei 8 Zeitabschnitten und niedrigen Helligkeiten mit weniger als 50 Hz angesteuert werden. Das macht nichts. Dieser Effekt tritt nur dann auf wenn die Helligkeit kleiner 4 ist. Dieser Wert wird aber normalerweise nur während des Abblendens der LED für kurze Zeit verwendet. => Das sieht man nicht.
Zusammenfassung:Bei dem von mir entwickelten Verfahren werden
12 LEDs über
4 Kabel mit einer Frequenz von
300 Hz aktualisiert. Dabei sind
128 verschiedene Helligkeiten möglich.
Nachteil des CharlieplexingDadurch dass immer nur eine LED gleichzeitig angesteuert werden kann leuchten die LEDs deutlich dunkler. Das kann man dadurch kompensieren dass man sie mit einem größeren Strom betreibt. Allerdings kommt man hier schnell an die Stromgrenzen des Prozessors. Für den Einsatz in einem Signal oder in einer Ampel auf der Modelleisenbahn spielt diese Beschränkung aber keine Rolle. Hier sind die LEDs eher zu hell. Das Charlieplexing Verfahren eignet sich aber nicht zur Beleuchtung von Häusern oder ähnlichem. Aber hier ist genug Platz vorhanden so dass man WS2812 LEDs einsetzen kann.
Eigentlich kann ich jetzt auch einfach zufällige Wörter einfügen. Das fällt eh keinem mehr auf…
Integration in den Pattern_Configurator: Welche LEDs wann aufleuchten sollen wird mit dem Pattern_Configurator definiert. Hier trägt man wie sonst auch bei der MobaLedLib an den Stellen ein X ein an denen eine LED leuchten soll. Die bestehenden Konfigurationen können direkt übernommen werden.
Neu hinzugekommen ist das Feld „Spezial Mode:“ und die dazu gehörenden Eingaben.
Wenn in diesem Mode „Charlieplexing ausgewählt wird, dann erscheinen die zusätzlichen Zeilen und der „Programm Generator“ Knopf wird zur „Zum Modul schicken“ Schaltfläche.
Die Angabe
„RGB Modul Nummer:“ beschreibt die Position des Charlieplexing Moduls in der RGB LED Kette. Solange man das Modul auf dem Schreibtisch konfiguriert ist diese Nummer einfach anhand des Steckplatzes der Verteilerplatine zu ermitteln. Wenn man aber ein Modul auf der Anlage konfigurieren will kann ist die Nummer über welche das Modul angesprochen wird nicht immer bekannt. Mit dem folgenden Dialog kann die LED Adresse ausgewählt werden:
In der Zeile
„Charlieplexing LED Zuordnung:“ wird die Zuordnung der LEDs bestimmt. Damit kann man ein Muster an verschiedene Geräte anpassen. Das Problem dabei ist, dass die Nummerierung der LEDs nicht einheitlich ist. Jeder Hersteller kocht seine eigne Suppe. Mit dieser Zuordnung kann das Adaptiert werden. Die entsprechenden Werte können entweder aus einer Liste ausgewählt werden oder von Hand eingegeben werden. Die manuelle Eingabe erlaubt die Adaption an jedes Beliebige Charlieplexing Modul. Die dazu benötigten Nummern werden ganz einfach über die Beispielkonfiguration „Charlieplex.LED Test“ welche sich in dem Pattern_Configurator befindet ermittelt (Siehe unten).
Mit der Aktivierung der
„Analoge Eingänge:“ kann man das Charlieplexing Modul ganz unabhängig von der MobaLedLib einsetzen. Damit kann die Platine bis zu 10 Taster/Schalter einlesen mit welchen die Anzeige umgeschaltet werden kann.
„Zum Modul schicken“ Knopf:Dieser unscheinbare Knopf hat es in sich. Damit wird das im Pattern_Configurator erstellte Muster zum Charlieplexing Modul geschickt. Dazu muss das Modul nicht ausgebaut werden. Die Daten werden über den „LED-Bus“ zum ATTiny geschickt.
Beim LED Arduino wird jedes Mal bei einer Änderung der Konfiguration ein neues Programm erstellt und zum Nano geschickt. Das funktioniert bei dem ATTiny, welcher auf dem Charlieplexing Modul eingesetzt wird, nicht weil dieser über keine USB Schnittstelle zur Programmierung verfügt. Wenn man dem ATTiny ein neues Programm schicken will muss dieser ausgebaut werden und in einen Programmieradapter (z.B. den Tiny_UniProg) gesteckt werden. Das ist recht unkomfortabel. Darum habe ich einen anderen Weg zur Konfiguration entwickelt. Beim Charlieplexing Modul wird die Konfiguration im EEPROM gespeichert. Für die kleinen Konfigurationen dieses Moduls reichen die 512 Bytes des EEPROMs locker aus. Beim LED-Arduino würde das nicht reichen.
Zur Übertragung der Informationen wird ein spezielles Blinkmuster verwendet. Dazu sendet das Excel Programm verschiedene Helligkeitswerte über den LED Arduino zum Charlieplexing Modul. Dabei wird der bestehende „LED-Bus“ verwendet. Das Modul kann also einfach auf der Anlage konfiguriert werden. Dummerweise hat dieser „Bus“ keinen Rückkanal. Es kann also nicht geprüft werden ob die Informationen überhaupt ankommen. Diese Aufgabe muss der Benutzer übernehmen. Beim Übertragen flackern alle an dem Charlieplexing Modul angeschlossenen LEDs ganz wild. Daran erkennt man gleich, dass die Daten empfangen werden. Das Programm zeigt dabei diese Meldung:
Mit den Daten wird eine CRC Prüfsumme übertragen. Damit kann das Programm auf dem ATTiny prüfen ob die Daten korrekt empfangen wurden. Wenn das nicht der Fall ist, dann blinken alle LEDs am Ende schnell (0.5Hz). Bei korrekter Übertragung wird das entsprechend LED Muster angezeigt.
Wenn das Muster den „Goto Mode“ benutzt, dann wird im Anschluss ein Dialog gezeigt mit dem man die verschiedenen Anzeigen testen kann:
So kann man ganz schnell überprüfen ob man alles richtig konfiguriert hat.
Achtung: Die Maske erscheint auch wenn die Kommunikation zum ATTiny nicht erfolgreich war weil das Programm nicht erkennen kann ob das Charlieplexing Modul angeschlossen ist und richtig funktioniert ;-(
Nummerierung der LEDs:Namen sind bekanntlich Schall und Rauch. Bei den „Namen“ der LEDs ist es nicht anders. Jeder Hersteller benutzt ein anderes Schema. Für die MobaLedLib habe ich willkürlich diese Nummerierung eingeführt:
Dabei sind die LEDs folgendermaßen angeschlossen. Die Nummern im Bild oben entsprechen den grünen „Ref …“ Nummern und nicht den „L …“ Bezeichnungen.
Wenn man die Zuordnung eines neuen Signals ermitteln will, dann geht man folgendermaßen vor:
Das Charlieplexing eignet sich auch sehr gut für
Verkehrsampeln.
=> Frage an unsere 3D Künstler: Wollt Ihr nicht auch mal eine Ampel drucken und sie dem Forum zur Verfügung stellen?
Das was man käuflich erwerben kann ist entweder hässlich oder teuer oder beides ;-(
Programmierung des Charlieplexing Moduls: Der Prozessor auf dem Modul muss einmalig mit dem Programm bespielt werden. Dazu benötigt man einen Programmieradapter da der ATTiny keinen USB Anschluss hat.
Mit dem Tiny_UniProg kann man das Programm auf den ATTiny85 schreiben. Doch dazu muss zunächst der Tiny_UniProg mit dem richtigen Programm versorgt werden.
Zur Vereinfachung dieses Prozesses habe ich eine neue Seite in das Hauptmenu des Patern_Configuarators eingefügt (Das Hauptmenu wird über den LED Kranz links oben geöffnet):
Mit dem Knopf „Prog. ISP“ wird das Programm zum Tiny_UniProg geschickt.
Anschließend klickt man den Knopf „Prog. Charlieplex“ an und das Programm wird zum ATTiny geschickt. Dieser kann dann aus dem Programmieradapter in die Charlieplexing Platine gesteckt werden.
Ich bin sehr gespannt ob das bei Euch alles so funktioniert. Das Programm prüft sogar ob alle benötigten Bibliotheken vorhanden sind und installiert diese bei Bedarf nach.
Farbkasten: Mark hat den Begriff „Farbkasten“ geprägt. Damit bezeichnet er das Farbtest Programm von Harold mit dem man inzwischen viel mehr als nur die Farben testen kann.
Das Programm sieht inzwischen so aus:
Es hat eine recht ausführliche Hilfe darum werde ich jetzt nicht weiter dazu schreiben außer
Vielen Dank HaraldKaputte Neonröhre: Ich habe ich mal meine destruktive Ader ausgelebt und Neonröhren kaputt gemacht. Diese habe ich eingescannt und in das Programm integriert. Es gibt jetzt 4 neue Beleuchtungstypen im „House()“ Dialog:
Der Typ „NEON_DEF_D“ bezieht sich auf eine RGB LED, die drei anderen auf einzelne LEDs wie das auch schon bei anderen „Räumen“ so ist. Die Grundhelligkeit der Lampe wird über „NEON_LIGHTD“ mit dem „Farbkasten“ eingestellt. Hier ist es nicht mehr nötig, dass der rote Kanal <= 11 ist.
Die zweite Erweiterung des Dialogs findet man etwas weiter unten. Mit dem Feld „Eingang invertieren“ kann man die Hausbeleuchtung über die „Schedule“ Funktion einschalten, wenn es Tag wird. Das ist z.B. bei Geschäften erwünscht.
Meine Untersuchungen haben gezeigt, dass es sehr viele verschiedene Arten von defekten Neonlampen gibt. Damit man alle diese Varianten auf der Anlage erleben kann habe ich ein Makro zur Konfiguration des Fehlerbildes eingefügt:
Es kann mit diesen Parametern angepasst werden:
Etwas weiter unten findet man auch das Makro von Misha zur Simulation der defekten Lampe.
Wenn Ihr ein eigenes Muster entwickelt habt welches andere auch gebrauchen können, dann her damit. Ihr wisst ja, das ist ein „Mitmachthread“. Es muss nicht alles der Onkel Hardi machen…
Falls Ihr noch nicht ganz zugetextet seid habt Ihr gesehen, dass es noch weitere Konfigurationsmakros gibt: Set_TV_COL1, Set_TV_COL2, Set_TV_BW1 und Set_TV_BW2.
Damit können jetzt die beiden Fernsehprogramme angepasst werden. Bei den Farbprogrammen variieren die Anteile der Farben zufällig. Bei den Schwarz-Weiß TV können die Anteile der Farben ebenfalls angepasst werden damit man den typischen Blauschimmer exakt treffen kann. Das Verhältnis der Farben untereinander ist aber konstant.
Die Befehle zum definieren des TV verfügen, ebenso wie die Neon Konfiguration über einen Schalter zum aktivieren des Effekts. Damit kann man per DCC Kommando unterschiedliches TV Programm auswählen. Dieser Schalter wirkt sich aber immer auf alle TV Geräte bei denen der gleiche Kanal eingestellt ist simultan aus.
Bei defekten Neon Licht können für jedes Haus eine andere Fehlervariante konfiguriert und geschaltet werden.
Wer Bitteschön braucht so einen Quatsch? Und wer denkt sich so einen Blödsinn aus?
Eine der 1001 anderen Änderungen habe ich auf Alfs Vorschlag hin eingebaut:
Ist das besser als vorher?
Stammtisch: Beim nächsten virtuellen Stammtisch kann ich Euch das ganze mal vorführen falls es jemanden interessiert…
Probleme Melden: Bei so vielen Änderungen kann es passieren, dass sich Fehler einschleichen. Die ersten hatten wir ja schon, dass bei der Version 1.0.0 nicht alle neuen Programme enthalten waren ;-(
Ich liebe GitHub…
Jetzt ist das hoffentlich behoben.
Wenn Ihr irgendwas entdeckt, das Euch komisch vorkommt, dann meldet Euch. Nur so kann ich die Fehler und Probleme beheben und die anderen müssen nicht auch noch darüber stolpern.
Und überlasst nicht wieder alles testen dem Kollegen Ulrich.
Ich bin jederzeit auch über Korrekturen meiner Linksschreibung dankbar (Per Mail, es muss ja nicht jeder merken, dass ich nicht schreiben kann).
Einen Fehler habe ich gerade selber entdeckt: Die Farbstichkorrektur im „Farbkasten“ enthält alte Einträge. Dadurch wird nur ein Farbrad und kein Farbkreis angezeigt. Mit 255, 175 und 200 sieht das schon viel besser aus.
So, jetzt sind 12 DIN A4 Seiten voll. Das reicht für heute.
Edit: 8.2.20: In der Version 1.0.0 wurden dummerweise nicht alle Dateien hochgeladen
=> Es muss die Version 1.0.1 verwendet werdenHardi