WS2812B LED-Streifen mit einem Raspberry Pi steuern

WS2812B LED-Streifen mit einem Raspberry Pi steuern

Farbwechsel Led-Streifen sind cool, aber das was es so im Laden zu kaufen gibt ist euch zu schnöde? Farbwechsel hin oder her, aber es sollte nach Möglichkeit schon etwas sein, was nicht einfarbig leuchtet oder ihr habt euer ganz eigenes Projekt im Kopf? – Dann ist dieser Artikel genau das richtige für euch!

Wir wollen uns nun einmal damit beschäftigen einen WS2812B LED-Streifen an unserem Raspberry Pi zum Laufen zu bekommen. Das Besondere an diesen LEDs ist, dass jede LED auf dem Streifen, Ring oder auch einer Matrix separat steuerbar ist. Das heißt, dass wir jeder der LEDs eine eigene Farbe und Helligkeit zuordnen können, ohne dabei andere LEDs zu beeinflussen.

Funktionsweise

Die Funktionsweise ist eigentlich denkbar einfach. Jede LED hat einen eigenen Controller eingebaut. Einen WS2812B Controller. Dieser bekommt über die Datenleitung (grün) Informationen über die zu setzende Farbe und Helligkeit. Zwischen den einzelnen LEDs wird über einen im Raspberry Pi eingestellten und mit den Controllern übereinstimmenden Takt gewechselt. Der Controller hält die Farbe und Helligkeit, bis eine neue Information über die Datenleistung gesendet wird.

Einkaufsliste

Verwenden werden wir der Einfachheit halber einen 5V LED-Streifen. Einen 12V Derivat könnten wir ebenfalls nutzen, dann aber nur mit externer Stromversorgung.

Raspberry Pi

Hardware

Folgende Verkabelung muss vorgenommen werden.

Software

Für die Einrichtung der Software gebt bitte folgende Befehle der Reihe nach ein:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git scons swig gcc make build-essential python-dev

Nun erstellt ihr bitte eine Datei mittels dieses Befehls und tragt dort den nachfolgenden Inhalt ein:

sudo nano /etc/modprobe.d/snd-blacklist.conf
blacklist snd_bcm2835

Für einige Geräte scheint es auch noch nötig zu sein folgende Einträge in der Datei “/boot/config.txt” zu ändern, zu erstellen:

hdmi_force_hotplug=1
hdmi_force_edid_audio=1

Die Vorbereitungen sind getroffen. Nun benötigen wir das Programm zum Schalten der LEDs. Führt folgende Befehle aus und es sollte sich nach einigen Sekunden der LED Streifen mit lauter Farben melden:

git clone https://github.com/jgarff/rpi_ws281x
cd rpi_ws281x/
sudo scons
sudo ./test

Unsere eigene Melodie

Ich hoffe sehr, dass der LED-Streifen bei euch auch angefangen hat zu leuchten. Wenn nicht, dann schreibt es in die Kommentare und ich werde versuchen euch zu helfen. Wenn aber doch, dann wird es jetzt Zeit unsere eigene Melodie zu komponieren.

Mehr dazu auf Seite 2…

WS2812B selber programmieren

Maestro, fangen sie mit ihrem eigenen Lied an!
Kleiner Hinweis: Der Maestro sind wir -hust-

Also dann. Der Test hat schon einmal geklappt. Nun wollen wir natürlich unsere eigenen Muster und Abläufe auf den LED-Streifen bringen. Dazu müssen wir aus dem eben auf Seite 1 installierten Programm noch ein Unterprogramm installieren und dieses dann als Vorlage benutzen.

Gebt bitte innerhalb des Ordners “rpi_ws281x” ein:

cd python
sudo python setup.py build
sudo python setup.py install
cd examples

