Inhaltsverzeichnis
Für dieses Projekt benötigst du
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.
https://www.high-endrolex.com/49
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 bis zu 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.