Hallo Community,
ich habe in der letzten Zeit einige Stunden in die Ansteuerung einer RGB-LED investiert, und möchte Euch jetzt gerne an den Resultaten teilhaben lassen.
Worum geht’s:
Beim Chinesen Eurer Wahl und evtl. auch in dem einen oder anderen Zubehörshop gibt es sog. RGB-LED Module
Dieses kleine Modul besteht aus einem kleinen Gehäuse mit jeweils einer roten, grünen und blauen LED.
Es stellt Anschlüsse für die gemeinsame Masse sowie jeweils einen Steuereingang für die rote, grüne und blaue LED zur Verfügung. SMD-Vorwiderstände sind bereits aufgelötet.
Funktional ist dieses Modul nichts anderes als eine einzelne „Lampe“ aus einer RGB-LED-Lichterkette, die es mit und ohne Fernsteuerung für Lichteffekte zu kaufen bekommt.
Mich hat nun mal interessiert, ob und wie man so ein RGB-Modul vom Rpi aus ansteuern kann.
Die Idee:
Wenn also dieses Modul alle Funktionen einer RGB-Lichterkette beinhaltet, dann liegt es für mich nahe, es z.B. als Status-Anzeige einzusetzen.
z.B. Dauer-grün: idle, blinkend-blau: Netzwerk aktiv, blinkend-grün: busy, blinkend-rot: Zugriff auf externen Datenträger, … je höher die Blinkfrequenz, umso höher die jeweilige Auslastung, … usw.
Da zusätzlich zur Blinkfrequenz auch die Steuerung der Helligkeit möglich ist, wäre auch eine attraktive Gehäusebeleuchtung denkbar. Mit Farbwechsel, hell-dunkel Schaltung, … evtl. über Tabellen auch tageszeit-abhängig.
Anschluss und Spannungsversorgung:
Zunächst habe ich das Modul mal mit eigener Spannungsversorgung auf ein Breadboard gesteckt und durchgemessen. Da die einzelnen Farben jeweils 6 bzw. 14 mA benötigten und der Rpi dann doch eher wenig Leistung auf seinen GPIOs bringt, habe ich die drei Kanäle des RGB-Moduls über jeweils einen Transistor angesteuert. Man kann ja nie wissen und sicher ist sicher.
Nach ein bisschen Herumtüfteln bin ich dann bei der Schaltung im Anhang gelandet. Ich habe mir sagen lassen, dass sie nicht besonders effektiv ist, aber das ist ja nicht mein primäres Ziel. Sie funktioniert so weit einwandfrei und man kann sicherlich durch optimieren noch eine höhere Leuchtstärke aus dem Modul hervorlocken. Wer also eine verbesserte Version hat: her damit.
Der Strom, der vom Rpi hier zur Verfügung gestellt werden muss beträgt pro Farbe etwa 0,02 mA.
Ansteuerung:
Ja und wie jetzt ansteuern? Da der Rpi nur einen „echten“ PWM Kanal hat, war ich zunächst mal gekniffen und hatte mich schon damit abgefunden die Pulsweiten-Modulation in „C“ auf den einzelnen GPIOs selbst zu erzeugen.
mmi gab mir dann den Tipp mit pigpio und dieser Tipp war Gold wert.
Mithilfe dieser Bibliothek habe ich dann noch ein ziemlich umfangreiches Testprogramm gebastelt, das u.a. einen Server beinhaltet und per telnet ferngesteuert werden kann.
So ist es möglich für jede Farbe Frequenz und Intensität zu bestimmen und direkt zuzuschauen welche Auswirkung die Änderung der Werte hat.
Im Anhang findet ihr das Testprogramm inkl. Bash-script zum Kompilieren.
Zum Übersetzen bzw. Linken wird die pigpio-Library benötigt, die ihr hier herunterladen könnt.
Auf der Homepage des Autors findet ihr weitere Informationen zu dieser Library, die es mittlerweile auch als Daemon-Version gibt.
Ich habe mir das jetzt noch nicht genauer angeschaut, aber ich denke dass man die Funktionalität, die ich in mein Testprogramm eingebaut habe, dadurch auch aus anderen Sprachen, wohl auch script-Sprachen wie python und/oder PHP resp. direkt aus der bash zur Verfügung hat.
Der Port über den dieser Server erreichbar ist lautet 3434.
telnet ist übrigens bei wheezy nicht standardmässig verfügbar und muss mit "sudo apt-get install telnet" seperat installiert werden.
An dieser Stelle vielleicht noch ein paar Worte zum Testprogramm-Aufbau:
Das Programm besteht aus vier pthreads von denen drei für die Ansteuerung jeweils einer Farbe zuständig sind und einer für die Server-Funktionalität.
Es muss mit "sudo" aufgerufen werden und läuft dann als Daemon im Hintergrund und abgekoppelt von der aufrufenden bash.
Beendet werden kann es lediglich mit kill bzw. über die telnet-Verbindung.
Es handelt sich im Moment um eine alpha-2 Version ... mit einigen Verbesserungen gegenüber der Sourcen aus dem RGB-LED Thread.
Per default werden die GPIOs 23, 24 und 25 zur Ausgabe der PWM-Signale (R, G und B) benutzt.
Um die sudo-Problematik zu umgehen, kann man entweder die sudoers editieren oder mit dem s-Bit arbeiten.
In dem Moment, in dem einer der Threads sich, aus welchen Gründen auch immer, beendet, wird das gesamte Programm beendet.
Ein bisschen Kosmetik und Fehlerhandling werden demnächst noch folgen, dann lade ich es voraussichtlich auf github hoch. Die URL gebe ich dann hier bekannt.
Ausgaben des "Daemon" erfolgen entweder über die telnet-Konsole oder im syslog.
Und hier noch kurz eine Zusammenfassung der Kommandos für die telnet-Konsole:
r={0-255} setzt die Intensität für rot auf einen wert zwischen 0 (off) und 255 (volle Intensität)
Analog dazu: g={0-255} für grün und b={0-255} für blau.
R=wert[H|K|M] setzt die Frequenz für rot auf wert. Folgt auf wert ein H, K oder M wird der Wert als Hertz, Kilohertz bzw. Megahertz interpretiert. Ohne Angabe wird KHz angenommen. Ein Wert von 0 schaltet die PWM für diese Farbe ab.
Analog dazu: G=wert[H|K|M] für den Grünwert, B=wert[H|K|M] für den Blauwert.
r+, r-, g+, g-, b+, b- inkremetiert bzw. dekrementiert die Intesität für den entsprechenden Kanal um eins.
R+, G+, B+, R-, G-, B- inkrementier bzw. dekrementiert die Frequenz für den entsprechenden Kanal um <increment value> bzw. <decrement value>
i=wert setzt den <increment value>, d=wert setzt den <decrement value>
Mit
r, g, b, R, G, B, i, d können die entsprechenden Werte angezeigt werden.
a zeigt alle Einstellungen an
q oder Q beendet die telnet-Verbindung, das Programm läuft weiter
x oder X beendet sowohl die telnet-Verbindung als auch das Programm
//EDIT: Bug fix: telnet session wurde nicht mit q beendet ...
weitere Info: siehe screenshots
So, ich hoffe, ich habe nichts vergessen.
Ciao,
-ds-