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.
}

Weitere Beispiele für farbenfrohe Lichteffekte befinden sich in den Beispielen, die zusammen mit der NeoPixel Library heruntergeladen wurden.