LED-Streifen mit dem Raspberry Pi steuern

Ein Artikel von Ramón Lang, veröffentlicht am 7. März 2023.
Die Lesedauer beträgt ungefähr 15 Minuten.

Für ein Projekt, das ich in einem anderen Artikel beschreibe, muss ich einen LED-Streifen digital steuern können. Wie man einen ganzen LED-Streifen ein- oder ausschaltet weiß ich schon. Zum Beispiel für die Beleuchtung zuhause. Jetzt muss ich aber jede einzelne Diode ansteuern können. Das ist technisch weit komplizierter und erfordert (wenig) Programmierkenntnisse. Das ist für mich Neuland und eine große Herausforderung.

Regel #1: LED-Streifen noch nirgendwo anschließen!

Programmieren kann ich ja bekanntlich schon, aber es handelt sich um eine neue Programmiersprache. Von Python haben sicherlich alle schon gehört, die sich mit dem Mini-PC „Raspberry Pi“ auseinandergesetzt haben. Viel Code ist nicht notwendig und die Programmiersprache Python wird oft als einfach und einsteigerfreundlich beschrieben. Daher wird das sicherlich ein machbares Projekt. Mit Python habe ich mich früher schonmal ein wenig auseinandergesetzt und es bald wieder aufgegeben. Die Syntax ist unterscheidet sich doch in vielen Punkten gegenüber PHP oder JavaScript und wenn man kein konkretes Ziel vor Augen hat ist Neues lernen dann eben schwierig. Zum Glück habe ich jetzt ein Ziel und auch ein Ziel-Datum: Der erste Advent 2023.

Aber auch dieses Projekt hatte ich mal angefangen und wieder aufgehört, da ich mit der ganzen Vorbereitung und Python überfordert war. Siehe Abschnitt „Asoziale Foren“. Inzwischen ist aber ChatGPT populär geworden. Also habe ich die künstliche Intelligenz nach Hilfe gefragt. Die Antworten waren nicht perfekt, aber immerhin: Ich habe es geschafft.

Raspberry Pi vorbereiten

Zuerst muss natürlich das Raspberry Pi OS installiert werden. Für Anfänger ist die Version mit grafischer Oberfläche immer am besten. Du lernst hier auch noch gleich den Umgang mit SSH – also sozusagen die Fernsteuerung.

  1. Stelle nach der Installation sicher, dass du dich mit einem Netzwerk über WLAN verbunden hast oder dass du den Raspberry Pi per LAN an den Router anschließen kannst. Die grafische Oberfläche brauchen wir bald nicht mehr.
  2. Gehe zu den Raspberry Pi-Einstellungen und aktiviere die Option SSH. Außerdem aktivierst du auch die Felder, in denen etwas von „GPIO“ steht. Klicke auf ok und starte den Raspberry Pi ohne Bildschirm neu. Falls der Neustart automatisch vonstatten ging, fahre ihn herunter, trenne den Monitor und starte ihn wieder.
  3. Wenn der Raspberry Pi dann wieder hochgefahren ist, kannst du eine SSH-Verbindung herstellen. Da es dazu schon viele Anleitungen im Internet gibt, gehe ich nicht näher darauf ein. Im Internet gibt es dazu tatsächlich viele hilfreiche Anleitungen. Zum Beispiel diese:
  4. Führe Updates aus. Du glaubst nicht, wie oft Projekte schon gescheitert sind, weil ich das nicht gemacht habe. Also: Tu es! Das geht mit folgenden Befehlen. Eine Zeile ist ein Befehl, den du dann mit Enter ausführst. Danach die nächste Zeile, und so weiter:
sudo apt-get update
sudo apt-get upgrade

Asoziale Foren

So, und ab dem Update sind bis zu diesen Zeilen hier vier Stunden vergangen. Ich bin stinksauer und ich hoffe, dass ich Dir hier jetzt alles richtig erklären kann. Ich habe die Anleitung von ChatGPT befolgt mit dem Wissen im Hinterkopf, dass diese möglicherweise nicht vollständig ist und darum erstmal nicht funktioniert. So war es am Ende auch. Aber: Um das herauszufinden musste ich stundenlange das Internet wälzen. Natürlich hatten auch viele andere vor mir dieselbe Idee mit den LED-Streifen. Was tut man, wenn man nicht weiter weiß? Klar: In Foren nachfragen. Aber in Foren wird einem selten geholfen. In aller Regel bekommt man schnippische Antworten – man wird für dumm verkauft. Und das beste daran ist: Man kann auf Google die komplette Link-Liste durchgehen und auf kaum einer wird einem geholfen. Einfach nur ärgerlich.

