Tools für das WS2812B-NeoPixel-Modul (8x8-Matrix)

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 198
Registriert: Do 21. Okt 2010, 18:31

Tools für das WS2812B-NeoPixel-Modul (8x8-Matrix)

Beitrag von Heinrichs » So 3. Aug 2025, 14:00

Mit diesem Beitrag möchte ich eine Reihe von Funktionen zur Verfügung stellen, die bei der Programmierung des NeoPixel-Modul WS2812B helfen können. Dabei greife ich auf das neopixel-Modul zurück, welches bereits in der Firmware des Mikrocontrollers implementiert ist. Diese Firmware bietet eine einfache Möglichkeit dar, die Farbwerte für die einzelnen LEDs an den NeoPixel-Baustein zu übertragen. (Ich verzichte hier darauf, näher auf das Übertragungsprotokoll einzugehen; interessierte Leser finden dazu jedoch eine genauere Erläuterung in meinem Beitrag Neopixel mit dem Nano-Board ansteuern.

Der NeoPixel-Baustein besitzt in der oberen linken Ecke (für den Eingang) nur 3 Anschlüsse: +5V, GND,DIN (Eingangssignal). (Das Board besitzt in der gegenüber liegenden Ecke auch 3 Anschlüsse zur Ansteuerung eines weiteren NeoPixel-Bausteins.) Der Baustein soll auch mit der Spannung 3,3 V zu betreiben sein. Hierbei leuchten einige (wenige) LEDs allerdings bei voller Ansteuerung etwas schwächer als die anderen; deswegen empfehle ich, auf den 5V-Anschluss des TTGO zurückzugreifen.

Letter_F_Modul_Matrix.jpg
Der Buchstabe F (links: NeoPixel-Modul, rechts Darstellung im Programm
Letter_F_Modul_Matrix.jpg (199.84 KiB) 353 mal betrachtet

Mithilfe der Abb. 1 erkennt man sofort, wie ich das Muster kodiert habe: Die 8 LED-Zeilen entsprechen den 8 untereinander stehenden Listen im Programmcode; dabei sind in den Variablen W und S die Farbwerte durch folgende Tupel definiert:

Code: Alles auswählen

S = (0, 0, 0) # Schwarz
W = (50, 50, 50) # Farbe für Buchstaben; hier: mattes Weiß
Die einzelnen Werte (zwischen 0 und 255) in dem Tupel stehen für die Intensität für die Farben Rot, Grün und Blau. Die vom Betrachter wahrgenommene Farbe ergibt sich aus der additiven Farbmischung.

Wie gelangen diese Informationen in das NeoPixel-Modul? Dazu werden die einzelnen Farbwerte zeilenweise mit der folgenden Funktion zum NeoPixel-Modul übertragen:

Code: Alles auswählen

def show(pattern): # Muster auf LED-Panel anzeigen
    for i in range(8):
        row = pattern[i]
        for j in range(8):
            cell = row[j] # Farb-Tupel
            np[i*8+j] = cell # Farbwert in NeoPixel-Instanz speichern 
    np.write() # Farbwerte an Neopixel-Modul übertragen
Das Muster aus Abb. 1 wurde mit dem Programmzeile

Code: Alles auswählen

show(letter_list[70])
Dabei entspricht die Zahl 70 gerade dem ASCII-Code des Buchstabens F. Da auch bei den anderen Buchstaben als Index der entsprechende ASCII-Code benutzt wird, kann man zur Ausgabe des Buchstabens Z genauso gut schreiben:

Code: Alles auswählen

show(letter_list[ord('Z')])

Hier nun eine Liste der Funktionen, welche ich implementiert habe:
  • copy_list(l1): # Liste kopieren (Durch Liste2 = Liste1 werden nur Pointer übertragen; d. h. eine spätere Änderung von Liste1 wirkt sich auch auf Liste2 aus!)
  • change_single_led(x, y, color): # ändert den Farbwert eines NeoPixels / einer LED
  • show(pattern): # Muster auf LED-Panel anzeigen
  • show_letter(letter): # letter ist eine Zeichenkette der Länge 1
  • delete(): # LED-Panel löschen, d. h. den Farbwert auf S = (0, 0, 0) setzen
  • rotate_up(pattern): # Muster durch 1 Aufwärts-Shift rotieren; d. h. die Zeilen wandern um 1 Position nach oben; die oberste Zeile wird dabei zur untersten.
  • rotate_down(pattern): # Muster durch 1 Abwärts-Shift rotieren
  • rotate_left(pattern): # Muster durch 1 Links-Shift rotieren
  • rotate_right(pattern): # Muster durch 1 Links-Shift rotieren
  • shift_up(new_pattern, active_pattern): # Die obere Zeile von new_pattern wird zeilenweise von unten in active_pattern hineingeschoben;
    # insbesondere ist der Rückgabewert new nach 8 Shifts immer gleich black.
  • shift_down(new_pattern, active_pattern): # wie shift_up, aber Verschiebung in umgekehrter Richtung
  • shift_right(new_pattern, active_pattern): # Die rechte Spalte von new_pattern wird von links in active_pattern hineingeschoben;
    # insbesondere ist der Rückgabewert new_pattern nach 8 Shifts immer gleich black.
  • shift_left(new_pattern, active_pattern): # wie shift_right, aber Verschiebung in umgekehrter Richtung

Im Anhang finden Sie ein kurzes Video, einige Quellenangaben sowie ein Programm, in welchem die oben genannten Funktionen nebst einigen Anwendungen zu finden sind.


.
Dateianhänge
NeoPixel_Material.zip
(4.57 KiB) 17-mal heruntergeladen
hallo.wmv
Video mit Laufschrift
(3.09 MiB) 26-mal heruntergeladen

Antworten