Hoch- und runterfahren mittels Taster (incl. Status-LED)
Dieses Tutorial beschreibt, wie man mit wenig Bauteilen und einem kleinen Python-Script das starten und saubere herunterfahren des Raspberry Pi über die GPIO Schnittstelle durch einen externen Taster realisieren kann. Zusätzlich dient optional eine LED als Statusanzeige für Betrieb und Tastenbetätigung.
I. Vorbereitung
Zu allererst müssen wie immer die Paketquellen aktualisiert werden:
Danach kann dann alles installiert werden, was man zum ansteuern der GPIO Ports via Python braucht:
Wer dabei eine Fehlermeldung (Unable to locate package python-rpi.gpio) erhält kann das Paket auf alternativem Wege installieren:
II. Software
Um das Script im Home-Verzeichnis zu erstellen, wird zuerst der Editor 'nano' aufgerufen:
Dabei wird gleichzeitig festgelegt, dass das Script später einmal 'shutdown.py' heißen wird. In das Editorfenster muss dann folgendes Script kopiert werden:
# shutdown script for Raspberry Pi
# watch LOW level on pin 5 to enter sleep mode
# status led on pin 7: ON = ready, BLINK = confirm button
import RPi.GPIO as GPIO
import os
import time
# use the pin number as on the raspi board
GPIO.setmode(GPIO.BOARD)
# set pin 7 as output and HIGH, pin 5 is input
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
GPIO.setup(5, GPIO.IN)
# start the loop for every .5 seconds, waiting for LOW on pin 5
# then 2 short flashes with led to confirm and shutdown to sleep mode
while True:
if not (GPIO.input(5)):
GPIO.output(7, False)
time.sleep(.1)
GPIO.output(7, True)
time.sleep(.1)
GPIO.output(7, False)
time.sleep(.1)
GPIO.output(7, True)
os.system("sudo shutdown -h now")
time.sleep(.5)
Display More
Speichern mit Strg+o, beenden mit Strg+x. Die mit # beginnenden Zeilen sind Kommentare und müssen nicht unbedingt mitkopiert werden.
Danach muss das Script noch mit ausführbaren Rechten versehen werden:
Damit das Script auch automatisch im Hintergrund startet, wird es in die rc.local eingetragen:
Der Aufruf muss vor der Zeile exit 0 stehen. Am Ende sollte es dann so aussehen:
Wieder speichern mit Strg+o und beenden mit Strg+x. Wenn ihr das Script nicht im Home Verzeichnis erstellt habt, müsst ihr den Pfad natürlich anpassen.
Wer lieber mit den GPIO internen Bezeichnungen arbeiten möchte (warum auch immer), muss im Script die Zeile
gegen
austauschen und das Script anpassen. Pin 5 ist GPIO-3 und Pin 7 ist GPIO-4. Aus GPIO.setup(5, GPIO.IN) z.B. wird dann GPIO.setup(3, GPIO.IN), usw. Das gilt aber nur für Model B Rev.2 (das wohl am meist verbreiteste), bei Rev.1 ist ist Pin 5 GPIO-1, nicht 3. Zu Model A kann ich keine sichere Aussage geben, die Methode mit (GPIO.BOARD) funktioniert dort aber auf jeden Fall. Ihr versteht jetzt vielleicht, warum ich die aufgedruckte Bezeichnung bevorzuge
Auf dieser Seite gibt es eine bebilderte Übersicht zu der Thematik, welche auch die verschiedenen Revisionen behandelt.
III. Hardware
Folgende Bauteile werden benötigt:
- 1 Taster (Schließer)
- 1 LED
- 1 Widerstand 10k Ohm
- 1 Vorwiderstand für die LED
Zum Thema Vorwiderstand für die LED kann man sich z.B. hier informieren. Es muss mit einer Betriebsspannung von 3,3V gerechnet werden, der Strom sollte so um 10-20mA (je nach LED) sein. Bei einer roten Standard-LED liegt man mit um die 100 Ohm nie verkehrt.
Das ganze muss dann folgendermaßen angeschlossen werden:
Achtung: Ich benutze aus Gewohnheit bei der GPIO Pin Bezeichnung die Zählweise, wie sie auf dem Board markiert ist. Zur Veranschaulichung mal ein Foto, wie ich das in meinem Bastel-Pi Modell A angeschlossen hatte:
Die grüne Ader geht an 3,3V (Pin 1), weiß an Pin 5, schwarz an Masse (Pin 6) und rot an Pin 7.
Kurze Erklärung der Schaltung:
Schalter nicht betätigt:
Da der Eingangswiderstand vom GPIO sehr viel höher als der Pull-up ist fällt dort fast die gesamte Spannung ab -> HIGH
Schalter betätigt:
Es wird eine direkte Verbindung zwischen dem GPIO Eingang und GND geschaffen -> LOW
Der Pull-up verhindert einen Kurzschluss zwischen VCC und GND.
Die 10k Ohm für den Pull-up sind nur ein Standardwert, ein paar Kiloohm mehr oder weniger funktionieren genau so gut.
Die LED erfüllt zwei Zwecke. Zum einen als Bereitschaftsanzeige, wenn man den Raspi ohne Bildschirm betreibt (beim Webradio hören, z.B.), und zweitens als Bestätigung zum runterfahren. Das Script fragt den Eingang alle 0,5 Sekunden ab, darum kann es vorkommen, dass ein kurzer Tastendruck nicht reicht. Wird die Betätigung erkannt, dann blinkt die LED zweimal kurz. Wer das nicht braucht, kann die LED auch einfach weg lassen.
Sollte Pin 7 bei euch schon anderweitig verwendet werden, könnt ihr auch auf einen anderen GPIO Port ausweichen. Ihr müsst dann nur das Script und die Verschaltung entsprechend anpassen. GPIO-3 auf Pin 5 ist aber nicht austauschbar, da sonst das Hochfahren nicht funktioniert.
IV. Hochfahren des Raspi
Das Starten aus dem Standby beherrscht der Pi von Hause aus. Dazu muss der GPIO Pin 5 einfach gegen Masse gezogen werden. Darum spricht das Script auch diesen Pin mit LOW Level an, so können beide Funktionen mit nur einem Taster ausgeführt werden. Wichtig dabei ist, dass zum starten der Taster nur kurz betätigt wird (wie ein Mausklick). Bei längerem drücken hängt sich der Pi beim hochfahren auf, und es hilft nur noch Stecker ziehen. Im alltäglichen Gebrauch stört das aber nicht, den Fehler muss man schon absichtlich provozieren.
V. Anwendungsbeispiel
Für mein Raspbmc Pi im Wohnzimmer dient eine USB-Maus als Schalter, der Pi selbst und die Festplatte liegen versteckt unter der TV-Bank. Die Maus liegt unauffällig neben dem AV-Receiver und verschandelt die Gesamtoptik nicht (allzu sehr)
Die Mausplatine konnte ich mit ein paar kleinen Änderungen weiter nutzen, die beiden Taster sind parallel geschaltet. Das Mausrad, die Kondensatoren und der IC sind ohne Funktion. Den Platz der Maus-LED nimmt eine rote ultrahelle LED ein.
Und so sieht der Mausschalter in Aktion aus:
Getestet unter Raspbian Wheezy und Raspbmc. Für Hinweise auf Fehler oder konstruktive Kritik bin ich dankbar und offen