WS2812 „NeoPixel“

Auf Basis der Controller WS2811 und WS2812 werden eine Vielzahl von Leuchtmodulen angeboten. Es gibt sie als Ringe, Matrixdisplays, Lichterketten und vieles mehr. Mit diesen Komponenten lassen sich schnell eindrucksvolle Projekte realisieren und sind somit ideal für den Einstieg in die Microcontroller Welt.

Matrix Display
NeoPixel Lichtschlange

Funktion

Jedes Neopixel-Element besteht aus 3 LEDs, ggf. einigen Widerständen, einem Kondensator und dem Controller WS2811 oder einem neueren Modell. Die Funktionsweise des Controllers ist sehr schön im Datenblatt beschrieben:

https://cdn-shop.adafruit.com/datasheets/WS2811.pdf

Im wesentlichen nimmt der Controller an Din ein Datenpaket entgegen. Der erste Teil des Paketes ist für diesen Controller bestimmt. Darin enthalten: drei Werte für die 3 LED Steuerausgänge zwischen 0 und 255. Auf dieser Basis erzeugt der Controller drei PWM Signale, deren Duty-Cycle der gewünschten Helligkeit entspricht. Somit lassen sich drei LEDs mit einem GPIO Port steuern. Die Module enthalten LEDS in den Farben rot, grün, blau. Durch additive Farbmischung lassen sich damit viele Farben erzeugen.

http://www.spectrumcolors.de/cor_rgb_demo.php

Jetzt kommt aber der Clou: Der Controller entfernt den für ihn bestimmte Teil aus dem Datenpaket und sendet über Do das Paket weiter. Es wird dabei komplett neu erzeugt, das bedeutet, dass wir es nicht mit einer langen, störungsanfälligen Busleitung zu tun haben, sondern die Übertragung auch über lange Strecken stabil bleibt. Der nächste Controller nimmt nun das Datenpaket entgegen, nimmt sich den vorderen Teil und sendet weiter…

Extrem pfiffig, das Konzept. Mit einem GPIO-Port lassen sich nun hunderte von LEDs ansteuern. Bei diesem Verfahren ist das exakte Timing der Datenübertragung extrem wichtig. Es kommt bei einigen der verfügbaren Libraries zu Problemen mit einigen Controllern. Hier hilft nur „Ausprobieren“.

Verdrahtung

Grundsätzlich wird empfohlen, einen Widerstand (z.B. R=150 Ohm) in Reihe zum Eingang der Datenleitung zu schalten. Bei langen LED-Ketten sollte eine Spannungseinspeisung auch in der Mitte und vom Ende erfolgen, um gleichmäßige Helligkeit zu gewährleisten. Um Spannungsabfälle zu vermeiden, empfehle ich, einen relativ große Elko (z.B. 1000µF) parallel zum Modul zu schalten. Die Datenleitung nimmt 3,3V oder 5V.

Jede Pixel braucht bis zu 60 mA (bei maximaler Ansteuerung). Das klingt nicht viel, rechnet aber mal nach, wieviele Pixel ihr betreiben wollt. Das läppert sich… Die LEDs sollten daher bei größeren Modulen immer extern versorgt werden und nicht über den USB eines Rechners. Klar, dass die Massen trotzdem verbunden werden müssen

Programmierung

Idealer Einstieg sind die NeoPixel Bibliotheken von Adafruit. Einfach über die Bibliothekenverwaltung in der Arduino IDE installieren und die gute kommentierten Beispiele ansehen.

Libraries von Adafruit

Die Adafruit Bibliotheken machen mit manchen ESP32 Probleme, einige Pixel reagieren nicht so, wie erwartet. Ich verwende daher die Bibliotheken „FastLED“, wenn ich ESP32 einsetze:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <FastLED.h>
#include <FastLED_NeoMatrix.h>

#ifndef ESP32
#define delay FastLED.delay
#endif

#define PIN 12 
#define BM32
#define BRIGHTNESS 10
#define mw 32
#define mh 8
#define NUMMATRIX (mw*mh)
CRGB leds[NUMMATRIX];
FastLED_NeoMatrix *matrix = new FastLED_NeoMatrix(leds, 8, 8, 4, 1, 
NEO_MATRIX_BOTTOM     + NEO_MATRIX_RIGHT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG + 
NEO_TILE_TOP + NEO_TILE_RIGHT +  NEO_TILE_PROGRESSIVE);

void displayText(char text[6], int r, int g, int b) {
  matrix->setTextSize(1);
  matrix->clear();
  matrix->setCursor(0, 0);
  matrix->setTextColor(matrix->Color(r,g,b));
  matrix->print(text);
  matrix->show();
}

void displayFloat(float Zahl,int nachkomma, int r, int g, int b) {
  char str[5];
  dtostrf(Zahl, 5, nachkomma, str);
  matrix->setTextSize(1);
  matrix->clear();
  matrix->setCursor(0, 0);
  matrix->setTextColor(matrix->Color(r,g,b));
  matrix->print(str);
  matrix->show();

}
void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("Los gehts mit LED");

  FastLED.addLeds<NEOPIXEL,PIN>(  leds, NUMMATRIX  ).setCorrection(TypicalLEDStrip);
  matrix->begin();
  matrix->setTextWrap(false);
  matrix->setBrightness(BRIGHTNESS);
}

void loop() {

//Temperatur und Druck BMP180
  displayText("Temp.",255,0,0);
  delay(pause);  
  displayFloat(bmp.readTemperature(),1,255,0,0);
  delay(pause);  
}

Das Beispiel zeigt auch gleich, wie sich Texte und Sensordaten auf einem NeoPixel-Matrixdisplay anzeigen lassen.

Quellen und hilfreiche Links

QuelleThema
HeiseEinführung Technik NeoPixel
https://github.com/FastLED/FastLEDFastLED Library
Quellen und hilfreiche Links

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.