Arrêter le Raspberry Pi avec un bouton


Achtung : Dieser Artikel wurde automatisch von Google Translate übersetzt


Advertencia : Este artículo ha sido traducido automáticamente por Google Translate

Si vous avez un Raspberry dans un coin, difficile d’accès et encore plus pour y brancher un écran, vous devez pouvoir l’arrêter proprement sans risque d’endommager le système de fichier. Voici une petite solution simple et peu couteuse.

Arrêter le Raspberry Pi avec un bouton

Le bouton est un composant simple et peu cher. Du coup il est vraiment facile à mettre en place et à lier à votre Raspberry.

Le montage en place, il faut passer à la partie logiciel. J’ai choisi le Python car c’est simple, les GPIO sont bien gérés et je n’en ai jamais fait donc c’est la bonne occasion ! 🙂

Avec le bouton, j’ai choisi d’ajouter une LED pour indiquer quand le script est prêt. Dans le processus de démarrage, j’ai choisi de lancer le script en dernier grâce aux tags LSB. La LED s’allumera donc quand tous les scripts seront démarrés.

Vous pouvez désactiver le script qui tourne en arrière plan en arrêtant le service de manière classique. La LED sera alors éteinte.

Voici donc le montage avec un bouton, une LED et une résistance 220Ω.

Arrêter le Raspberry Pi avec un bouton

  1. Mettre à jour la distribution
     apt-get update && apt-get upgrade -y
  2. Installer les paquets nécessaires
     apt-get install -y python python-rpi.gpio
  3. Créer le script Python qui va être utilisé lors de la séquence de boot. Je l’ai appelé /etc/init.d/shutdownBtn.py
    #!/usr/bin/env python2.7
    # -*- coding: utf-8 -*-
    import RPi.GPIO as GPIO
    import time as time
    import os
    import signal
    # Define mode to access GPIO pins
    GPIO.setmode(GPIO.BCM)
    GPIO.cleanup()
    # pin id for the shutdown button
    GPIO_shutdown=23
    # pin id for the LED status
    GPIO_led=17
    # GPIO_shutdown will be an input pin
    GPIO.setup(GPIO_shutdown, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    # GPIO_led will be an output pin
    GPIO.setup(GPIO_led, GPIO.OUT)
    # Handler to stop the process
    def signal_handler(signal, frame):
        # Turn off the status LED
        GPIO.output(GPIO_led, False)
        GPIO.cleanup()
        exit(0)
    # Define what to do when the shutdown button is pressed
    def funcShutdown(channel):
        start_time = time.time()
        intSeconds = 0
        # How long to wait for the button
        maxWaitPushButton = 2
        while intSeconds < maxWaitPushButton and GPIO.input(channel) == GPIO.LOW :
             intSeconds = time.time() - start_time
             time.sleep(0.1)
        if intSeconds >= maxWaitPushButton:
            # Turn off the status LED
            GPIO.output(GPIO_led, False)
            GPIO.cleanup()
            os.system('sudo halt')
            #exit()  
    # Add a signal handler for the SIGTERM signal
    signal.signal(signal.SIGTERM, signal_handler)
    # Wait for the shutdown button to be pressed
    GPIO.add_event_detect(GPIO_shutdown, GPIO.FALLING, callback=funcShutdown, bouncetime=300) 
    # Light up the status LED
    GPIO.output(GPIO_led, True)
    # Loop
    while 1:
        time.sleep(0.2)
  4. Créer le script qui va être utilisé lors de la séquence de boot. Je l’ai appelé /etc/init.d/shutdownBtn. Attention aux paramètres LSB (plus d’informations ici). J’ai choisi de démarrer ce script en dernier, une fois que le système est prêt.
    #!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          shutdownBtn
    # Required-Start:    $all
    # Required-Stop:    
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Script to add the capability to shutdown the Raspberry Pi with a button
    # Description:       Script to add the capability to shutdown the Raspberry Pi with a button
    ### END INIT INFO
    case "$1" in
        start)
    	/usr/bin/python /etc/init.d/shutdownBtn.py &
    	echo $! > /tmp/.shutdownBtn-pid
            ;;
        stop)
    	kill `cat /tmp/.shutdownBtn-pid`
            ;;
        reload|restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Usage: $0 start|stop|restart|reload"
            exit 1
    esac
    exit 0
  5. Changer les droits du script
    chmod 755 /etc/init.d/shutdownBtn
  6. Ajouter le script dans la séquence de démarrage
     insserv shutdownBtn

Vous voilà prêt. Soit vous redémarrez votre machine soit vous lancez le service manuellement. Appuyez au moins 2 secondes pour éteindre votre précieux !