Ich versuche, Dir hier die Dinge richtig zu erklären. Wenn du Fragen hast, stelle sie gerne in den Kommentaren (unten). Ob ich helfen kann, weiß ich leider nicht, aber es haben sich doch einige grundlegende Dinge geklärt.

Python und Komponenten installieren

Jetzt installieren wir die Programmiersprache Python (vereinfacht gesagt):

sudo apt-get install build-essential python-dev git scons swig

Jetzt könnest du theoretisch mit Python alles programmieren, was dir lieb ist.

Python2 und Python3

Eine wichtige Sache, die ich bei den schwierigen Recherchen lernen musste: Bei der Installation werden mehrere Python-Versionen installiert. Eine Python-Datei (dateiname.py) wird mit dem Befehl „python dateiname.py“ ausgeführt. FALSCH. Das ist im Internet immer wieder zu finden, doch tatsächlich werden dann die Programme mit Python Version 2 ausgeführt. Um Programme mit der aktuellen Python-Version (Version 3) auszuführen, ist der Befehl „python3“ nötig. Ob das für immer so bleibt, weiß ich natürlich nicht. Aber im Moment ist das so. Aber dazu gleich später.

Neopixel-Installation

Damit Python und der Raspberry Pi aber mit den LED-Streifen umgehen können, braucht es noch ein sogenanntes Python-Modul. Nämlich Neopixel. Oder so ähnlich. Ich habe den richtigen Befehl zwar gefunden, aber ob ich nun einen Teil von Neopixel oder ein eigenständiges Modul namens Adafruit… installiert habe, weiß ich ehrlich gesagt nicht:

sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel

Wichtig: Auch hier ist „pip3“ wichtig, um Module in Python3 zu installieren. Mit dem Befehl „pip …“ würdest du Module für Python2 installieren.

Ton deaktivieren(?)

Zwei Anleitungen auf meiner Internet-Reise haben angegeben, dass der Ton des Raspberry Pi deaktiviert werden muss. Ich kann es mir nicht vorstellen, aber vielleicht stimmt es ja. Ich habe hierzu ChatGPT befragt. Ob die Antwort stimmt, weiß ich nicht. Aber sie klingt jedenfalls plausibel und wäre eine Erklärung dafür, dass manche Anleitungen das erfordern und andere nicht:

Nein, der Ton des Raspberry Pi muss nicht deaktiviert werden, um den WS2812 LED-Streifen zu steuern. Der Ton hat keine direkte Auswirkung auf die Funktionalität des LED-Streifens.

Allerdings kann es sein, dass ein lauter Ton vom Raspberry Pi oder von angeschlossenen Lautsprechern elektrische Störungen verursacht, die sich auf den LED-Streifen auswirken können. In diesem Fall kann es sinnvoll sein, den Ton des Raspberry Pi zu reduzieren oder die Lautsprecher vom Raspberry Pi zu trennen, um mögliche Störungen zu vermeiden.

ChatGPT Feb 13 Version

Jedenfalls geht das so:

Zuerst wird folgende Datei bearbeitet. Vielleicht wirst du sie auch neu anlegen:

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

In diese Datei wird folgender Code eingefügt:

blacklist snd_bcm2835

Und jetzt bearbeitest du folgende Datei:

sudo nano /boot/config.txt

Dort findest du irgendwo eine Zeile mit folgendem Inhalt:
# Enable audio (loads snd_bcm2835)

Die Zeile darunter muss mit einer Raute auskommentiert werden (siehe folgendes Beispiel). Dadurch wird dieses „audio=on“ dann nicht mehr ausgeführt und das Audio bleibt folglich aus.

# Enable audio (loads snd_bcm2835)
# dtparam=audio=on

Erste Testdatei schreiben

ChatGPT hat mir zwar einen Programmcode vorgeschlagen, doch der hat nicht abschließend funktioniert. Folgender Code hat aber auf Anhieb funktioniert und darum werde ich ihn hier teilen.

Um eine neue Datei anzulegen, musst du folgenden Befehl benutzen:

sudo nano test.py

Jetzt hast du eine Datei angelegt mit dem Namen „test.py“. Programme, die mit Python programmiert sind tragen die Datei-Endung „.py“.

Jetzt hat sich der Editor geöffnet. Dort kopierst du folgenden Code rein:

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

# Simple test for NeoPixels on Raspberry Pi
import time
import board
import neopixel


# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18
# NeoPixels must be connected to D10, D12, D18 or D21 to work.
pixel_pin = board.D18

# The number of NeoPixels
num_pixels = 30

# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.GRB

pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER
)


def wheel(pos):
    # Input a value 0 to 255 to get a color value.
    # The colours are a transition r - g - b - back to r.
    if pos < 0 or pos > 255:
        r = g = b = 0
    elif pos < 85:
        r = int(pos * 3)
        g = int(255 - pos * 3)
        b = 0
    elif pos < 170:
        pos -= 85
        r = int(255 - pos * 3)
        g = 0
        b = int(pos * 3)
    else:
        pos -= 170
        r = 0
        g = int(pos * 3)
        b = int(255 - pos * 3)
    return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0)

ef rainbow_cycle(wait):
    for j in range(255):
        for i in range(num_pixels):
            pixel_index = (i * 256 // num_pixels) + j
            pixels[i] = wheel(pixel_index & 255)
        pixels.show()
        time.sleep(wait)


while True:
    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((255, 0, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((255, 0, 0, 0))
    pixels.show()
    time.sleep(1)

    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 255, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 255, 0, 0))
    pixels.show()
    time.sleep(1)

    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 0, 255))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 0, 255, 0))
    pixels.show()
    time.sleep(1)

    rainbow_cycle(0.001)  # rainbow cycle with 1ms delay per step

Achte unbedingt darauf, dass diese horizontalen Abstände übernommen werden. Das ist bei Python wichtig, damit der Code funktioniert. Achte darauf, dass du im Python-Code keine Umlaute verwendest.

Jetzt musst du den Raspberry Pi neustarten und einen Kaffee holen.

LED-Streifen verbinden

Ich habe einen LED-Streifen vom Typ WS2812 bei Amazon bestellt mit ziemlich eng aneinanderliegenden Dioden (siehe Bild).

Zwei Dinge sind jetzt wichtig:

  1. Auf dem Streifen sind kleine Pfeile aufgedruckt. Verbindungskabel sind aber an beiden Enden (vermutlich). Mit dem Raspberry Pi verbindest du den Streifen an dem Ende, wo die Pfeile beginnen. Mein Amazon-Streifen war verkehrt herum aufgewickelt. Die Angabe des Herstellers war daher verkehrt herum. Es hat einige Zeit gedauert, bis ich verstanden habe, dass die Pfeile dahingehend wichtig sein könnten.
  2. Es gibt LED-Streifen mit drei Drähten pro Ende und welche mit fünf Drähten. Ich habe einen Streifen mit 5 Drähten. Doch für unseren Test sind erstmal nur drei erforderlich.

Für die 5V-Stromquelle habe ich einfach ein unbenutztes USB-Kabel aufgeschnitten und an einen Adapter mit 2A angeschlossen, damit die Leistung sicher reicht. Ich empfehle dir, nicht unbedingt das billigste USB-Kabel zu nehmen, da das Abnehmen der Isolation der einzelnen Drähte sonst schwieriger sein kann. Bei einem Billigkabel konnte ich nicht einmal anhand der Farben erkennen, welcher Draht Plus und welcher Minus ist.

Fünf Drähte

Falls du einen LED-Streifen mit 5 Drähten hast, beachte folgendes:

Es sollten drei Drähte zusammengehören mit den Farben grün (oder blau), rot und weiß (oder schwarz). Eine Leitung für 5V+, eine für 5V- und eine Datenleitung (grün).

Zusätzlich gibt es noch einmal Plus und Minus für eine 5V-Leitung. Der Strom ist also doppelt gemoppelt. Das wird dann wichtig, wenn mehrere Streifen aneinandergereiht werden. Da das nicht der Fall ist, kannst du die separate Zuleitung also liegen lassen.

GPIO-Pins

Auf dem Raspberry Pi findest Du diese Pin-Leiste. Dort hat jeder Pin seine eigene Aufgabe. Die grüne/ blaue Datenleitung und die Minus-Leitung wird mit dem Raspberry Pi verbunden. Dazu würde ich den Raspberry Pi ausschalten, falls du dir nicht absolut sicher bist, dass du die richtigen Pins anschließt. Nicht, dass am Ende alles an unnötigen Kurzschlüssen scheitert. Aber grundsätzlich geht das auch während dem Betrieb.

Hier ein Bild von der Funktion jedes einzelnen Pins:

Jetzt müssen wir die Kabel wie folgt verbinden:

  1. LED-Streifen Minus:
    • mit der Minus-Leitung der 5V-Stromquelle
    • mit dem Pin 6 (Ground) auf dem Raspberry Pi
  2. LED-Streifen Plus:
    • mit der Plus-Leitung der 5V-Stromquelle
  3. LED-Streifen Daten (grün/ blau):
    • mit dem Pin 12 (GPIO 18 PCM_CLK) auf dem Raspberry Pi

Und dann kannst du den Strom (5V) des LED-Streifens anschließen. Wenn nichts passiert, ist alles gut. Der Streifen bleibt also dunkel. Zumindest war das bei meinem so.

LED-Streifen zum leuchten bringen

Jetzt kann es endlich losgehen. Starte deinen Python-Code mit folgendem Befehl:

sudo python3 test.py

Jetzt müssten die ersten 30 Dioden deines LED-Streifens verschieden-farbig leuchten. Das Programm wiederholt sich endlos.

Mit ctrl + C kannst du das laufende Programm wieder beenden. Der LED-Streifen wird dann einfach an der letzten Position „stehenbleiben“.

Gezielte Programmierung

Als nächstes müssen die einzelnen LED’s gezielt angesteuert werden. Also muss ich herausfinden, welche Python-Befehle dazu nötig sind. Aus dem Beispielcode konnte ich das leider nicht herauslesen. Durch die verschiedenen Variablen und Schleifen habe ich den Durchblick verloren.

Zu diesem Zweck habe ich den Schreibtisch aufgeräumt und den LED-Streifen gerade vor mich auf den Schreibtisch geklebt. So habe ich alle Dioden im Blick und sehe, wie sich die Programmierung auswirkt. Hier hat ChatGPT hingegen sehr gut geholfen und zeigte mir einen einfachen Code, um eine einzelne Diode in einer bestimmten Farbe anzusteuern. Ich habe den Code noch etwas mehr vereinfacht:

import board
import neopixel

pixels = neopixel.NeoPixel(board.D18, 100)

pixels[5] = (255, 0, 0)

pixels.show()

Diesen Code habe ich in einer neuen Datei „test2.py“ gespeichert. Hier die Erklärung:

Als erstes werden die nötigen Bibliotheken importiert. In der vierten Zeile finden wir folgendes:
neopixel.NeoPixel(board.D18, 100)
Innerhalb der Klammern sind zwei Parameter angegeben. Im ersten Parameter geben wir an, dass die Datenleitung des LED-Streifens auf dem GPIO-Pin 18 liegt. Darum auch „import board“ in der Zeile 1. Im zweiten Parameter teilen wir dem Objekt „pixels“ mit, wie viele Dioden insgesamt auf dem LED-Streifen vorhanden sind. Ich hatte keine Lust, sie zu zählen und habe einfach 100 angegeben. Die Angabe muss nicht exakt sein.

In der Zeile 6 steuern wir nun eine einzelne Diode an. [5] bedeutet dabei, dass die sechste Diode angesteuert wird, denn die Zählung beginnt bei null. Wenn du das Prinzip von Arrays kennst, wirst du das schon wissen.

In den Klammern ist die Farbe angegeben im RGB-Format. 255, 0, 0 bedeutet Rot. Es gibt verschiedene Online-Dienste, die eine Farbe in einen RGB-Wert umwandeln. Zum Beispiel diese Seite. Sicher gibt es auch bessere – das war nur die erste Seite in der Google-Suche.

Diese Zeile (6) können wir nun beliebig oft kopieren und dadurch mehrere Dioden gleichzeitig ansteuern. Wozu die letzte Zeile nötig ist, weiß ich nicht genau. Der Streifen funktioniert auch ohne sie…

Alles weitere ist nun Sache von Python-Programmierkenntnissen. Dazu werde ich einen weiteren Artikel schreiben, doch erstmal wars das mit den Erklärungen zur Verwendung der LED-Streifen.

Kommentare zu diesem Artikel

Wie ist Dein Name?

Wie ist Deine E-Mail-Adresse?

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

Was möchtest Du zum Artikel sagen?

Bisher wurden noch keine Kommentare geschrieben.