WS2812 bzw. „NeoPixel“ mit Arduino Mikrocontrollern ansteuern
Materialbeschaffung: www.funduinoshop.com
WS2812 LEDs, oder auch NeoPixel genannt, werden vorallem in LED-Streifen und großen Displays verwendet. Das besondere daran ist, dass die einzelnen LEDs miteinender vernetzt sind. Jede LED kann einzeln angesteuert werden, obwohl nur drei Kabel benötigt werden. Das ist die Spannungsversorgung mit + und -, und als dritte Leitung ist eine Datenleitung vorhanden. Mit einem Mikrocontroller, in diesem Falle natürlich aus der Arduino-Reihe, können über diese Datenleitung alle LEDs angesteuert werden.
Eine gute Library zu den WS2812 LEDs gibt es von Adafruit. Dort werden die LEDS als „NeoPixel“ bezeichnet. Außerdem bietet Adafruit auch eine sehr umfangreiche Informationsseite und einige Sketches rund um das Thema Neopixel an. Damit die Sketche in dieser Anleitung funktionieren, muss vorab in der Arduino-Software die Library „Adafruit NeoPixel“ installiert werden. Diese kann man mit der „Bibliothek einbinden“ Funktion in der Arduino Software finden. Genauere Erläuterung zu Bibliotheken: http://funduino.de/hardware-software#222_Bibliotheken_zur_Arduino_Softwarehinzufuegen
In unseren Anleitungen zu diesem Thema starten wir nicht sofort mit tollen Regenbogeneffekten, sondern starten mit der Ansteuerung von einzelnen Pixeln in unterschiedlichen Helligkeitsstufen. Vielfarbige Regenbogeneffekte werden mit sogenannten Schleifen erzeugt, die wiederum auf andere Schleifen für die Farbänderung zurückgreifen. Um diese verschiedenen Inhalte zu entzerren, beginnen wir möglichst unkompliziert.
In unserem Beispiel verwenden wir einen Ring mit 40 WS2812 LEDs. Diese Anleitung lässt sich jedoch auch mit jeglichen anderen WS2812 bzw. NeoPixel Modulen durchführen. Wichtig ist dabei nur, dass im jeweiligen Sketch die Gesamtanzahl der LEDs des Moduls angegeben wird (Zeile: „#define NUMPIXELS 40 „). Die Zahl (hier 40) steht für die Anzahl der vorhandenen LEDs.
Der wichtigste Befehl in den folgenden Skteches lautet „pixels.setPixelColor( x , pixels.Color(0,255,0));“ . Der Befehl beinhaltet in der Klammer zwei Informationen. Das erste ist eine Zahl (hier als „x“ bezeichnet und gibt die Nummer der LED an, die leuchten soll. Die zweite Information „pixels.Color(0,255,0)“ beinhaltet gleichzeitig die Farbe und Helligkeit, in der die LED leuchten soll. Dazu gibt es in der Klammer drei Zahlen, jeweils durch ein Komma getrennt. Die erste Zahl steht für die Farbe „Rot“, die Zweite für die Farbe „Grün“ und die Dritte für die Farbe „Blau“. Für die Zahlen können Werte zwischen 0 und 255 gewählt werden. Je kleiner die Zahl ist, desto dunkler leuchtet die entsprechende Farbe. Bei dem Wert 0 bleibt die Farbe komplett dunkel, der Wert 255 lässt die LED in maximaler Stärke leuchten. Wenn zwei oder drei Farben gleichzeitig aktiviert werden, ergibt sich eine Farbmischung.
Beispiele für Farben:
pixels.setPixelColor(x,pixels.Color(255,0,0))=Rot
pixels.setPixelColor(x,pixels.Color(0,255,0))=Grün
pixels.setPixelColor(x,pixels.Color(0,0,255))=Blau
pixels.setPixelColor(x,pixels.Color(255,255,0))=Gelb
pixels.setPixelColor(x,pixels.Color(0,255,255))=Türkis
pixels.setPixelColor(x,pixels.Color(255,255,255))=Weiß
Skizze vom Aufbau
Sketch Nr.1 – Einzelne LEDs ansteuern
Das Ergebnis des Sketch Nr.1 sollte so aussehen:
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #define PIN 9 // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind #define NUMPIXELS 40 // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int pause=100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED. void setup() { pixels.begin(); // Initialisierung der NeoPixel } void loop() { pixels.setPixelColor(1, pixels.Color(0,255,0)); // Pixel1 leuchtet in der Farbe Grün pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, in dieser Zeit wird nichts verändert. pixels.setPixelColor(2, pixels.Color(0,150,0)); // Pixel2 leuchtet in der Farbe Grün pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, in dieser Zeit wird nichts verändert. pixels.setPixelColor(3, pixels.Color(0,50,0)); // Pixel3 leuchtet in der Farbe Grün pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, in dieser Zeit wird nichts verändert. pixels.setPixelColor(4, pixels.Color(0,10,0)); // Pixel4 leuchtet in der Farbe Grün pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, in dieser Zeit wird nichts verändert. pixels.setPixelColor(5, pixels.Color(0,1,0)); // Pixel5 leuchtet in der Farbe Grün pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, in dieser Zeit wird nichts verändert. // Zurücksetzen aller Pixelfarben auf Stufe "0" (aus) pixels.setPixelColor(1, pixels.Color(0,0,0)); pixels.setPixelColor(2, pixels.Color(0,0,0)); pixels.setPixelColor(3, pixels.Color(0,0,0)); pixels.setPixelColor(4, pixels.Color(0,0,0)); pixels.setPixelColor(5, pixels.Color(0,0,0)); pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); // Pause, die LEDs bleiben in dieser Zeit aus }
Sketch Nr.2 – Viele LEDs nacheinander ansteuern
Für diesen Sketch verwenden wir erneut einen LED-Ring mit 40 WS2812 LEDs. In diesem Fall soll eine LED im Kreis wandern. Das bedeutet die LEDs werden der Reihe nach aktiviert, während die jeweils vorherige LED abgeschaltet wird.
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif int i=0; #define PIN 9 // Hier wird angegeben, an welchem digitalen Pin die WS2812 LEDs bzw. NeoPixel angeschlossen sind #define NUMPIXELS 40 // Hier wird die Anzahl der angeschlossenen WS2812 LEDs bzw. NeoPixel angegeben Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int pause=100; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED. void setup() { pixels.begin(); // Initialisierung der NeoPixel } void loop() { pixels.setPixelColor(i, pixels.Color(0,150,0)); // Pixel leuchtet in der Farbe Grün pixels.setPixelColor(i-1, pixels.Color(0,0,0)); // Der vorherige Pixel wird abgeschaltet pixels.show(); // Durchführen der Pixel-Ansteuerung if (i==0) pixels.setPixelColor(39, pixels.Color(0,0,0)); // Im Fall von Pixel "0" muss die vorherige (39) ausgeschaltet werden. pixels.show(); // Durchführen der Pixel-Ansteuerung delay (pause); i=i+1; // Die Variable "i" wird um eine Zahl vergrößert. Die neue Zahl "i" ist dann die nächste LED im Led-Ring if (i==40) i=0; // Wenn die Variable den Wert 40 erreicht hat, wird die Variable auf den Wert "0" zurück gesetzt, da die Nummerierung der LEDs nur von 0 bis 39 geht. }
Es gibt die WS2812 LEDs auch in bedrahteter Form. Die Programmierung dieser LEDs erfolgt genau wie bei den LEDs in der flachen Bauform. Schwieriger ist in dieser Variante nur die Verkabelung, da dann jede LED mit der SPannungsversorgung, sowie mit dem Dateneingang und Datenausgang verbunden werden muss. Hilfreich ist dabei eine Skizze mit der Beschriftung der Anschlüsse solcher LEDs.
Im folgenden Aufbau haben wir drei bedrahtete WS2812 LEDs in einem Breadboard befestigt. Jede LED wird separat mit GND und 5V+ versorgt. Die erste LED wird über den Pin6 am Arduino UNO Board mit dem Dateneingang der ersten LED verbunden. Der Datenausgang der ersten LED wird mit dem Dateneingang der zweiten LED verbunden und der Datenausgang der zweiten LED wird mit dem Dateneingang der dritten LED verbunden. Der Datenausgangspin der dritten LED wird nicht verkabelt
Mit dem folgenden Sketch leuchten die drei LEDs nacheinander in unterschiedlichen Farben auf.
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> // Required for 16 MHz Adafruit Trinket #endif #define PIN 6 // Pin für die Datenleitung #define NUMPIXELS 3 // Anzahl der WS2812 LEDs oder der NEOPIXEL Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); // Initialisierung der LEDs } void loop() { pixels.setPixelColor(0, pixels.Color(0, 150, 0)); pixels.show(); // Senden der aktualisierten Daten an die WS2812 LEDs delay(500); pixels.clear(); // Deaktivieren aller LEDs pixels.setPixelColor(1, pixels.Color(150, 0, 0)); pixels.show(); // Senden der aktualisierten Daten an die WS2812 LEDs delay(500); pixels.clear(); // Deaktivieren aller LEDs pixels.setPixelColor(2, pixels.Color(0, 0, 150)); pixels.show(); // Senden der aktualisierten Daten an die WS2812 LEDs delay(500); pixels.clear(); // Deaktivieren aller LEDs }
Weitere Beispiele für farbenfrohe Lichteffekte befinden sich in den Beispielen, die zusammen mit der NeoPixel Library heruntergeladen wurden.