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

  • 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
    1. sudo apt-get update


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


    Code
    1. sudo apt-get install python-dev
    2. 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
    1. sudo apt-get install python-pip
    2. sudo pip install rpi.gpio



    II. Software


    Um das Script im Home-Verzeichnis zu erstellen, wird zuerst der Editor 'nano' aufgerufen:


    Code
    1. 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
    1. sudo chmod +x /home/pi/shutdown.py


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


    Code
    1. sudo nano /etc/rc.local


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


    Code
    1. sudo python /home/pi/shutdown.py &
    2. 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
    1. GPIO.setmode(GPIO.BOARD)


    gegen


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



    [IMG:http://s14.directupload.net/images/140127/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:


    [IMG:http://s1.directupload.net/images/140124/temp/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:


    [IMG:http://s14.directupload.net/images/140124/temp/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:


    [IMG:http://s14.directupload.net/images/140124/temp/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 ()

  • 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 ()

  • 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/pro…ALYLtastend-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 Modell B, 1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC

  • 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 ;)


    [hr]


    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/pro…ALYLtastend-1-St?ref=list

    Viele Grüße
    DocAdams

    1x RaspberryPi Modell B, 1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC

  • 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
    1. GPIO.setmode(GPIO.BOARD)

    Viele Grüße
    DocAdams

    1x RaspberryPi Modell B, 1x RaspberryPi 2, 1x RaspberryPi 3, 1x OpenELEC

  • 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 ()

  • 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/use…000/media/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 ()

  • 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 Holzi ()