RGB-LEDs ansteuern
lerne wie du RGB-LEDs richtig ansteuerst, um verschiedene Lichtfarben zu erzeugen und wie die Technik dahinter funktioniert. Der perfekte Enstieg in ein neues Maker-Projekt.
RGB-LEDs sind Leuchtdioden, die Licht in sämtlichen Farben darstellen können. Dabei machen sie sich dem Prinzip der additiven Farbmischung zunutze: alle Farbtöne lassen sich nämlich durch Überlagerung (Addition) der drei Grundfarben rot, grün und blau erzeugen. Deshalb besteht eine RGB-LED streng genommen aus 3 einzelnen LEDs, die in den Grundfarben rot, grün und blau leuchten. Eine erweiterte Variante ist die RGBW-LED, die zusätzlich eine weiße LED enthält.
Eine bestimmte Farbe wird durch die gezielte Steuerung der Intensität (Helligkeit) der einzelnen LEDs angesteuert: beispielsweise ist die Farbe gelb nichts anderes als die Überlagerung von Rot und Grün. Deshalb lässt sich diese Farbe erzeugen, in dem man die rote und grüne LED mit voller Intensität ansteuert, die blaue LED bleibt aus. Die Intensität der einzelnen LEDs wird durch den RGB-Wert der Farbe vorgegeben:
Der RGB-Wert (RGB steht für Rot, Grün, Blau) gibt für jede der drei Grundfarben die Intensität mit einem Wert zischen 0 (kein Farbanteil) und 255 (volle Intensität) an. Beispielsweise hat Weiß den RGB-Wert 255, 255, 255. Das heißt: alle drei Farben sind mit der vollen Intensität vertreten. Das satte Gelb aus dem Beispiel oben hat dagegen den RGB-Wert 255, 255, 0: nur rot und grün sind mit voller Intensität vertreten, blau dagegen gar nicht.
Bauformen und Einsatzbereiche
RGB-LEDs gibt es sowohl in runden, transparenten Gehäusen (weit verbreitet ist ein Gehäuse mit 5 mm Durchmesser, daher auch 5mm-LED genannt), wie auch in eckiger Bauform. Die runden Gehäuse sind dabei meist für das Verlöten an Drähten oder Lochplatinen (THT-Methode) vorgesehen. Die eckigen Gehäuse sind meist für die SMD-Montage vorgesehen.
Neben diesen diskreten RGB-LEDs (d.h. jede LED ist einzeln für sich in einem Gehäuse) gibt es noch verschiedene adressierbare LEDs. Dabei lassen sich mehrere LEDs in einer Reihe zusammenschließen und die Farben jeder RGB-LED mit einer einzelnen Datenleitung festlegen, die alle RGB-LEDs mit einem Controller verbindet (unten dazu mehr).
RGB-LEDs sind heute nicht nur als Signal-LED in vielen Geräten wie Smartphones, Bluetooth-Kopfhörer und anderen Wearables enthalten, sondern immer mehr auch als dem persönlichen Geschmack und der Stimmung anpassbare Hintergrundbeleuchtung, sei es das Stimmungslicht im Wohnzimmer, der Beleuchtung des Gaming-PC-Gehäuses oder im Partyraum.
Diskrete RGB-LEDs
Diskrete RGB-LEDs haben mindestens 4 Pins bzw. Anschlüsse. Je ein Pin wird für die Ansteuerung der drei Grundfarben rot, grün und blau benötigt. Der vierte Pin ist je nach Variante entweder die gemeinsame Versorgungsspannung aller 3 Farben (Common Anode) oder die gemeiname Masse (Common Cathode). Je nach dem unterscheidet sich die Ansteuerung: möchte man Common Anode-LEDs ansteuern, muss man das Signal am Pin für die jeweilige Farbe auf GND setzen, damit ein Strom durch die LED fleißt, sie also leuchtet. Bei Common Cathode LEDs legt man dagegen die Versorgungsspannung an die jeweiligen LEDs an, die gerade leuchten sollen. Folgendes Bild zeigt die Verschaltung für die verbreiteteren Common Anode-LEDs.
Würde man die einzelnen LEDs für die Grundfarben nur aus- oder einschalten, könnte man nur 7 Farben darstellen (Rot, Grün, Blau, Gelb, Cyan, Violett und Weiß). Für andere Farben muss man die Intensität der einzelnen Farben genauer regeln. Möglich macht das die Ansteuerung der einzelnen LEDs über ein getaktetes Rechtecksignal (sog. Pulsweitenmodulation oder kurz PWM). Die Intensität der einzelnen LED ergibt sich dabei aus dem Verhältnis des HIGH und LOW-Pegels des Rechtecksignals (dem sog. Tastverhältnis oder engl. Duty Cycle). Das Tastverhältnis pro LED d_rot, d_grün und d_blau ergibt sich dabei direkt aus dem RGB-Wert der gewünschten Farbe.
Das Bild unten zeigt, wie das Signal für die Farbe blau aussieht, wenn die LED getaktet angesteuert wird. Aus dem Verhältnis zwischen HIGH und LOW-Pegel lässt sich der RGB-Wert zurückrechnen: im Bild ist das Tastverhältnis etwa 50%, was einer Intensität von 255 mal 50 % = 127 entspricht. Der RGB-Wert beträgt also 0,0,127.
Steuert man die RGB-LED über einen Microcontroller an, muss man sich normalerweise gar nicht mehr um das Tastverhältnis kümmern. Herkömmliche Microcontroller besitzen einen 8-Bit DAC (Digital-Analog Converter), d.h. ihr Wertebereich 0...255 entspricht genau dem Wertebereich des RGB-Wertes. Möchte man also die RGB-LED blau leuchten lassen, genügt es, dem Pin für die blaue LED den Wert 255 (bei Common Cathode-LEDs) zu geben, was einem Tastverhältnis von 100% entspricht. Bei Common Anode-LEDs muss man den Wert gewünschten RGB-Wert dagegen von 255 abziehen, d.h. einem RGB-Wert von 255 entspricht in der Software einer 0, da der Pin den LOW-Zustand einnehmen muss, um die LED zum Leuchten zu bringen.
Adressierbare LEDs
Neben der diskreten Ansteuerung, bei der jede RGB-LED über 3 Datenpins (für rot, grün, blau) vom Microcontroller angesteuert werden müssen, haben sich in den letzten Jahren immer mehr adressierbare LEDs (oft auch Neopixels genannt) durchgesetzt. Sie bestehen aus einem Chip, der die RGB-LED und einen Controller-IC (welcher wiederum für jede Farbe das PWM-Signal für die Ansteuerung erzeugt) enthält. Mehrere RGB-LEDs werden in Reihe mit einer seriellen Datenleitung miteinander sowie mit einem Controller verbunden. Auf diese Weise lassen sich über nur eine Datenleitung die Farbe jeder einzelnen RGB-LED der Kette beliebig vorgeben. Diese Form der Ansteuerung findet sich heute weit verbreitet in Form von LED-Streifen, LED-Ringen oder als LED-Matrix.
Achtung bei der Verschaltung
Hier zeige ich dir die richtige Verschaltung für das weit verbreitete RGB-LED-Modell WS2812B. Durch ihre Versorgungsspannung von 5 V ist sie bestens für Microcontroller wie den Arduino geeignet. DIe RGB-LEDs sind mit dem Microcontroller über eine Datenleitung mit einem Serienwiderstand zwischen 300 Ohm und 500 Ohm (z.B. wie hier 430 Ohm). Der Widerstand dämpft dazu Spannungsspitzen in der Datenleitung, die durch die Schaltvorgänge bei der Ansteuerung der LEDs verursacht werden. Manche RGB-LED-Streifen wie die von Adafruit haben diesen Widerstand bereits fest verbaut. Wenn du dir nicht sicher bist, ob dein Modell einen Widerstand schon eingebaut hat, solltest du sicherheitshalber noch einen externen Widerstand verbauen (doppelt schadet hier nicht).
An einem Microcontroller, der per USB von einem Computer mit Strom versorgt wird, solltest du sowohl auf den max. Strom des GND-Pins am Microcontroller achten (bei einem Arduino gewöhnlich nur 200 mA) und anderseits auf den max. Strom des USB2.0-Ports. Normalerweise sollten es daher nicht mehr als 3 RGB-LEDs (bei voller Ansteuerung, d.h. alle LEDs weiß) bzw. 9 RGB-LEDs (jeweils nur 1 Farbe angesteuert) sein. Wenn mehr LEDs betrieben werden sollen, solltest du in jedem Fall auf eine zusätzliche Stromversorgung zurückgreifen und zwischen 5V und GND einen zusätzlichen Kondesator von 1000 µF zur Glättung von Spannungsspitzen verbauen.
Achtung auch bei Microcontrollern mit 3,3 V-Logik wie dem Raspberry Pi oder ESP32: da die 3,3 V-Versorgungsspannung des Microcontroller nicht ausreicht, um die LEDs zu versorgen, muss man diese extern mit einem DC/DC-Wandler erzeugen, bei dem man die Ausgangsspannung einstellen kann (4,0 V - 4,3 V sind geeignet, sodass der HIGH-Pegel von 3,3 V noch als solcher erkannt wird). 5 V ist dagegen zu hoch, da der HIGH-Pegel größer als 70% der Versorgungsspannung sein muss.
kaskadierte Datenübertragung
Unten siehst du die Funktionsweise der Datenübertragung der adressierbaren LEDs vom Typ WS2812B. Die einzelnen RGB-LEDs sind wie an einer Perlenkette mit einem externen (Micro-) Controller verbunden. Der Controller schickt regelmäßig die gewünschten Farben jeder RGB-LED als Datenpaket an die erste RGB-LED in der Kette (Dabei ist die Reihenfolge der Pakete wenig intuitiv erst Grün, dann Rot und dann Blau. Die erste RGB-LED interpretiert dabei die ersten 3 Bytes (was genau der Datenmenge eines RGB-Wertes entspricht) als "ihre" Farbe und leitet die restlichen Daten nach einer elektrischen Verstärkung an ihren Digitial Out-Pin weiter, wo sie von der nächsten LED in der Kette eingelesen werden können. Bei der darauffolgenden LED wiederholt sich das Spiel: die ersten 3 Bytes werden wieder entnommen und als die gewünschte Farbe der LED interpretiert. Auf diese Weise werden also pro LED immer genau 3 Byte weniger Daten an die jeweils Nächste weitergeleitet. Man nennt die Art der Datenübertragung daher auch kaskadiert.
Da pro Aktualisierungszyklus immer die Farbwerte aller RGB-LEDs vom Controller übertragen werden müssen und die Übertragung jedes Bytes eine gewisse Zeit dauert, werden die Anzahl der RGB-LEDs pro Datenleitung durch die Anzahl der Aktualisierungszyklen pro Sekunde und der Datenrate der Übertragung begrenzt. Bei den adressierbaren LEDs des Typs WS2812B (5 V Versorgungsspannung) können bei einer Datenrate von 800 kBit/s und einem Aktualisierungszyklus von 30mal pro Sekunde etwa 1000 LEDs mit einem Controller angesteuert werden. Allerdings benötigt jede RGB-LED wie oben erwähnt bis zu 60 mA, was bei 1000 RGB-LEDs in einer Reihe einem Spitzenstrom von 60 A entspricht. Ein solcher Strom würde die Leitungen des LED-Streifens schädigen, daher sollten es in der Praxis auch mit externem Netzteil nicht mehr als etwa 250 LEDs sein (15 A).
Um die Funktion der Datenübertragung noch an einem Beispiel zu verdeutlichen, habe ich die Spannung auf der Datenleitung zwischen dem Micrcontroller und der 1. RGB-LED mit einem USB-Oszilloskop aufgezeichnet. Es waren 4 LEDs in der Kette verschaltet. Auf dem Bild lässt sich die oben erklärte Art der Datenübertragung gut veranschaulichen. Nach einer Übertragunsgspause (der sog. Reset Code) startet die Übertragung mit den Daten der 1. RGB-LED (24 Bit pro RGB-LED, 8 bit pro Farbe). Ein Bit besitzt dabei immer einen HIGH und einen LOW-Anteil. Ein längerer HIGH-Anteil (0,8 µs HIGH und 0,45 µs LOW) steht für eine logische 1. Ist die Leitung dagegen für 0,85 µs LOW und nur für 0,4 µs HIGH, steht das für eine logische 0. Im Bild sieht man deutlich, wie nach dem Reset-Code die ersten 24 Bit der 1. RGB-LED übertragen werden. In der Messung wurde der 1. RGB-LED die Farbe RGB = 0, 150, 0 verpasst. Da zuerst der Sollwert für grün übertragen wird, startet das Datenpaket mit dem Binärwert 1001 0110 (was in Dezimalschreibweise exakt 150 entspricht). Danach folgen die Datenpakete für rot und blau (hier beide 0), sowie die Daten der restlichen RGB-LEDs in der Kette. Ein Übertragunszyklus muss dabei immer durch den oben erwähnten Reset-Code von mind. 50 µs vom nächsten Zyklus getrennt werden.