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.
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Ω.
- Mettre à jour la distribution
apt-get update && apt-get upgrade -y
- Installer les paquets nécessaires
apt-get install -y python python-rpi.gpio
- 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)
- 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
- Changer les droits du script
chmod 755 /etc/init.d/shutdownBtn
- 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 !