PWM - RGB-Modul: Status und Lichteffekte für RPi

  • 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-

  • Hi dreamshader,


    ich wollte das ähnliches ursprünlich mit pi-blaster machen, jedoch stürzt bei mir das system immer ab wenn ich dort eine input datei bearbeiten möchte. deshabl habe ich mich nun nach was anderem umgegeuckt und bin bei deinem tutorial hängen geblieben.
    Die lib ist bereits installiert und beim test haben meine angeschlossenen leds schon geleuchtet.
    Ich würde eigentlich ungern mit telnet arbeiten sondern einfach ein script haben das eine textdatei überwacht und wenn sich dort etwas ändert dann die ausgabe auf den gpios macht. hast du eine idee wie ich als anfänger starten kann?


    grüße jan


    Edit: Ich habe es nun doch mit pi-blaster hinbekommen, was wesentlich einfacher für meinen Anwendungsfall ist. Trotzdem danke fürs tut

    Edited once, last by japhias ().

  • Ja hallo japhias,


    hmm ... mit lib meinst Du bestimmt die pigpio ...
    Hast Du Dich auf der Seite mal ein bisschen umgeschaut?
    Wenn ich mich nicht irre, dann kannst Du die pigpio auch aus Scriptsprachen heraus verwenden.
    Ich habe da jetzt nicht so sehr den Plan, weil ich praktisch alles in C mache.
    Aber wenn Du da nicht weiterkommst, dann helfe ich Dir gerne beim eruieren.


    cu,
    -ds-

  • Dane für die schnelle Antwort, hatte gerade noch nachgeschoben, dass ich jetzt eine Lösung mit pi-blaster hin bekommen habe. Klappt prima.


    Aber mal eine generelle Frage zu den Farben der rgbLED. Kannst du auch beobachten, dass das "Farbenmischen" nicht so wirklich gut funktioniert. Beispielsweise ist dies der rgb Wert für Violett: 153,50,204. Wenn man das auf Prozent umrechnet un an den gpios ausgibt, ist es aber eher weiß als Violett.
    Liegt das an meinen LEDs, oder ist es generell schwierig bei rgbLEDs?

  • Hi,


    schön, wenn Du es mittlerweile selbst hinbekommen hast :)


    Das mit den RGB-LEDs ... da steck ich leider nicht tief genug drin. Ich besorg mir nur hin und wieder mal so ein China-Gimmick weil es mich interessiert und ich wissen will, ob ich das irgendwie angesteuert bekomme.


    Mir ist allerdings z.B. aufgefallen, dass allein die Helligkeit der einzelnen LEDs schon unterschiedlich ist (bei gleicher Ansteuerung) und dass z.B. eine rote LED ein anderes Stromverhalten hat, als eine grüne oder blaue.


    Mit ein bisschen Glück könnten orb oder mmi was dazu zu schreiben.


    cu,
    -ds-

  • Hallo zusammen,


    japhias, Deine Vermutung ist schon richtig.


    Vorausgesetzt, Du hast für jede der 3 LEDs (R+G+B) einen eigenen Vorwiderstand verwendet und passend berechnet (unterschiedliche Spannungsversorgung), wird Dir insbesondere bei BLAU auffallen, daß es im Vergleich zu ROT und GRÜN deutlich dunkler bleibt.
    Vereinzelt werden deshalb auch RGB mit zwei blauen Dioden angeboten - eigentlich müsste man dann RGBB-LED sagen. ;)


    Wenn Du zu einem "neutralen" Ergebnis kommen möchtest, könnte man PWM für ROT und GRÜN entsprechend ändern, dann wird es aber schon deutlich dunkler.


    Oder zur eingebauten blauen LED parallel noch 1-2 weitere blaue hinzufügen, wenn es designmässig noch gut aussieht. :shy:


    Gruß, mmi

  • moin,...


    ich hab mir einen RGB LED Strip gekauft und diesen per TIP120er an den RPi geklemmt..
    wenn ich die pigpio library installiere und dann über das programm "pigs" die einzelnen pins mit entsprechenden werten versehe, klappt alles wunderbar..
    z.b.
    pigs p 23 50
    pigs p 24 90
    pigs p 25 120


    EDIT:
    ok.. fehler gefunden.. klappte nicht, weil pigpio noch im hintergrund lief...


    was bringt dein testprogramm für vorteile gegebüber des programms "pigs"?
    ausser, dass du hiermit telnet als schnittstelle bereitstellst..

    Edited once, last by demlak ().

  • Hi,


    ...
    was bringt dein testprogramm für vorteile gegebüber des programms "pigs"?
    ausser, dass du hiermit telnet als schnittstelle bereitstellst..


    muss denn alles immer Vorteile haben? Ist ja kein "Konkurrenz-Produkt" ;)
    Ausserdem war imho pigs damals noch nicht so weit. Das hat sich im Laufe der Zeit auch weiterentwickelt.
    Der Vorteil für mich: ich hab' es selbst geschrieben und habe dadurch die Funktionsweise besser verstanden. Schliesslich möchte ich PWM auch anderweitig verwenden. Ausserdem bleib ich in Übung mit der Programmiererei.


    cu,
    -ds-

  • war auch nich als kritik gemeint.. eher eine frage nach features =)


    ich stelle hier grad fest, dass Rot auf GPIO23 (also Pin16) von alleine heller wird.. ich hab keinen plan woher das kommt.. fehler in der lib?
    das passiert auch nach einem reboot und nur dem starten des daemons.. hat hier sonst noch wer solche erfahrungen?

  • ne.. vergiss es.. das liegt irgendwie an meiner schaltung.. ich schätze ein bauteil im eimer, oder so.. denn ich stelle das auch fest, wenn die schaltung nicht am RPi hängt.. einer meiner 3 kanäle macht murks..


    liegt entweder am TIP120 oder an meiner DAC schaltung davor..


    DAC (PWM -> Volt - Wandler): http://www.instructables.com/i…t-PWM-to-Voltage/?lang=de)



    ich tausch mal bauteile durch

  • Hi,
    ich wurde kürzlich auf einen Fehler im Programm hingewiesen: man konnte die telnet-session nur verlassen, wenn man zugleich das Programm mit x beendet.
    q (für quit) funktionierte nicht ...
    Fehler ist behoben und der Anhang im Ausgangspost aktualisiert.


    //EDIT:
      Knipex95 : wenn Du schon eine PN mit dem Hinweis schickst und dann vermutlich auf eine Antwort wartest, wäre es sinnvoll den Empfang für private Nachrichten freizuschalten ;)


    cu,
    -ds-

  • @ dreamshader
    Das mit der PN Sperre habe ich komplett vergessen Sorry :wallbash:


    Ich habe das neue Programm Heruntergeladen und neu Instilliert.
    Doch leider ist bei mir das Problem noch nicht behoben.
    Es ist leider immer noch so dass wenn ich mein Telnet Programm (Putty oder Hercules) einfach beende
    ohne die Verbindung mit Q oder q zuvor geschlossen zu haben kann ich keine neue Verbindung mehr aufbauen.


    Ich hoffe das ich bei der Installation kein Mühl gebaut habe.
    Wenn du sagst das das Problem in deinem Neuen Programm nicht mehr auftaucht
    muss ich wohl oder übel den Raspberry neu Installieren.


    MFG
    Knipex95

  • Hi,


    ...
    ... wenn ich mein Telnet Programm (Putty oder Hercules) einfach beende
    ohne die Verbindung mit Q oder q zuvor geschlossen zu haben ...
    ...


    na das ist jetzt aber eine andere Geschichte. Vorher konntest Du ja auch keine Verbindung mehr aufbauen, selbst wenn Du die Session mit q geschlossen hattest.
    Jetzt scheint die Verbindung nicht geschlossen zu werden und deshalb ist kein Verbindungsaufbau möglich. Kann sein, dass die nach einer gewissen Zeit (Timeout) freigegeben wird ... ansonsten müsste ich erst mal überlegen, ob man da was mit SIGHUP oder so machen kann ...
    Das kann aber ein Weilchen dauern.


    cu,
    -ds-

  • Danke schon mal das du dir meinem Problem angenommen hast.
    Ich werde den Punkt mit dem Timeout mal testen.
    Wenn nicht wäre es Super wenn du die Erkennung einbaust ob die Verbindung unterbrochen wurde.


    Ich Schreib noch mal wenn ich den Timeout getestet habe.


    //Edit
    Ich habe kein Timeout gefunden :D


    MFG
    Knipex95

    Edited once, last by Knipex95 ().

  • Hey dreamshader,
    Hey Leute,


    Ich versuche mich gerade an der .c datei von dreamshader.


    Ich versuche diese zu compelieren jedoch kommen eine menge an fehlern...



    Was mach ich falsch bzw. was fehlt mir damit es keine "undefined reference to `......" fehler mehr gibt??


    Vielen dank schon ein mal.


    Ecurb

  • Hi Ecurb,



    ...
    Was mach ich falsch bzw. ...


    schau mal in den Soruce-code:


    Code
    1. * *********************************************************************************
    2. * needs: pigpio-Library (http://abyz.co.uk/rpi/pigpio/pigpio.tar)
    3. * Compile:
    4. *
    5. * gcc -o rgb_soft_pwm rgb_soft_pwm.c -I /usr/local/include -L /usr/local/lib
    6. * -l pigpio -l rt -l pthread
    7. *
    8. * *********************************************************************************


    Alles klar? ;)


    cu,
    -ds-

  • Klasse Tutorial und ziemlich genau das, was ich suche :bravo2:


    Aber: Wie kann ich mehrere RGB LEDs unabhängig voneinander steuern ?