Nr.17 – WS2812 – NeoPixel

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.