Der LED-Ring auf deinem Funduino Cube besteht aus besonderen Leuchtdioden. Diese Pixel werden auch als „WS2812B“, „Pixel“ oder „Neopixel“ bezeichnet. Wir sprechen deshalb von einem WS2812B-Ring. Die Besonderheit der WS2812B Pixel besteht darin, dass sie einzeln angesteuert werden können, obwohl der gesamte Ring mit nur einer Datenleitung vom Mikrocontroller angesteuert wird. WS2812B-Ringe sind dadurch vielseitig Einsetzbar und eignen sich dadurch hervorragend als Stimmungslicht im Raum oder kreative Kunstprojekte.
In dieser Lektion möchten wir unseren WS2812B-Ring in drei Farben leuchten lassen: Rot, Grün und Blau. Die Pixel 0 bis 3 sollen dabei rot, die Pixel 4 bis 7 grün und die Pixel 8 bis 11 blau aufleuchten.
Die WS2812-LEDs faszinieren durch ihre Fähigkeit, individuell steuerbares farbiges Licht zu erzeugen. Doch wie kann man die kleinen Bauteile so präzise ansteuern? Hier kommt zum ersten Mal eine sogenannte „Programmbibliothek“ ins Spiel. Diese werden häufig auch einfach nur „Bibliothek“ oder „Library“ genannt.
Um eines gleich vorwegzusagen: Es ist nicht die Rede von Bibliotheken zum Ausleihen von Büchern.
In der Welt der Elektronik und Programmierung sind Bibliotheken wichtige Werkzeuge, die Entwicklern helfen, komplexe Aufgaben einfacher zu bewältigen.
In einer Bibliothek befindet sich bereits fertiger Code. Auf diesen Code können auch wir dann in unseren Sketch zugreifen, wenn wir eine Bibliothek hinzufügen und danach im Sketch aufrufen.
Der Code der Bibliothek ist also im „Hintergrund“ gespeichert und kann bei Bedarf abgerufen werden.
Zwei Dinge muss man sprachlich unterscheiden, wenn man vom hinzufügen einer Bibliothek spricht, da der Ausdruck zwei Bedeutungen haben kann.
Erstens: Man spricht vom Hinzufügen einer Bibliothek, wenn man diese in die Arduino-Software integriert. Dies erfolgt über den Bibliotheksverwalter in der Arduino-Software. Das Hinzufügen zur Arduino-Software ist notwendig, da immer wieder neue elektronische Komponenten erfunden und verkauft werden. Viele dieser Komponenten werden mit Hilfe von Bibliotheken programmiert. Daher wäre es nicht gut, wenn man keine weiteren Bibliotheken zur Arduino-Software hinzufügen könnte.
Zweitens: Man spricht ebenfalls vom Hinzufügen einer Bibliothek, wenn man diese bei der Programmierung in einem Sketch integriert, obwohl man hier eigentlich sagen müsste, dass die Bibliothek im Sketch aufgerufen wird. Der Aufruf einer Bibliothek erfolgt über den „‚#include„ Befehl. In diesem Beispiel mit dem WS2812B Ring sieht das so aus wie in der Abbildung.
/* Bibliotheken */
#include
Für den WS2812B Ring müssen wir nun eine passende Bibliothek zur Arduino-Software hinzufügen, damit wir diese im weiteren Verlauf verwenden können. Die Bibliothek können wir direkt über unsere Arduino IDE installieren. Erst durch diese Installation können wir die Bibliothek in unseren Programmcode einbinden.
Jetzt können wir unsere Bibliothek in den Programmcode einbinden.
Dafür verwenden wir den „#include“-Befehl. Das englische Wort „include“ bedeutet so etwas wie „einbetten“. Hinter diesen Ausdruck fügen wir jetzt noch in spitze Klammern den Namen der Bibliothek ein. In unserem Beispiel also <Adafruit_NeoPixel.h>.
/* Bibliotheken */
#include
Im nächsten Schritt legen wir fest, an welchem Pin der WS2812B-Ring mit dem Mikrocontroller auf unserem Funduino Cube verbunden ist. Den Pin kannst du direkt auf der Platine ablesen.
Der Pin wird mit dem Ausdruck „#define PIN„ festgelegt.
Anschließend legen wir fest, wie viele einzelne Pixel sich auf unserem WS2812B-Ring befinden. In unserem Fall handelt es sich bei dem Ring auf unserem Funduino Cube um ein Modul mit 12 Pixeln.
Der entsprechende Code zur Festlegung der Anzahl lautet „#define NUMPIXELS 12“.
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
Jetzt wird es etwas komplizierter.
Damit wir den WS2812B-Ring im weiteren Programmverlauf bequem ansteuern können, vergeben wir einen Namen. Das funktioniert grundlegend so, wie du es bereits von den Variablen aus den früheren Lektionen kennst. Wir greifen jetzt allerdings nicht auf einen Datentypen (z.B. Int für Integer) zurück, sondern verwenden den Ausdruck „Adafruit_NeoPixel“ aus der zuvor eingefügten Bibliothek.
Unser WS2812B-Ring trägt den Namen „modul_led_ring“. Diesem Namen weisen wir jetzt Informationen zu. Für die Zuweisung greifen wir ebenfalls auf den Ausdruck „Adafruit_NeoPixel“ zurück. In die Klammer hinter dem Ausdruck legen wir jetzt vier wichtige Informationen fest:
Du fragst dich vielleicht, was das alles für verrückte Angaben sind, und woher man so etwas wissen könnte, wenn es nicht gerade in einer Anleitung wie dieser auftaucht. Aber mach dir keine Sorgen, es handelt sich um technische Angaben über die verwendeten Leuchtdioden. Wenn man diese Module kauft, bekommt man vom Hersteller oder dem Verkäufer die passenden Informationen mitgeliefert.
Die vollständige Programmzeile sieht nun so aus.
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
/* Variablen */
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
In Schritt 6 können wir endlich mit dem Hauptprogramm beginnen.
Wir starten im Setup-Teil unseres Programms mit Initialisierung, also dem Starten des WS2812B-Rings.
Erst durch diese Initialisierung bereiten wir den Mikrocontroller für den Datenaustausch mit dem WS2812B-Ring vor. Dieser Befehl „modul_led_ring.begin();“ ist dabei vergleichbar mit dem „pinMode“-Befehl, den du bereits aus den früheren Lektionen kennst.
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
/* Variablen */
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
/* setup */
void setup()
{ // start setup
modul_led_ring.begin();
} // ende setup
Nachdem wir den Mikrocontroller auf unserem Funduino Cube für den Datenaustausch mit dem WS2812B-Ring vorbereitet haben, können wir jetzt in den Loop-Teil übergehen.
In unserem Loop-Teil möchten wir jetzt die Pixel 0, 1, 2 und 3 in der Farbe Rot aufleuchten lassen.
Hierfür verwenden wir die Programmzeile „modul_led_ring.setPixelColor“. Den ersten Teil dieses Ausdrucks kennen wir bereits aus Schritt 5. Es handelt sich hierbei um den Namen unseres WS2812B-Rings.
Der zweite Teil des Ausdrucks lässt sich zu Deutsch mit „lege Pixelfarbwert fest“ übersetzen.
Dir fällt mit einem Blick in den nachfolgenden Programmcode sicherlich auf, dass hinter diesem Ausdruck in der Klammer noch weitere Informationen folgen.
Die erste Information legt fest, welchen Pixel wir auf unserem WS2812B-Ring ansteuern möchten. Wir tragen hier die jeweilige Nummer ein, die wir neben dem Pixel auf unserem Funduino Cube ablesen können. Da wir zunächst nur die erste LED auf unserem WS2812B-Ring aufleuchten lassen möchten, tragen wir hier den Wert „0„ ein.
Mit der zweiten Information „modul_led_ring.Color()“ legen wir die Leuchtfarbe fest. Die Leuchtfarbe wird dabei als sogenannter RGB Wert angegeben. RGB steht dabei als Abkürzung für die Anfangsbuchstaben der Worte Red, Green und Blue – also Rot, Grün und Blau.
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
/* Variablen */
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
/* setup */
void setup()
{ // start setup
modul_led_ring.begin();
} // ende setup
void loop()
{ // start loop
modul_led_ring.setPixelColor(0, modul_led_ring.Color(255,0,0));
Die Aufgabenstellung dieser Lektion sieht vor, dass die Pixel 0 bis 3 unseres WS2812B-Rings in der Farbe Rot aufleuchten.
Der RGB-Farbwert für die Farbe Rot lautet
Diesen Farbwert tragen wir jetzt in Klammern hinter den Ausdruck „modul_led_ring.Color“ ein. Die vollständige Programmzeile lautet somit „modul_led_ring.setPixelColor(0, modul_led_ring.Color(255,0,0));.
Anschließend müssen wir den Pixel noch einschalten. Dafür verwenden wir die Programmzeile „modul_led_ring.show();“. Dieser Code muss nur dann ausgeführt werden, wenn die vorher programmierten Farbbefehle – es können auch mehrere sein – aktiviert werden sollen.
Lade das gesamte Programm jetzt auf deinen Funduino Cube hoch und beobachte, was passiert!
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
/* Variablen */
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
/* setup */
void setup()
{ // start setup
modul_led_ring.begin();
} // ende setup
void loop()
{ // start loop
modul_led_ring.setPixelColor(0, modul_led_ring.Color(255,0,0));
modul_led_ring.show();
} // ende loop
Toll gemacht! Das wir wirklich nicht einfach!
Wir erinnern und jetzt an unsere Aufgabenstellung zurück. Diese sieht vor, dass die Pixel 0-3 in der Farbe Rot aufleuchten.
Die Pixel 4 bis 7 sollen in der Farbe Grün und die Pixel 8 bis 11 in der Farbe Blau aufleuchten.
Die Farbwerte für die Farben Grün und Blau kannst du der nachfolgenden Übersicht entnehmen. Schaffst du es, das Programm eigenständig zu erweitern?
R | G | B | |
---|---|---|---|
Rot | 255 | 0 | 0 |
Grün | 0 | 255 | 0 |
Blau | 0 | 0 | 255 |
/* Bibliotheken */
#include
#define PIN 4
#define NUMPIXELS 12
/* Variablen */
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
/* setup */
void setup()
{ // start setup
modul_led_ring.begin();
} // ende setup
void loop()
{ // start loop
modul_led_ring.setPixelColor(0, modul_led_ring.Color(255,0,0));
modul_led_ring.show();
} // ende loop
Wenn du alles richtig gemacht hast, dürfte dein Programmcode jetzt so aussehen, wie in der nachfolgenden Abbildung dargestellt.
Versuche doch jetzt einmal, die einzelnen Pixel in unterschiedlichen Farben leuchten zu lassen. Welche Farbe wird zum Beispiel anzeigt, wenn wir die Farbwerte (71, 138, 132) auswählen?
#include // Einbindung der Adafruit_Neopixel.h Bibliothek
#define PIN 4 // An welchem digitalen Pin ist der WS2812B Ring mit dem Mikrocontroller verbunden
#define NUMPIXELS 12 // Über wie viele Pixel verfügt der WS2812B Ring?
Adafruit_NeoPixel modul_led_ring = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); // Konfiguration des Objektes modul_led_ring
void setup()
{
modul_led_ring.begin(); // Initialisierung des WS2812B LED Rings
}
void loop()
{
modul_led_ring.setPixelColor(0, modul_led_ring.Color(255,0,0)); // Pixel 0 leuchtet in der RGB-Farbe Rot
modul_led_ring.setPixelColor(1, modul_led_ring.Color(255,0,0)); // Pixel 1 leuchtet in der RGB-Farbe Rot
modul_led_ring.setPixelColor(2, modul_led_ring.Color(255,0,0)); // Pixel 2 leuchtet in der RGB-Farbe Rot
modul_led_ring.setPixelColor(3, modul_led_ring.Color(255,0,0)); // Pixel 3 leuchtet in der RGB-Farbe Rot
modul_led_ring.setPixelColor(4, modul_led_ring.Color(0,255,0)); // Pixel 4 leuchtet in der RGB-Farbe Grün
modul_led_ring.setPixelColor(5, modul_led_ring.Color(0,255,0)); // Pixel 5 leuchtet in der RGB-Farbe Grün
modul_led_ring.setPixelColor(6, modul_led_ring.Color(0,255,0)); // Pixel 6 leuchtet in der RGB-Farbe Grün
modul_led_ring.setPixelColor(7, modul_led_ring.Color(0,255,0)); // Pixel 7 leuchtet in der RGB-Farbe Grün
modul_led_ring.setPixelColor(8, modul_led_ring.Color(0,0,255)); // Pixel 8 leuchtet in der RGB-Farbe Blau
modul_led_ring.setPixelColor(9, modul_led_ring.Color(0,0,255)); // Pixel 9 leuchtet in der RGB-Farbe Blau
modul_led_ring.setPixelColor(10, modul_led_ring.Color(0,0,255)); // Pixel 10 leuchtet in der RGB-Farbe Blau
modul_led_ring.setPixelColor(11, modul_led_ring.Color(0,0,255)); // Pixel 11 leuchtet in der RGB-Farbe Blau
modul_led_ring.show(); // Anzeigen der Pixelfarben auf dem WS2812B LED Ring
}
Falls du Unterstützung bei der Verwendung deines Funduino Cubes benötigen solltest, steht dir unser kompetentes Support Team jederzeit gerne zur Verfügung!
Du erreichst uns am Besten per Mail unter info@funduino.de oder von Montags bis Freitags, zwischen 09:00 und 17:00 Uhr unter der Rufnummer (+49) 5921 9704030.