startstop
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| startstop [2017/11/11 19:12] – noone | startstop [2020/12/20 23:04] (aktuell) – noone | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====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: | ||
| + | sudo apt-get update && sudo apt-get upgrade | ||
| + | |||
| + | Danach kann dann alles installiert werden, was man zum Ansteuern der GPIO Ports via Python braucht: | ||
| + | sudo apt-get install python-dev | ||
| + | sudo apt-get install python-rpi.gpio | ||
| + | |||
| + | Wer dabei eine Fehlermeldung (Unable to locate package python-rpi.gpio) erhält kann das Paket auf alternativem Wege installieren: | ||
| + | sudo apt-get install python-pip | ||
| + | sudo pip install rpi.gpio | ||
| + | |||
| + | ===II. Software=== | ||
| + | Um das Script im Home-Verzeichnis zu erstellen, wird zuerst der Editor ' | ||
| + | sudo nano / | ||
| + | |||
| + | Dabei wird gleichzeitig festgelegt, dass das Script später einmal ' | ||
| + | # | ||
| + | |||
| + | # shutdown script for Raspberry Pi | ||
| + | # watch LOW level on pin 5 to shutdown | ||
| + | # status led on pin 37: ON = ready, BLINK = confirm button | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | # use the pin number as on the raspi board | ||
| + | |||
| + | | ||
| + | |||
| + | # set pin 37 as output and HIGH, pin 5 is input | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | # start the loop for every .5 seconds, waiting for LOW on pin 5 | ||
| + | # then 3 short flashes with led to confirm and shutdown | ||
| + | |||
| + | while True: | ||
| + | if not (GPIO.input(5)): | ||
| + | GPIO.output(37, | ||
| + | time.sleep(.1) | ||
| + | GPIO.output(37, | ||
| + | time.sleep(.1) | ||
| + | GPIO.output(37, | ||
| + | time.sleep(.1) | ||
| + | GPIO.output(37, | ||
| + | time.sleep(.1) | ||
| + | GPIO.output(37, | ||
| + | time.sleep(.1) | ||
| + | GPIO.output(37, | ||
| + | os.system(" | ||
| + | time.sleep(.5) | ||
| + | |||
| + | 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: | ||
| + | sudo chmod +x / | ||
| + | |||
| + | Damit das Script auch automatisch im Hintergrund startet, wird es in die rc.local eingetragen: | ||
| + | sudo nano / | ||
| + | |||
| + | Der Aufruf muss vor der Zeile exit 0 stehen. Am Ende sollte es dann so aussehen: | ||
| + | ... | ||
| + | sudo / | ||
| + | exit 0 | ||
| + | |||
| + | 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, | ||
| + | |||
| + | Auf [[http:// | ||
| + | |||
| + | ===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. [[http:// | ||
| + | |||
| + | 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 37 (Anders als im Bild!). | ||
| + | |||
| + | 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, | ||
| + | Die LED erfüllt zwei Zwecke. Zum einen als Bereitschaftsanzeige, | ||
| + | |||
| + | Sollte Pin 37 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, | ||
| + | |||
| + | ===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). | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | ====Andere Möglichkeit==== | ||
| + | |||
| + | In der Datei / | ||
| + | | ||
| + | |||
| + | Nach dem Reboot kann der Pi runtergefahren und gestartet werden, indem GPIO 03/Pin 5 auf Masse gezogen wird. | ||
| + | |||
| + | Der Raspberry Pi kann so konfiguriert werden, dass ein Shutdown eingeleitet wird, sobald ein beliebiger GPIO-Pin kurz mit Masse verbunden wird. Es bietet sich hier natürlich an, mit GPIO 3 denselben Pin zu verwenden, der für das Starten benutzt wird (bzw. werden muss, denn für das Starten kann kein anderer Pin als GPIO 3 verwendet werden). Sollte GPIO 3 durch einen Hardware-Aufsatz verwendet werden, musst du auf einen aderen Pin ausweichen, du hättest also einen Pin zu Starten und einen anderen zum Stoppen. | ||
| + | |||
| + | Um einen der GPIO-Pins für das Starten zu konfigurieren, | ||
| + | cd /boot | ||
| + | cp --preserve config.txt config.txt.orig | ||
| + | |||
| + | Danach ergänzt du die Datei um folgende Zeilen: | ||
| + | # Initiate shutdown by pulling GPIO 3 to GND level | ||
| + | | ||
| + | |||
| + | Du darfst keine Leerzeichen beispielsweise hinter einem Komma schreiben. Statt GPIO 3 kannst du aber jeden anderen GPIO-Pin verwenden, wenn er nicht durch andere Hardware verwendet wird. | ||
| + | |||
| + | Falls du tatsächlich GPIO 3 verwendest, kannst du den Taster zum Starten des Systems (aus der Anleitung oben) nun auch zum Stoppen verwenden. | ||
| + | |||
| + | Je nachdem, wie exponiert der Taster am Gehäuse angebracht wird, besteht die Gefahr, dass dein Raspberry Pi ungewollt heruntergefahren wird, weil du den Taster versehentlich auslöst. Um das Risiko eines ungewollten Systemstopps deutlich zu vermindern, kannst du zwei Taster in Reihe schalten. Du musst dann immer beide Taster gleichzeitig drücken. | ||
| + | |||
| + | ===Laufenden Raspberry Pi per LED anzeigen=== | ||
| + | Wenn du einen Taster für den den Start und Stopp vorsiehst, ist es möglicherweise interessant zu erkennen, in welchem Zustand – gestartet oder gestoppt – sich der Raspberry Pi befindet. Die beiden LEDs für Power (rot) oder Speicheraktivität (grün) sind da nicht besonders aussagekräftig: | ||
| + | |||
| + | Es gibt einige Möglichkeiten, | ||
| + | |||
| + | Dazu sind folgende Kommandos nötig: | ||
| + | echo " | ||
| + | echo 300 > / | ||
| + | echo 3000 > / | ||
| + | |||
| + | Die rote LED wird über led1 statt led0 angesteuert. Es gibt auch noch weitere Möglichkeiten, | ||
| + | |||
| + | Die Einstellungen halten allerdings nur bis zum nächsten Neustart. Um das Verhalten bei jedem Systemstart einzurichten, | ||
| + | |||
| + | #! /bin/bash | ||
| + | |||
| + | ### BEGIN INIT INFO | ||
| + | # Provides: | ||
| + | # Required-Start: | ||
| + | # Required-Stop: | ||
| + | # Default-Start: | ||
| + | # Default-Stop: | ||
| + | # Short-Description: | ||
| + | # Description: | ||
| + | ### END INIT INFO | ||
| + | |||
| + | case " | ||
| + | start) | ||
| + | echo " | ||
| + | echo 300 > / | ||
| + | echo 3000 > / | ||
| + | ;; | ||
| + | stop) | ||
| + | echo " | ||
| + | echo 300 > / | ||
| + | echo 300 > / | ||
| + | ;; | ||
| + | esac | ||
| + | Das Script schaltet die grüne LED in einen langsamen Blinkmodus, nachdem alle Systemkomponenten hochgefahren sind, und wechselt in einen schnellen Blinkmodus beim Herunterfahren. Hier kannst du etwas experimentieren, | ||
| + | |||
| + | Das Script muss dem Superuser gehören und ausführbar sein, was du mit folgenden Kommandos erreichst: | ||
| + | chown root:root / | ||
| + | chmod 755 / | ||
| + | |||
| + | Danach musst du das Script noch anmelden: | ||
| + | | ||
| + | |||
| + | Ein Neustart des Systems zeigt, ob du alles richtig eingerichtet hast. Zum Abmelden verwendest du statt defaults den Aufrufparameter remove. | ||
| + | |||
| + | [[https:// | ||
