Nr.17 – WS2812 – SK6812 – RGB – RGBW – NeoPixel mit Arduino ansteuern

Inhaltsverzeichnis

WS2812 bzw. „NeoPixel“ mit Arduino Mikrocontrollern ansteuern

WS2812 und SK6812 LEDs, oder auch NeoPixel genannt, werden vor allem in LED-Streifen und großen Displays verwendet. Das Besondere daran ist, dass die einzelnen LEDs miteinander 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 und SK6812 LEDs gibt es von Adafruit. Dort werden die LEDs als „NeoPixel“ bezeichnet. Die Library kann alle Versionen der genannten LEDs ansteuern, wie zum Beispiel die LEDs die lediglich die drei Farben Rot, Grün, Blau (RGB) beinhalten, als auch die Versionen mit integrierter weißer LED (RGBW).

Außerdem bietet Adafruit auch eine sehr umfangreiche Informationsseite und einige Sketche rund um das Thema Neopixel an. 

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 Sketchen 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 schwächer leuchtet die entsprechende Farbe. Bei dem Wert 0 bleibt die LED 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.

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ß

Bei dem letzten Befehl handelt es sich um die gleichzeitige Ansteuerung der drei farbigen LEDs, die das Licht weiß erscheinen lassen.

„RGB LEDs“ oder „RGBW – LEDs“

Für den Fall, dass man eine andere Version der LED verwendet, die auch eine separate weiße LED beinhaltet, muss anders als in dieser Anleitung eine leichte Änderung vorgenommen werden.

Im Setup wir der Befehl „NEO_GRB“ gegen „NEO_GRBW“ ausgetauscht.

// Verwendung von RGB-LEDs:
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); 

//Verwendung von RGBW-LEDs:
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRBW + NEO_KHZ800); 

Damit können im darauffolgenden Befehl alle vier LEDs angesteuert werden. In dem Befehl wird eine vierte Zahlenposition ergänzt.

pixels.setPixelColor(x,pixels.Color(255,0,0,0)) // =Rot

pixels.setPixelColor(x,pixels.Color(0,255,0,0)) // =Grün

pixels.setPixelColor(x,pixels.Color(0,0,255,0)) // =Blau

pixels.setPixelColor(x,pixels.Color(255,255,0,0)) // =Gelb

pixels.setPixelColor(x,pixels.Color(0,255,255,0)) // =Türkis

pixels.setPixelColor(x,pixels.Color(255,255,255,0)) // =Weiß durch Farbmischung der drei farbigen LEDs

pixels.setPixelColor(x,pixels.Color(0,0,0,255)) // = Weiß durch separate Ansteuerung der weißen LED

Der Schaltplan

Pin DI (Digital Input) am Ring / an der Matrix → Pin D9 am Arduino UNO

Pin GND am Ring / an der Matrix → GND am Arduino UNO

Pin VCC am Ring / an der Matrix → VCC am Arduino UNO

Der Programmcode

Das Ergebnis sollte wie rechts abgebildet aussehen.

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.

Der Programmcode

#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.
}
#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(0, 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(1, 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(2, 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(3, 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(4, 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(0, pixels.Color(0,0,0)); 
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.show(); // Durchführen der Pixel-Ansteuerung
delay (pause); // Pause, die LEDs bleiben in dieser Zeit aus

}

Die WS2812 LED (bedrahtet)

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

Der Programmcode

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.

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE