Raspberry Pi: externe Status-LEDs über GPIO (pwr_led & act_led)

Aktuelle Raspberry Pi-Modelle besitzen 2 Status-LEDs auf dem Board, anhand derer man erkennt, ob der RPi läuft (pwr_led) und ob sich gerade etwas tut (act_led). Baut man den RPi jedoch in ein Gehäuse ein, sind diese LEDs oft verdeckt. In diesem Beitrag wollen wir ein paar LEDs über die GPIO-Anschlüsse ansteuern und damit die Staus-LEDs außerhalb geschlossener Gehäuse sichtbar machen.Raspberry Pi im 19"-Modul montiert

Inhalt

Grundlagen und Material

Ich setze mal voraus, dass Ihr einen betriebsbereiten Raspberry Pi mit installiertem Image und SSH-Zugang zur Hand habt. Falls nicht, könnt Ihr hier nochmal nachlesen, wie ich ein neues System aufsetze.

Also, was brauchen wir? Ein paar LEDs mit niedrigem Stromverbrauch und die passenden Widerstände dazu. Bei der Auswahl der LEDs sollte man folgendes beachten: Angeschlossen werden sie am GPIO-Header des Raspberry Pi’s. Aus den GPIO-Ausgängen kommt +3,3V heraus und an einem beliebigen GPIO wird der +-Pol der LEDs (das längere Bein) angeschlossen. Das kürzere Bein, der --Pol, wird über einen Widerstand an GND angeschlossen. Der Widerstand dient dazu, die überschüssige Spannung zu verbraten und den Strom durch die LED zu begrenzen.

Spannungsfall LED/Widerstand

Spannungsfall LED/Widerstand

Weiterhin müssen bei der Auswahl der LEDs deren technische Daten berücksichtigt werden. Die Versorgungsspannung sollte ≤3,3V und die Stromaufnahme ≤16mA sein, denn das ist der Strom, den die GPIO auf Dauer liefern können. Eine LED mit höherer Stromaufnahme wird zwar auch funktionieren, nur kann man sich nicht sicher sein, wie lange das funktioniert und ob der Raspberry Pi auf Dauer nicht doch Schaden nimmt.

Ich habe mich für Low-Current-LEDs entschieden, die eine Durchlassspannung von 2,1V und eine Stromaufnahme von 2mA haben. Das bedeutet, dass von den 3,3V, die der Ausgang ausgibt, 2,1V für die LED verwendet werden und die restlichen 1,2V über den Widerstand abfallen müssen. Weiterhin möchten die LEDs 2mA an Strom haben, sodass diese 2mA auch durch den Widerstand fließen müssen. die Größe des Widerstandes errechnet sich jetzt wie folgt:

Rein rechnerisch bräuchten wir einen 600Ω-Widerstand. Da es diesen jedoch nicht gibt, nehmen wir den nächst größeren mit 680Ω.

Hinweis
Die Genauigkeit bei der Dimensionierung spielt hier eher eine untergeordnete Rolle. Alle Bauteile haben Toleranzen, sodass es hier hauptsächlich um die grobe Richtung geht. Lieber die Widerstände zu hoch wählen, statt zu niedrig. Ich habe für alle LEDs den gleichen Widerstandswert verwendet. Im Betrieb sieht man keinen Unterschied.
Einen LED-Vorwiderstandsrechner gibt es hier.

LEDs anschließen

LEDs am Raspberry Pi anschließen

LEDs am Raspberry Pi anschließen

Wer möchte, kann sich LEDs, Widerstände und Raspberry Pi ja erstmal auf einer Steckplatine zusammenstecken und ein wenig herumprobieren. Letztlich muss das Ganze jedoch zusammengelötet werden, um nicht zu viel Platz im Gehäuse zu verschenken. Die GPIO-Belegung könnt Ihr hier nochmal nachschauen. Ich habe die LEDs wie folgt angeschlossen:

  • ROT: an GPIO26 (Pin 37)
  • GRÜN: an GPIO20 (Pin 38)
  • GELB: an GPIO21 (Pin 40)
  • Masse: an GND (Pin 39)

Zuerst schneiden wir das jeweils kürzere Bein an den LEDs noch kürzer und löten daran den Widerstand an. Dann befestigen wir die LEDs im Gehäuse und biegen die langen Beine (die ohne den Widerstand) der LEDs so zusammen, dass wir an alle 3 einen Draht anlöten können. Als nächstes nehmen wir uns ein paar Steckbrücken, schneiden auf der einen Seite den Stecker ab und verzinnen die Adern. Zuletzt müssen die Drähte dann nur noch angelötet und die andere Seite auf den Raspberry Pi gesteckt werden.

LEDs für Raspberry Pi Widerstände an LEDs anlöten LEDs montieren und Beine zurecht biegen
Anschlusskabel für LEDs Stecker einseitig abschneiden und Adern verzinnen Anschlusskabel an LEDs anlöten
Hinweis
Die blanken Beinchen sollten vorm Einbau in das Gehäuse noch isoliert werden. Dafür eignet sich Schrumpfschlauch am Besten. Wer den nicht zur Hand hat nutzt Isolierband aus dem Baumarkt. Zur Not tut es aber auch etwas Tesa-Film.

Steuerung der LEDs

…über die Shell

Die Status-LEDs sind jetzt soweit vorbereitet, dass man sie beliebig in einem Script ansteuern kann. Entweder verwendet man dafür ein Python-Script, wie ich hier schonmal beschrieben habe, oder macht das direkt über die Shell. Letzteres will ich hier mal kurz anhand des GPIO26 erläutern.

Zuerst muss der gewünschte GPIO verfügbar gemacht werden. Das geschieht, indem man auf der Kommandozeile die GPIO-Nummer exportiert:

$ echo 26 > /sys/class/gpio/export

Damit ist der GPIO erstmal grundsätzlich einsatzbereit. Als nächstes wird der GPIO als Ausgang festgelegt:

$ echo "out" > /sys/class/gpio/gpio26/direction

Anschließend kann er dann eingeschaltet werden, indem 1 auf den Ausgang geschrieben wird:

$ echo 1 > /sys/class/gpio/gpio26/value

Zum Ausschalten schreiben wir 0:

$ echo 0 > /sys/class/gpio/gpio26/value

Mit diesem Wissen können wir nun in beliebige Shell-Scripte die Steuerung von Statusanzeigen einbauen. Wir könnten auch Cron dazu verwenden, LEDs zu schalten.

…über /boot/config.txt

Um über die LEDs den echten Betriebsstatus des Raspberry Pi erkennen zu können, müssen wir etwas tiefer ins System eintauchen. In der Datei /boot/config.txt kann man verschiedene Einstellungen vornehmen. Darunter auch das Weiterleiten der Status-Informationen. Außerdem kann man hier angeben, wie die Onboard-, aber auch die GPIO-LEDs getriggert werden sollen. Dafür stehen verschiedene Trigger zu Auswahl:

gpio Damit lässt sich die Onboard-Power-LED wie eine an GPIO angeschlossene LED steuern
heartbeat Simuliert einen Herzschlag. Solange der Linux-Kernel läuft, blinkt die LED in einem Doppelpuls
timer LED wird zeitgesteuert ein-/ausgeschaltet
input Zeigt an, wenn die Spannungsversorgung zu niedrig ist
mmc0 LED blinkt bei Schreib-/Lesezugriffen auf die SD-Karte
cpu0 LED blinkt bei CPU-Last
none kein Trigger

Es gibt noch ein paar weitere Trigger, die man sich mit folgendem Befehl ausgeben lassen kann:

$ cat /sys/class/leds/led0/trigger

Verwendet werden können die Trigger mit folgenden Parametern:

  • act_led_trigger=<Trigger>
  • pwr_led_trigger=<Trigger>

Für act_led_trigger ist mmc0 der Standard. Möchte man diese Funktion beibehalten, kann man sich die Angabe des Triggers sparen.

Die externen LEDs lassen sich mit diesen Parametern ansteuern:

  • act_led_gpio=<GPIO-Nummer>
  • pwr_led_gpio=<GPIO-Nummer>

In diesem Beispiel nutzen wir die rote LED als Heartbeat. Die grüne soll Schreib- und Lesezugriffe auf der SD-Karte anzeigen. Also öffnen wir die config-Datei mit folgendem Befehl…

$ sudo nano /boot/config.txt

…und fügen für einen Raspberry Pi bis Version 2 am Ende folgende Zeilen an:

# Status-LEDs an GPIO weiterleiten
dtparam=act_led_gpio=20
dtparam=pwr_led_gpio=26,pwr_led_trigger=heartbeat

Beim Raspberry Pi 3 wurden diese Funktionen geändert. So kann man dort nicht mehr auf pwr_led zugreifen. Auch die act_led funktioniert nun anders:

# Status-LEDs an GPIO weiterleiten
dtoverlay=pi3-act-led,gpio=20

Nach einem Reboot werden die Einstellungen übernommen. Fortan blinken die GPIO-LEDs ohne Ansteuerung durch ein separates Script.

Nutzt man übrigens timer als Trigger, so kann man die Blink-Frequenz mit folgenden Befehlen beeinflussen:

$ echo [Zeit in ms] > /sys/class/leds/led0/delay_on
$ echo [Zeit in ms] > /sys/class/leds/led0/delay_off

Auch für none gibt es noch Einstellungen. Mit brightness kann man bestimmen, ob die LED ein- oder ausgeschaltet sein soll:

$ echo 1 > /sys/class/leds/led0/brightness
$ echo 0 > /sys/class/leds/led0/brightness

Und die gelbe LED?

Was man am besten mit der gelben LED macht, hängt natürlich von der konkreten Anwendung ab. Die Pi’s in meinem Netzwerkschrank haben natürlich eine konkrete Funktion. Auf dem einen läuft RaspberryMatic, auf dem anderen FHEM. Hier ist es natürlich eine relevante Information, ob beides korrekt arbeitet. Dafür habe ich in beiden Systemen einen Heartbeat programmiert, der jeweils die gelbe LED blinken lässt.

Unter RaspberryMatic, das seit einigen Versionen mit WiringPi ausgeliefert wird, sieht das so aus und wird aller 2 Sekunden ausgeführt:

RaspberryMatic Heartbeat

FHEM bringt die Unterstützung von GPIOs ebenfalls direkt mit (allerdings ohne WiringPi), sodass wir uns hier auf deine reine FHEM-Config beschränken können:

define RPi.GPIO21_htb_led RPI_GPIO 21
attr RPi.GPIO21_htb_led direction output
attr RPi.GPIO21_htb_led room RPi

define RPi.GPIO26_htb_led.blink at +*00:00:02 set RPi.GPIO21_htb_led on-for-timer 1
attr RPi.GPIO26_htb_led.blink room RPi

Weiterführende Informationen und Links

Sebastian

31 Comments

  1. Antworten Valler

    Hallo Sebastian,
    Ich bin gerade dabei Raspberrymatic auf meinem Pi zu installieren und wollte dann auch gerne die Boardmittel,
    die der Pi ht in die Hausautomatisierung mit einbinden (GPIO’s als Ein- und Ausgabe und 1Wire).

    Ich habe jetzt anhand deines Beispiels die GPIO’s versucht anzusteuern jedoch funktioniert es nicht.
    Muss ich vorher noch irgendein packet installieren?

    • Antworten Sebastian

      Hi,
      bei RaspberryMatic ist WiringPi im Gepäck. Daher solltest du auch WiringPi zur Ansteuerung verwenden.
      Bedeutet:
      GPIO als Ausgang vorbereiten: $ gpio mode (pin) out
      Ausgang schalten: $ gpio write (pin) 0/1

      Um das über die CCU-Oberfläche zu erreichen nutzt du system.Exec("gpio write (pin) 1"); in einem Script.

  2. Antworten Peter Schierl

    Hallo Sebastian,
    erst einmal vielen Dank, dass Du Deine Projekte und Ideen in Deinem Block veröffentlichst.
    Ich habe bereits nach Deinen Ideen einige Dinge umgesetzt:
    -Raspi im 19″ Rack Netzwerkschrank (genial, endlich Ordnung !)
    -Raspi-CPU Auslastung auf OLED Display
    -SSH Login Nachricht anpassen
    Jetzt wollte ich mich an das Projekt „Ansteuerung der LED’s“ machen.
    Mit dem Raspi v2 alles kein Problem funktioniert bestens.
    Da ich aber überwiegend Raspi v3 in Betrieb habe, geht wie Du schreibst die Ansteuerung über
    „pwr_led“ beim Raspi v3 nicht.
    Frage: Gibt es zwischenzeitlich eine Lösung für den Raspi v3 ?

    Da ich auch eine „RaspberryMatic“ Installation habe wollte ich wenigstens eine LED für den
    „Heartbeat“ einrichten.
    Frage: Könntest Du mir die beiden Scripte die Du in dem PRG „Heartbeat_GPIO“ einsetzt mal zukommen lassen ?
    Auch die Einstellung des Triggers „Zeitsteuerung“ im PRG wäre für mich wichtig.

    Vielen Dank für Deine Hilfe.
    MFG Peter

    • Antworten Sebastian

      Hi,
      die Funktion pwr_led am Raspberry Pi 3 habe ich nicht mehr weiter verfolgt. Da meine Pis per Netzwerkkabel angeschlossen sind, reicht mir eigentlich auch die LED am Netzwerkanschluss als Indikator, ob das Teil läuft oder nicht. Auch die LED einfach per Software fest einzuschalten ist meiner Ansicht nach ausreichend. Sie beginnt dann lediglich etwas später zu leuchten, wenn der Rai hochfährt.
      Wie ich den Heartbeat von RaspberryMatic gebaut habe, kannst du im Screenshot erkennen. Die Scripte enthalten tatsächlich nur system.Exec("gpio write 29 1"); und system.Exec("gpio write 29 0");. Als Serienmuster habe ich Zeitintervall, Alle 2 Sekunden gewählt.

  3. Antworten Peter

    Hallo Sebastian,
    Danke für die Infos zu RaspberryMatic.
    Sag mir bitte noch, wie ich die LED per Software fest einschalten kann.
    Danke !
    Peter

    • Antworten Sebastian

      Genau wie oben beschrieben, nur ohne Zeitsteuerung. Zwingt dich ja keiner, die im Sekundentakt wieder auszuschalten.
      Oder was meinst du?

    • Antworten Ralf

      Ich würde gerne die Act-LED beim Raspberry PI3 steuern, die soll leuchten wenn WLAN verbunden ist, vielleicht kann mir jemand helfen

      • Antworten Sebastian

        Du könntest mittels Shell-Script den WLAN-Status abfragen und entsprechend die LED ein- und ausschalten. Das Script lässt du dann einfach im Hintergrund laufen.

        • Antworten Ralf

          Irgendwie bekomme ich das mit der Ansteuerung der act-LED nicht hin. Vielleicht kann mir jemand helfen um ein Script zu erstellen, dass die act-led nur Leuchte wenn der Raspi pi4 mit meinem Netzwerk bin wlan verbunden ist.

  4. Antworten Gerrit

    Hallo,
    coole Anleitung – gerade in Zusammenhang mit dem 19″-Rack 🙂
    Darf ich fragen, welche LEDs Du verwendet hast?
    Eventuell hast Du ja direkt Links…
    Wäre super.
    Danke schonmal!

      • Antworten Gerrit

        Vielen dank für’s Suchen!
        Ich bin bei Elektronik nicht so fit und frage lieber nochmal bevor ich einen Raspberry Pi grille…

        Ist es richtig, dass in diesem Fall die Stromstärke mit 2mA wichtiger ist als die Spannung von 2,1V?
        Die drei LEDs (hatte ich auch gefunden) haben ja 2,0V 2,1V und 2,2V – und du hast oben von 2,1 geschrieben, da war ich mir nicht ganz sicher…

        (Sorry, wenn die Frage doof war)

        • Antworten Sebastian

          Ein weiß, dass ich einfach nur 2,1V geschrieben habe. Ich wollte es für die Erklärung aber einfach halten.

          Eigentlich muss man sich nur innerhalb der Spezifikation der GPIO bewegen, alles andere ist egal. Das bedeutet: niedriger Strom (ich weiß gerade nicht, wieviel die GPIO ausgeben können, ich meine es wären 10 oder 15mA gewesen) und Spannung maximal 3,3V.

          Alle Leuchtdioden, die sich unterhalb dieser Werte bewegen, sind geeignet. Bei der Berechnung des Vorwiderstandes musst du nur die entsprechenden Werte der LEDs verwenden und diese findest du im Datenblatt.

  5. Antworten FelixPi

    Hallöchen,

    Ist es auch möglich eine LED leuchten zu lassen, wenn ein bestimmter Dienst aktiv ist?
    Und bei laufenden Updates?

    Gruß Felix

    • Antworten Sebastian

      Sicher, du musst dein Script nur entsprechend anpassen. Einfach den Status des Dienstes abfragen und entsprechend im Script reagieren

  6. Antworten Ralf

    Danke für die Info, aber ich befürchte das geht über meine Kenntnisse hinaus; habe eine PI4 und PI3 B+.
    Ich habe keine Ahnung wie ich den Raspi so konfiguriere das er über das Script angesprochen werden kann und vor allem wie man ein solches script schreibt.

  7. Antworten Peter

    Hi,

    Hast du eine Lösung für den RPI 4B ?
    Ich bin erst ganz neu in der PI Welt.

    Gruß P.

  8. Antworten Klaus

    Hallo Sebastian,
    ich habe das Problem, dass ich das ganz einmal Rückgängig machen muss,
    um eine andere Funktion (über ein Board zum aufstecken) zu nutzen.
    Kannst du mir einmal sagen, wie ich das mache?
    Gruß Klaus

  9. Antworten Stef

    Hallo,
    sehr gute Anleitung. 🙂
    Aber meine Frage wäre noch, ob ich beim RPI4 die eth_led’s vom LAN-Port auf gpio-pins umleiten kann, um sie mit externen LESs anzuzeigen.
    Ansonsten muß ich das mit nem Kunstofflichtleiter zur Gehäusefront machen … 🙁
    Irgend ne Idee ?
    Danke und Gruß
    Stef

  10. Antworten Thomas

    Hallo Sebastian,
    ist die Funktion
    act_led
    pwr_led
    auch mit Raspberry Pi 4 Model B verfügbar?

    • Antworten Sebastian

      Hi Thomas, das weiß ich nicht genau. Beim Pi4 kann man meiner Meinung nach den aktuellen Betriebszustand auch gut am Netzwerkport erkennen, sodass ich mittlerweile keine Verwendung mehr dafür habe.

  11. Antworten Jochen

    Funktioniert das auch 1:1 für den Pi 4? Hab mal irgendwo gelesen, dass dort nicht alle LEDs an GPIO übertragen werden können.

  12. Antworten Harry

    Super, aber wie sieht es für die Netzwerkleuchten aus, würde mich interessieren, wäre klasse wenn mir das mal jemand erklären könnte.
    Gruß Harry

  13. Antworten Stromi

    Hallo und guten Tag,

    leider verzweifele ich an der selbst gestellten Aufgabe, meinen Paspi4B davon zu überzeugen, dass er drei angeschlossene LED‘s durch Eintragung von Befehlszeilen meine Wünsche zu Erfüllen.
    Die da währen „rot“ soll einen „heartbeat“ anzeigen wenn das kernal läuft, „grün“ soll Lese-/Schreibaktivität auf den Systemlaufwerk anzeigen (Was im übrigen das einzige ist was mir bislang gelang!) und zu guter letzt soll „gelb“ CPU-Last anzeigen. Die LED’s einzeln über
    $ echo 1 > /sys/class/gpio/gpio26/value
    ein und auch wieder aus zu schalten gelingt mir auch, aber wie erkläre ich dem Raspi das für rot und gelb ohne erst noch mit phyton anzufangen?

    Grüße

  14. Pingback: Raspberry Pi Rackmount – NoSmaHome

Hinterlasse eine Antwort

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

WordPress Cookie Hinweis von Real Cookie Banner