Hoch- und runterfahren mittels Taster (incl. Status-LED)

L I V E Stammtisch ab 20:30 Uhr im Chat
  • 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:

    Code
    sudo apt-get update

    Danach kann dann alles installiert werden, was man zum ansteuern der GPIO Ports via Python braucht:

    Code
    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:

    Code
    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 'nano' aufgerufen:

    Code
    sudo nano /home/pi/shutdown.py

    Dabei wird gleichzeitig festgelegt, dass das Script später einmal 'shutdown.py' heißen wird. In das Editorfenster muss dann folgendes Script kopiert werden:

    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:

    Code
    sudo chmod +x /home/pi/shutdown.py

    Damit das Script auch automatisch im Hintergrund startet, wird es in die rc.local eingetragen:

    Code
    sudo nano /etc/rc.local

    Der Aufruf muss vor der Zeile exit 0 stehen. Am Ende sollte es dann so aussehen:

    Code
    sudo python /home/pi/shutdown.py &
    
    
    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

    Code
    GPIO.setmode(GPIO.BOARD)

    gegen

    Code
    GPIO.setmode(GPIO.BCM)

    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:


    y8pthj2w.jpg


    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:

    etj8r8ok.jpg

    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) :lol:

    cd8je63c.jpg

    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:

    jexzlsde.jpg


    Getestet unter Raspbian Wheezy und Raspbmc. Für Hinweise auf Fehler oder konstruktive Kritik bin ich dankbar und offen :)

    Einmal editiert, zuletzt von Kernkrank (20. September 2014 um 12:23)

  • Hoch- und runterfahren mittels Taster (incl. Status-LED)? Schau mal ob du hier fündig wirst!

  • genau das selbe Projekt habe ich heute selbst gemacht :D
    hatte mir auch schon alle Bauteile bei mir in der Schule besorgt, nur leider den Falschen Widerstand .
    Hatte ich allerdings gerade erst nach dem Verlöten bemerkt :wallbash:


    Allerdings hab ich das ein wenig anders vor und zwar soll meiner mit einem zweiten Taster hochfahren.
    Ich hab selber ein Tutorial dazu gemacht. Aber du warst halt schneller


    Edit:

    Hier mal mein Tutorial

    Einmal editiert, zuletzt von swoopo (3. Dezember 2013 um 17:58)

  • SUPER!

    genau das habe ich vor einer halbe Stunde begonnen, im Kopf zu durchdenken, um meinen RasPi-DLNA-MediaClient sauber ein/ausschalten zu können...

    Ich werde den Taster ans Gehäuse bringen (Loch bohren und so)... mal sehen, ob man da einen kleinen Taster mit eingebauter LED kriegt, dann wäre das perfekt :)

    Sowas hier z.B.: http://www.conrad.de/ce/de/product/…d-1-St?ref=list

    DANKE !!

    Mfg,
    die Zentris

  • Bist du sicher das deine Anleitung genau so funktioniert wie es Kernkrank beschrieben hat?

    So wie ich das nämlich sehe verwendest du andere Pins - du benutzt die P5 und P6 Sockel... Warum eigentlich P5 und nicht P1?
    Über P6 kann man nur einen Hard-Reset durchführen, kein Power-On. Das sind eigentlich 2 grundlegend verschiedene Dinge


    Aber Kernkrank nutzt ausschlieslich P1 und der von ihm beschriebene Weg für "nach shutdown wieder starten" funktioniert (anscheint) ausschlieslich mit GPIO-3 (pin 5) und bedarf keines Scripts (wenn der RPI herunter gefahren wurde kann auch kein Script mehr laufen da alles beendet wurde)


    Das sollte man also eigentlich klar auseinander halten das die beiden Anleitungen eigentlich nichts miteinander zu tun haben - Anleitungen für ein Shutdown über Taster und den P6 Reset der RaspberryPI-rev2 gibts hier soweit ich weiss auch schon - aber Kernkrank's Anleitung ist bisher einmalig ;)

  • Bist du sicher das deine Anleitung genau so funktioniert wie es Kernkrank beschrieben hat?

    Ja also ich kann herunterfahren und wieder starten


    So wie ich das nämlich sehe verwendest du andere Pins - du benutzt die P5 und P6 Sockel... Warum eigentlich P5 und nicht P1?

    P5 hab ich benutzt, weil ich mir dachte dann kann ich P1 noch für andere Sachen benutzen. P1 kann man aber auch benutzen.


    Über P6 kann man nur einen Hard-Reset durchführen, kein Power-On. Das sind eigentlich 2 grundlegend verschiedene Dinge

    Das stimmt nicht ganz. P6 ist dafür da im laufenden Betrieb einen Hard-Reset durchzuführen.
    Aber ist der Pi aus, also es leuchtet nur noch die Strom anzeige, dann kann man mittels P6 den Pi wieder starten


    Aber Kernkrank nutzt ausschlieslich P1 und der von ihm beschriebene Weg für "nach shutdown wieder starten" funktioniert (anscheint) ausschlieslich mit GPIO-3 (pin 5) und bedarf keines Scripts (wenn der RPI herunter gefahren wurde kann auch kein Script mehr laufen da alles beendet wurde)

    P6 braucht auch bei mir kein Script zum starten, Das script wird nur zum herunterfahren benötigt


  • Das stimmt nicht ganz. P6 ist dafür da im laufenden Betrieb einen Hard-Reset durchzuführen.
    Aber ist der Pi aus, also es leuchtet nur noch die Strom anzeige, dann kann man mittels P6 den Pi wieder starten

    P6 ist kein Power-On.
    P6 ist es egal ob der PI herunter gefahren wurde - es ist ein Hard-Reset, egal ob gerade eine Software läuft oder nicht
    Das ist also in deiner PDF falsch dargestellt

    Und das bedeutet dass deine "Lösung" etwas anderes bewirkt als die hier von Kernkrank beschreibene

  • Hallo,
    ich möchte gern den Schalter nachbauen. Allerdings hängt bei mir an GPIO4 (Pin7) die Datenleitung der 1-wire-Temperaturfühler. Das geht wohl nur dort.

    Kann ich also statt Pin7 auch z.B. Pin3, also GPIO 2, nehmen? Und muss nur im Script die 7 ausgetauscht werden?
    Muss ich noch was unternehmen, dass z.B. Pin5 und nicht GPIO4 angesprochen wird, oder wird die Zählweise automatisch erkannt?
    Noch eine letzte Frage zu dem Schalter mit LED. Ich habe mir 2 Stück bestellt (sie haben es gerade noch in die Weihnachtsbestellung geschafft ;) ), ich habe sie also noch nicht. Ist da bereits der Vorwiderstand mit eingebaut, oder muss der noch angeschlossen werden?

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Der von Kernkrank beschriebene Weg funktioniert nur mit diesem einen Pin - das hab ich ja bereits swoopo versucht klar zu machen


    Der von Kernkrank beschriebene Weg über GPIO-3 startet den RaspberryPI neu nachdem er herunter gefahren wurde, ohne ihn zu resetten - er muss also erst über den Shutdown Knopf herunter gefahren werden und kann erst dann über den anderen Taster neu gestartet werden

    Der von swoopo beschriebene Weg resettet den RPI, auch nachdem er herunter gefahren wurde - er kann also auch im laufenden Betrieb neu gestartet werden aber das könnte auch das Dateisystem beschädigen


    Für welchen der beiden Wege man sich entscheidet ist aber relativ egal -- solange man weiss was man da macht ;)


    Ich weiss nicht genau was für einen "Schalter mit LED" du bestellt hast also bleibt mir dazu nur zu sagen: Das kommt auf dein Schalter an ob dort bereits ein Vorwiderstand verbaut ist oder ob das bei der jeweiligen Farbe überhaupt notwenig wäre..

  • Na ich würde schon lieber Kernkranks Weg gehen. Aber an Pin7 hängt bereits der Input der 1wire-Temperatursensoren dran. Und wie gesagt, befürchte ich da, dass der LED-Strom was bewirkt, was ich nicht will.

    Wenn ich nun einfach die LED weg lasse, aber das Script so übernehme, würde ja doch der Pin7 angesprochen. Aber das dürfte eigentlich keine bleibenden Auswirkungen auf Sensor oder gar RasPi haben, oder? Als Anfänger bin ich da misstrauisch ;)

    Ich meinte den oben verlinkten Taster: http://www.conrad.de/ce/de/product/…d-1-St?ref=list

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Achso sorry das hab ich falsch verstanden :blush:


    Bei Kernkrank's Weg ist der unablässig wichtige Pin: GPIO-3 (pin #5)

    Also hier noch mal die GPIO-Ports und wofür sie genutzt werden:

    • pin#1: 3V3 -> Stromversorgung
    • pin#5: GPIO-3 -> Taster
    • pin#6: GND -> Masse
    • pin#7: GPIO-4 -> LED

    Wenn du die LED an einen anderen GPIO Port anschliesen möchtest kannst du das natürlich machen, musst dann aber eben das Python Script auch anpassen ;)
    Sollte kein Problem sein die jeweiligen Zeilen für die LED zu ändern oder gar ganz aus dem Script zu löschen, das hat keine Auswirkungen auf den Rest

  • Hey,
    habe den Taster von Conrad nun auch nach dieser Anleitung eingerichtet und an mein Gehäuse angebracht. Fotos kann ich, falls jemand möchte, nachreichen.
    Soviel ich weiß (und aus dem Datenblatt erlesen kann) ist der Vorwiderstand noch nicht mit drin. Habe den grünen Taster und betreibe die LED mit einem 120 Ohm Vorwiderstand bei 10mA. Dann ist die LED auch nicht so hell und stört im Dunklen nicht.
    Gruß,
    crossx

  • Normalerweise steht dabei (bzw im Datenblatt / Datasheet) bis wieviel Volt die jeweilige LED verträgt - wenn da 3,3V steht und ihr sie auch an 3,3V anschliesen werdet, braucht ihr eigentlich keinen Vorwiderstand

    Es gibt vom nachfolgenden natürlich auch Ausnahmen, aber normalerweise gilt für LED's:

    Infrarot -> ca. 1,2...1,8V
    Rot -> ca. 1,6...2,2V
    Gelb -> ca. 1.9...2,5V
    Blau/UV -> ca. 3,1...3,4V
    Weiß -> ca. 3,3...3,5V
    Grün -> ca. 2,5...3,7V


    Wie die Berechnung erfolgt wird zB hier erklärt: http://www.elektronik-kompendium.de/sites/grd/1006011.htm und hier: http://www.elektronik-kompendium.de/sites/bau/0201111.htm
    Einen LED-Vorwiderstandsrechner findet ihr zB hier: http://www.elektronik-kompendium.de/sites/bau/1109111.htm Oder hier: http://www.leds.de/Widerstandsrechner/

  • Hallo,
    ich bin es noch mal. Das sind für mich so erste Gehversuche, darum sorry für die vielleicht zu einfache Frage.
    Eigentlich habe ich alles genau so gemacht, hardwaremäßig und im Skript habe ich nur die 7 gegen die 3 getauscht und natürlich auch so verbunden.
    Aber es passiert nichts.
    In der /sys/class/gpio/Export steht nichts drin. Müsste da nicht eine 3 oder 5 stehen?
    Und gpio readall zeigt das:

    Als wenn das Skript nicht abgearbeitet wird.
    Natürlich hatte ich vorher den RasPi gestartet. shutdown.py heißt korrekt, liegt in /home/pi/ und ist ausführbar.
    Könnte evtl. das mit etwas bei mir in Konflikt stehen:

    Code
    GPIO.setmode(GPIO.BOARD)

    Viele Grüße
    DocAdams

    1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC, 1x RaspberryPi 4 mit ioBroker ,

  • Ich habe nun auch das ganze mal aufgebaut und das Skript kopiert. Nachdem alles erledigt war, habe ich den Pi rebootet um das Skript zu laden. Nach dem Neustart leuchtete die LED aber nicht und der Schalter ging auch nicht, ich habe es mehrmals probiert.
    Nun habe ich mich wieder per SSH am Pi eingeloggt und mal versucht, das Skript manuell zu starten, aber das bricht er mit einer Fehlermeldung ab und verweißt mich auf diese Seite. Allerdings werde ich daraus nicht richtig schlau. Ich habe mal am Anfang der Datei ein #! /usr/bin/python eingefügt, aber das hat nichts gebracht. Ich habe auch noch ein wenig gegoogelt, aber da gibt es auch nur den Hinweis mit der Codierung, woraus ich nicht schlau werde.
    Hat jemand eine Idee? Ich mache gerade meine ersten Schritte mit den GPIOs und Python und würde mich über Hilfe freuen.
    Das Skript entspricht 1:1 dem Original vom 1. Post, auch die Rechte + rc.local habe ich nochmals überprüft. Alle Pakete sind auf dem neusten Stand. Auch python-dev und python-rpi.gpio ist installiert.
    Im Anhang die besagte Fehlermeldung.

  • Womit oder Wie hast du das Script denn auf dein RaspberryPI gespielt? Das sieht für mich so aus als hättest du es erst unter Windows erstellt und anschliesend die Datei auf den RPI kopiert :huh:
    Die Zeilenumbrüche von Windows versteht Linux aber nicht... Deshalb entweder unter Windows einen Linux-kompatiblen Editor wie zB notepad++ , Proton oder UltraEdit benutzen ; oder über PuTTY nano öffnen und dann via SHIFT+EINFG oder rechte Maustaste den Text/Code dort einfügen

    Nach dem erstellen des Scripts am besten manuell ausführen um zu prüfen ob alles i.O. ist: python /path/to/script.py

  • Ich habe nun mehrmals das Skript versucht, mit Putty und Copy&Paste einzufügen.
    Nach dem 4. Mal hat es dann geklappt :)
    Davor habe ich das Skript, wie du vermutet hattest, mit Notepad geschrieben und per FTP auf den Pi gebracht.
    Irgendwas muss das schief gelaufen sein, auf jeden Fall hat es dann geklappt.
    Vielen Dank für deine Hilfe. Ohne dich würde ich jetzt immer noch rumprobieren.
    Bilder vom Versuchsaufbau mache ich später, aufgebaut ist alles auf einem Steckbrett und verbunden ist alles mit Jumperkabeln.
    Jetzt kann ich den Netzwerkspeicher ohne das lästige einloggen über SSH abends ausschalten (Nachts würde das Geräusch der Festplatte doch ein wenig stören, ich schlafe auch in dem selben Raum, und Nachts benutzt kein Mensch unsere Samba-Freigabe).
    Nochmals vielen Dank meigrafd für die Hilfe und Kernkrank für dieses tolle Tutorial.

    Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
    Albert Einstein

  • Eine Frage zu dem ganzen, könnte der Taster auch ein anderer PI sein? Also das ich einen PI Habe mit einem Webinterface über den man die anderen PIs an und aus machen kann? Dazu müsste man ja dann nur die GPIOs als Taster benutzen, sprich Strom oder kein Strom, oder liege ich da falsch? Würde es dann reichen jeden PI nur mit einem Kabel mit dem Steuer PI zu verbinden, oder muss GND auch mit dem Steuer PI verbunden sein?

    Einmal editiert, zuletzt von baeckerman83 (1. Januar 2014 um 15:35)

  • Hallo zusammen (von einem Anfänger)

    Diese Schaltung hat für mich auch einmal super funktioniert, bis zum Jahreswechsel :wallbash:

    Shutdown habe ich von http://www.gtkdb.de/index_36_2238.html übernommen.
    Einschalten allerdings besser mit http://s53.photobucket.com/user/redhawk_0…pi_psu.jpg.html, jedoch ohne "S2"

    Bedienung mittels den Tipps hier aus dem Forum über Infrarot auch ohne Probleme.

    Nun zum Problem:

    Seit dem Dezember Update von Raspbmc funktioniert mein Shutdownbotton.py überhaupt nicht mehr.
    Vorgehensweise der Install mit wiringPi/make/./build und den notwendigen Packs genau so am neuen System vollzogen....mehrmals....werde wahnsinnig noch :angel:

    Die Hardware steht immer am gleichen Platz, alles super gelötet über Steckverbindungen - nichts geändert - hatte super funktioniert.

    Beim "gpio readall" ändert sich der Status Low/High nicht - ging früher prächtig.

    Kann es sein, dass durch Änderungen am FileSystem (f2fs) ich neuerdings keine Zugriffsrechte mehr bekomme oder z.B.*sudo vi /usr/local/bin/shutdownbotton.py* in einem anderen Ordner abgelegt werden muss?
    Die Frage würde sich dann natürlich auch für *rc.local* stellen.

    Wäre echt dankbar für Eure Hilfestellung - bin ja nur Windoof :D

    ...oder ist der Port im Eimer?


    Gruß
    doldi

    Edit 03.01.14 : So eben das neuere 2013-12-20-wheezy-raspbian.img aufgesetzt und hier funktioniert sofort alles ohne Probleme - auf Anhieb!
    Muss also doch an dem zickigen Raspbmc liegen.

    Einmal editiert, zuletzt von doldi (3. Januar 2014 um 15:34)

  • Ich habe auch vor, meinenm PI eine Ein- und zusätzlich eine Aus- Led zu verpassen.
    Ein = grün
    Aus = rot
    An welche Kontakte müsste ich dafür ran und wie müsste ich die Schaltung aufbauen?
    danke

    Einmal editiert, zuletzt von WhiteDew9520 (3. Januar 2014 um 23:52)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!