WS2812-Neopixel-Ring mit 24 LEDs ansteuern
Die in den letzten Jahren in Mode gekommenen LED-Streifen, die man an bestimmten Stellen kürzen kann und bei denen alle LEDs parallel geschaltet sind, kennt bestimmt jeder. Diese gibt es nicht nur als warmweiße oder kaltweiße Variante, sondern sogar auch mit RGB-LEDs und Fernbedienung, um alle mögliche Farben zu schalten.Diesen LED-Streifen ist allerdings gemeinsam, dass alle LEDs in der gleichen (ggf. einstellbaren) Farbe und in der gleichen Intensität leuchten.
Ein anderes Konzept benutzen die LED-Streifen (oder Ringe) mit hintereinander geschalteten 5050-LEDs, von denen jede nicht nur eine Sub-LED in der Farben Rot, Grün und Blau enthält, sondern auch noch einen winzigen WS2812 Chip, der es möglich macht, jeder einzelnen LED ihre eigenen Farbwerte (und Leuchtintensität) zuzuweisen.
Hierbei kann man beliebig viele RGB-LEDs hintereinander schalten, wobei jede LED Informationen an die nächste weitergeben kann.
In der ersten Phase werden den LEDs jeweils ein Farbwert zugewiesen. Dazu werden 24-bit breite Datensätze gesendet: je ein Byte für die Farbinformation von rot, grün, und blau. Kommt so ein Datenpaket bei einer LED an, so speichert sie diesen Wert. Erhält eine LED ein neues Paket, so gibt es das alte an die nächste LED weiter und nimmt das neue auf. Hat man also z. B. 10 LEDs, so schickt man 10 mal 3 Bytes in die Neopixel, wie diese LEDs auch genannt werden, hinein - für jede LED seine eigenen Farbe.
In Phase 2 wird dem Neopixel-Streifen dann mitgeteilt, dass er nun leuchten soll und jede LED erstrahlt mit den zuletzt erhaltenen Werten - oder auch nicht, falls sie 3 mal die 0 (was aus bedeutet) erhalten hatte. Es gilt die additive Farbmischung, alle drei Farbteile von RGB auf 255 ergeben ein weiß; rot 255, grün und blau 0 ein rot; rot 50, grün 50 und blau 50 ein nicht so helles weiß.
Hardware Neopixel-Ring mit 24 LEDs CJMCV-2812-24
Neopixel gibt es als Streifen, z. B. mit 60 LEDs am Stück oder als Neopixel-Ring, z. B. mit 24 LEDs. Es gibt auch Segmente, etwa mit 8 Elementen in Reihe, oder als Viertelring mit 15 LEDs, mit denen eine Matrix oder einen größeren Ring zusammenfügen kann, denn man kann an das Ende eines Neopixel-Elementes den Anfang des nächsten anlöten und so fast beliebig lange Neopixel-Elementen in allen vorstellbaren Formen zusammenbauen.Allerdings sind die Neopixel nicht immer ganz günstig. Wem warten nichts ausmacht, der kann diese auch günstig über einen Fernost-Versender, etwa über eBay bestellen. Ich habe mir einen 24er Ring gekauft, weil dieser bezahlbar ist.
Hier sind nur 3 Leitungen anzulöten:
- GND --> GND
- VCC --> +5V
- IN (Data in) --> D6
Die wie beschrieben an einen Arduino angeschlossen werden. Es kann auch ein anderer Port als 6 benutzt werden. Diese müssen dann nur im Source-Code entsprechend eingetragen werden.
Als Plattform benutze ich aber das hier beschriebene Prototype Shield mit Mini-Breadboard, auf dem D8 bis D13 schon mit LEDs und Schaltern bestückt sind, die uns für die Schaltung noch nützlich werden dürften.
Der WS2812 Chip
Der WS2812 Chip von Wordsemi ist der winzig kleine Chip in der Mitte der 5050-RGB-LEDs, den man mit dem bloßen Auge kaum erkennen kann. Siehe dazu die Makro-Aufnahme eine Neopixel-LED und die eines WS2812 Chip in der LED.
Trotzdem enthält jede 5050-LED außen den 3 Sub-LEDs für rot, grün und blau noch diesen Chip mit den folgenden Features:
- Signal Verstärkung und Formkorrektur, so dass das nächste Neopixel korrekte Daten erhält, auch über viele Stationen hinweg
- 3 Farben mit 256 Abstufungen für 16.7 Mio. Farben
- Scan-Frequenz von min. 400 Hz
- Schnelligkeit: 512 bis 1024 LEDs in Reihe möglich bei 30 fps; Datengeschwindigkeit 800 Kbps
Jede 5050-LED verfügt über 6 Anschlüsse:
- 1 DO = Data out -> Weitersendung an nächste LED
- 2 DI = Data in -> Datenempfang von vorheriger LED
- 3 VCC = Versorgungsspannung Steuerung
- 4 - = nicht belegt
- 5 VDD = Versorgungsspannung Sub-LEDs
- 6 VSS = GND
Bibliothek Neopixel von Adafruit
Denn die Mühe, das Protokoll selbst zu implementieren, können wir uns sparen, denn diese Arbeit hat adafruit schon für und erledigt. Über die Bibliotheksverwaltung in der Arduino-IDE lässt sich die Library Adafruit NeoPixel schnell installieren.
Dies installiert wie gewohnt auch gleich Beispiele mit und in diesem Falle auch reichlich Eye Candy, also was fürs Auge:
Gebrauch der Library
Die Library wird über#include <Adafruit_NeoPixel.h>
eingebunden und dann kann mit
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
pixels.begin();
ein Objekt pixels instanziiert und intitalisiert werden, mit denen wir dann im weiteren Programm die Pixel ändern können. Bei NUMPIXELS ist die Anzahl der hintereinander geschalteten Pixel anzugeben (in meinem Fall also 24) und unter PIN den GPIO-Pin, an dem Data angeschlossen ist, also 6.Mit
pixels.setPixelColor(i, pixels.Color(R, G, B));
wird nun das i-te Pixel-Element auf die Farbe, die sich aus RGB ergibt, gesetzt. Das Senden der 24 einzelnen Farbwerte in die Pixel-Reihe übernimmt die Library für uns. Wer auf Geschwindigkeit und selbst die Neopixel ansprechen will, bitte dran denken: hier behält jedes Pixel seinen zuletzt erhaltenen Wert. Es ist ein anderes Prinzip als bei 74HC595 oder MAX7219, bei dem die Werte "durchgeschoben" werden (und der hinterste Baustein den 1. Wert enthält). Hier bekommt der 1. Baustein den 1. Wert und der letzte Baustein den letzten Wert.Mit
pixels.show();
werden dann alle Pixel auf einmal angezeigt. Bis dies nicht geschehen ist, leuchten alle LEDs noch mit dem alten Wert.Man muss nicht jedesmal alle 24 LEDs versorgen, man kann auch nur einen neuen Wert setzen. So kann man auf sehr einfache Weise Lauflichter programmieren, zum Beispiel mit
for(int i=0;i<NUMPIXELS;i++){
// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(0,50,0)); // Moderately bright green color.
pixels.show(); // This sends the updated pixel color to the hardware.
delay(50); // Delay for a period of time (in milliseconds).
}
Viel Spaß beim Nachbauen und Rumspielen. Ich habe als nützliche Anwendung eine 24-Stunden-Uhr im Sinn, mit 24 statt wie üblich 12 Stundenpositionen - schließlich hat der Tag ja auch 24 Stunden nund nicht bloß 12. Das war auch mit ein Grund die 24-LED-Version zu kaufen. Dies wird eines meiner allernächsten Projekte werden.