Ce que l'on va faire
L'un des gros problèmes pour moi avec le Raspberry Pi est qu'il n'est pas possible d'éteindre l'ordinateur sans enlever le cable d'alimentation (ou en tapant une commande dans le terminal ou par le menu de raspbian). Non je parle du bon vrai bouton des famille qui permet de faire un hard reset. Bref Il manque un bouton marche/arrêt comme tout autre appareil électronique digne de ce nom.
Comme vous le savez déjà... ou pas, éteindre le Raspberry Pi "à chaud", en tirant comme un bourrin le cable d'alimentation n'est pas franchement conseillé, car si la méthode est efficace héhé 🙂 celle-ci peut tout simplement corrompre les fichiers système qui sont sur la carte SD. Car en principe un certain nombres de procédures essentielles se déroules lorsqu'on éteind une machine. C'est pourquoi il est intérressant de protéger son raspberry avec un onduleur, pour éviter toute coupure du courant.
Cablage
Pour assembler le bouton, et avant de mettre de l'étain de partout je vous conseille d'utiliser une table de prototypage 🙂 . Dans l'image ci-dessous vous pouvez voir le schéma de câblage, comme vous le verrez j'ai utilisé la broche de sortie 3, une broche V (le +) et une broche GND (le -), ainsi que la broche GPIO nº4 (BCM). Lorsqu'on appuie sur le bouton celui-ci génére un court-circuit entre la broche 3. V et GND il faut donc ajouter une résistant (330 Ohms) pour éviter de tout cramer.
Script Python
Une fois que les exercices pratiques sont terminés on va faire maintenant un peu de programmation. Une fois que le cablage est terminé et que vous avez tout bien vérifié ;), nous allons créer une petit script Python tout mignon qui va en fait simplement détecter la pression du bouton. Il lancera alors d'arrêt ou de redémarrage de notre Raspberry Pi.
Ce serait le code de notre script d'arrêt. Dans la ligne 11 vous pouvez voir "sudo halt" qui est la commande pour éteindre le Rasp, vous pouvez le changer pour "sudo reboot" ou toute autre commande que vous voulez exécuter quand le bouton est appuyé.
On va donc créer le fichier, pour cela taper la commande ci-dessous :
cd ~/
Puis
nano boutonStart.py
Copier / Coller ensuite le code ci-dessous (CTRL + SHIFT + V)
import os import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(4,GPIO.IN) prev_input = 0 while True: input = GPIO.input(4) if ((not prev_input) and input): os.system(sudo halt) prev_input = input #Une petite pause time.sleep(0.05)
Enregistrez en faisant CTRL + X et Yes
Pour démarrer le script, il suffit ensuite de taper dans le terminal:
sudo python boutonStart.py
Automatisation
Le problème avec ce système est que nous devrons démarrer manuellement le script à partir de la console à chaque fois que nous démarrons le Raspberry pour que le processus soit "Actif". Et ce n'est pas ce que vous souhaitez j'immagine, vous voulez un truc automatique vous ? Hein ?
On ouvre alors le terminal et on écrit:
sudo vi /etc/rc.local
Una vez abierto escribimos "sudo python shutdown.
sudo python boutonStart.py exit 0
Nous pouvons maintenant redémarrer ou arrêter notre Raspberry Pi sans aucun problème car la prochaine fois qu'il démarrera, le script démarrera automatiquement avec la carte.
/!\ Une petite update : Le script ci-dessus consomme pas mal de CPU, voici une version plus "légère"
from subprocess import call import RPi.GPIO as gpio def loop(): raw_input() def shutdown(pin): call('halt', shell=False) gpio.setmode(gpio.BOARD) gpio.setup(4, gpio.IN) gpio.add_event_detect(4, gpio.RISING, callback=shutdown, bouncetime=200) loop()
N'hésitez pas à laisser un commentaire si vous rencontrez un problème où si pour me dire que ça fonctionne 🙂