Vous aimerez aussi...

  • Halukard

    Sur le mien j’ai utilisé cette méthode : http://korben.info/bouton-reset-raspberry-pi.html

    Ça fonctionne très bien sans passer par les port GPIO

    • Salut. De ce que j’avais compris ça fait un reset et non un arrêt. Et de manière assez brutale. Ici c’est un soft shutdown qui est fait. A choisir en fonction de ses besoins

  • Bonjour,
    Cela correspond exactement à ce que je cherche, par contre le schémas est un peu obscur pour moi (désolé mais mon envie de bien faire est largement supérieur à mes capacité en électronique….)

    Pourrais tu clarifier les branchement au niveau du bouton et de la led. J’ai bien compris que les fils passaient derrière la plaque d’essais (en vert à priori) mais du coup j’ai un doute sur le circuit. Les fils qui passent derrière en vert semblent aller plus loin que les composants…

    Désoler pour ces questions de néophytes…. 😉

    Jef

    Merci d’avance

  • Bon, c’est un peu la honte, je viens en fait de m’apercevoir que je raconte n’importe quoi (pour changer), en effet je n’avais pas fait attention au type de plaque d’essai figurant dans l’exemple, oublie ma com. précédente, j’ai pigé !

  • Deimon6659

    Bonjour, je souhaitais savoir s’il fallait crée le script sur le Raspberry où s’il était possible de le crée sur un pc et de le déplacer ensuite sur le Raspberry.
    Car sous Ubuntu il me dit que je n’ai pas les droits pour crée le fichier avec le titre que vous avez donner et sous windows il veut pas de titre avec des » \ » donc merci de m’indiquer comment faire 🙂
    Merci encore pour ce tuto

    • Bonjour,
      Il faut être root pour écrire dans ce répertoire. Ca doit venir de ça … Faites un sudo devant la commande de création. Il n’y pas de contrainte sur le nom. Si ca ne fonctionne pas, mettez le message d’erreur.

      • Deimon6659

        J’ai finalement appeler le script « shutdownBtn.py » , puis je ensuite le déplacer à l’endroit voulu et le renommer où il est plus sur de crée directement à l’endroit souhaiter.
        Est il plus sûr de faire ses manipulations directement sur le Raspberry ou depuis un ordinateur sous ubuntu c’est viable.
        Par contre je n’ai pas compris la suite, c’est à dire a partir de 4.
        il faut refaire un script ? si oui en quel format (python ?) et le nom est identique au 1er script, leur nom indique bien l’emplacement où il doit être situer après la création ?

        • Le nom du script de l’étape 3 est : /etc/init.d/shutdownBtn.py. Donc il s’appelle shutdownBtn.py dans le répertoire /etc/init.d. Extension py car c’est du python
          Le nom du script de l’étape 4 est : /etc/init.d/shutdownBtn. Donc il s’appelle shutdownBtn dans le répertoire /etc/init.d. Sans extension car c’est un script (on aurait pu mettre .sh mais ce n’est pas le standard dans ce répertoire)

          Tout peut se faire sur le Raspberry, c’est plus simple et rapide.

          • Deimon6659

            sur raspberry, il faut installer une logiciel pour faire ses scripts, si oui lequel, sinon le faire avec le bloc note de base suffit t’il ?

          • Un éditeur de texte suffit.

          • Deimon6659

            J’ai réussi a crée les 2 fichiers, malheureusement pas directement sur la raspberry, je l’ai fait sur mon pc sous Ubuntu avec le logiciel Spyder pour le python, je l’ai ensuite envoyer sur la carte via FileZilla et j’ai déplacer du bureau au dossier final via un invité de commande en mode administrateur. Cela fonctionne donc je suis heureux. Merci encore et bonne continuation

  • tef

    Bonjour,
    Le GPIO.cleanup() en ligne 9 me cause une erreur :
    Runtimewarning: no channels have been set up yet - nothing to clean up ! Try cleaning up at the end of your program instead !

    Je vais le commenter pour voir ce qui se passe 😉

  • tef

    Je pense qu’il est en trop. Ça marche maintenant 🙂

  • tef

    Bonjour,
    Avec la dernière version de raspbian (16 février), je n’arrive plus à faire fonctionner le script. Quand j’appuie sur le bouton j’ai l’erreur suivante :

    Message from syslogd@rdam at Mar 14 15:05:45 …
    kernel:[ 94.144452] Disabling IRQ #50

    Une idée pour résoudre le problème ?

    • Salut
      Tu n’as pas ajouté de périphériques USB par hasard ? Il semble que ce puisse déclencher ce genre d’erreur. Une solution serait de passer par un Hub USB alimenté

  • Haplo

    Merci pour le tuto, ça marche bien.

    Sous raspbmc j’ai juste eu besoin d’utiliser une solution alternative pour installer python-rpi.gpio qui n’est pas trouvé par apt-get.

    Sinon est-ce qu’il y a une solution pour démarrer avec les GPIO ? C’est faisable ? J’ai cherché en vain sur le web.

    • Salut. Je crois que tu peux alimenter par le gpio 5v mais ce n’est pas recommandé car tu contournes la protection avec le fusible

      • Haplo

        OK merci pour l’info

  • tomtomtom850 .

    Quand sa dit systéme halted ca veut dire que c’est bon on peut le debrancher ???????

    Merci de la reponçe

  • Poulet

    Bonjour, Est-ce que cela fonctionne avec un raspberry pi 3 ?

    • Bonjou . Je n’ai pas testé mais aucune raison que ça ne soit pas le cas vu que les GPIO sont les memes

      • Poulet

        Super merci 😉

Handpicked links

Mise en cache objet de 2109/2299 objets utilisant disk Mise en cache utilisant disk: enhanced Mise en cache de base de données 11/60 requêtes dans 0.031 secondes utilisant disk Served from: pihomeserver.fr @ 2017-10-03 02:18:57 by W3 Total Cache -->