Nun haben wir alles vorbereitet, um unsere eigene kleine Sympthonie zu programmieren. Als kleines Beispiel werden wir die ersten paar LEDs des Streifens in unterschiedlichen Farben aufleuchten lassen. Anschließend obliegt es eurer Fantasie eigene Python Programme zu schreiben. Der Ordner “examples” ist voll mit Inspirationen.

Wir erstellen also erst einmal ein neues Skript mit dem Befehl:

sudo nano melodie.py

Dort tragen wir ein:

#!/usr/bin/env python3
# NeoPixel library strandtest example
# Author: Tony DiCola (tony@tonydicola.com)
#
# Direct port of the Arduino NeoPixel library strandtest example. Showcases
# various animations on a strip of NeoPixels.
 
import time
from neopixel import *
import argparse
 
# LED strip configuration:
LED_COUNT = 16 # Number of LED pixels.
LED_PIN = 18 # GPIO pin connected to the pixels (18 uses PWM!).
#LED_PIN = 10 # GPIO pin connected to the pixels (10 uses SPI /dev/spidev0.0).
LED_FREQ_HZ = 800000 # LED signal frequency in hertz (usually 800khz)
LED_DMA = 10 # DMA channel to use for generating signal (try 10)
LED_BRIGHTNESS = 255 # Set to 0 for darkest and 255 for brightest
LED_INVERT = False # True to invert the signal (when using NPN transistor level shift)
LED_CHANNEL = 0 # set to '1' for GPIOs 13, 19, 41, 45 or 53
 
# Main program logic follows:
if __name__ == '__main__':
 # Process arguments
 parser = argparse.ArgumentParser()
 parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
 args = parser.parse_args()
 
 strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
 strip.begin()
 
 print ('Press Ctrl-C to quit.')
 if not args.clear:
 print('Use "-c" argument to clear LEDs on exit')
 
 try:
 
 while True:
 strip.setPixelColor(0, Color(255, 255, 255))
 strip.setPixelColor(1, Color(255, 0, 0))
 strip.setPixelColor(2, Color(255,255, 0))
 strip.setPixelColor(3, Color(255, 0, 255))
 strip.show()
 
 except KeyboardInterrupt:
 strip.setPixelColor(0, Color(0, 0, 0))
 strip.setPixelColor(1, Color(0, 0, 0))
 strip.setPixelColor(2, Color(0, 0, 0))
 strip.setPixelColor(3, Color(0, 0, 0))
 strip.show()

Nachwort

Ich möchte euch noch um etwas bitten. Ein 1m langer LED-Streifen mit 60 LEDs mag noch in Ordnung für den Pi sein, sofern nicht alle LEDs in voller Helligkeit weiß leuchten, aber bei mehr wird es kritisch.

Deshalb: Bitte schließt keine zu langen Streifen direkt an den Pi an und auch nicht zu viele in Reihe an eine externe Stromversorgung, das könnte die LEDs beschädigen. Liegen zu viele LEDs in einer Reihe, dann bekommen die ersten LEDs -salopp gesagt- zu viel Saft und gehen kaputt.

Ideal wäre es jeweils maximal 60 oder weniger LEDs direkt an den Pi zu schließen. Sollten es mehr als 60 LEDs werden, so ist es ratsam eine externe Stromversorgung zu verwenden und ab dem 2. Streifen eine Parallelschaltung für das Massekabel (rot) zu verwenden. Dabei wird das rote Kabel nicht an den Pi angeschlossen und jeder Streifen wird direkt an die Stromversorgung angeschlossen und nicht an das rote Kabel des vorigen Streifens. Die Anschlüssen von GND (weiß) und der Datenleitung (grün) bleiben gleich. Hier noch ein Beispiel dazu:

Marvin

Ich bin ein Mensch, der sich neben der Programmierung noch für tausend andere Dinge interessiert, die mal mehr und mal weniger verrückt sind. Vor allem aber bin ich Feuer und Flamme mit der Programmierung von eigenen kleinen Apps und Programmen, die mein Leben bereichern.

Kommentar hinzufügen

*Pflichtfeld