Raspberry Pi : Ajouter un bouton d’extinction (avec Python)

1119_LRG

MAJ (21.03.2013) : une amélioration notable est ici

S’il manque une seule chose au Raspberry Pi, c’est un bouton d’extinction. En effet, on a pas toujours un clavier sous la main, ou un ordinateur pour lancer le fameux « sudo halt » en SSH… Parfois il nous arrive même de faire des erreurs, et le Raspberry Pi peut se retrouver bloqué, avec pour seule solution de le débrancher à chaud. Cette dernière méthode est d’ailleurs à proscrire, puisqu’elle peut totalement détruire votre système d’exploitation, voire la carte SD. Nous allons donc connecter un bouton, qui nous servira à éteindre le Pi une fois pressé (pour l’allumage, ce sera le sujet d’un autre article). De cette façon, même si le Pi est planté, on devrait toujours pouvoir l’éteindre proprement.

Prérequis

Nous aurons besoin pour ce guide :

  • d’un Raspberry Pi (la préparation grâce au mini-guide ~4 est idéale)
  • d’une platine d’expérimentation (un petit modèle suffira),
  • d’un bouton de type micro-switch,
  • de deux fils Dupont male-femelle,
  • du guide ~5 : Ajouter un bouton matériel (avec Python) pour le câblage et les explications techniques

Explication

Le code du bouton sera un peu amélioré par rapport à l’exemple du guide. En effet, nous allons utiliser une autre technique, appelée threaded callback, qui permettra à notre script de faire autre chose pendant qu’il attend un appui sur le bouton. En clair, le threaded callback peut par exemple permettre de gérer plusieurs boutons avec un seul et même script !

Le code

En admettant qu’on désire que notre script se trouve dans le dossier /home/pi/, lancer la commande sudo nano /home/pi/bouton_extinction.py. Cela créera le fichier et l’ouvrira pour l’édition.

Coller ce code dans le fichier qu’on vient de créer :

#!/usr/bin/env python2.7

# on importe les modules necessaires
import time
import os
import RPi.GPIO as GPIO

# on met RPi.GPIO en mode notation BCM (numero des pins)
GPIO.setmode(GPIO.BCM)

# on initialise le GPIO 23 en mode ecoute
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# on definit notre fonction qui sera appelee quand on appuiera sur le bouton
def extinction(channel):
     # on affiche un petit message pour confirmer
     print("Appui détecté sur le GPIO 23")
     # on reinitialise les GPIO
     GPIO.cleanup()
     # on lance la commande d extinction
     os.system('sudo halt')

# on met le bouton en ecoute
GPIO.add_event_detect(23, GPIO.FALLING, callback=extinction)

# on lance une boucle infinie, pour garder le script actif
while 1:
     # une petite pause entre chaque boucle, afin de réduire la charge sur le CPU
     time.sleep(0.02)

# on reinitialise les ports GPIO en sortie de script
GPIO.cleanup()

CTRL+O puis ENTREE pour sauvegarder, CTRL+X pour quitter

Il suffit maintenant de lancer notre script au démarrage du Raspberry Pi, et on aura terminé !

  • Rendre le script exécutable avec la commande sudo chmod +x /home/pi/bouton_extinction.py
  • ouvrir le script de démarrage automatique avec la commande sudo nano /etc/rc.local
  • juste avant la ligne # Print the IP address, insérer la commande suivante : sudo python /home/pi/bouton_extinction.py

A l’avenir, si vous devez lancer des commandes au démarrage, veillez à les lancer après le script bouton_extinction.py. De cette façon, le bouton devrait fonctionner quoi qu’il arrive (a part en cas de gros problème de démarrage, mais dans ce cas, le bouton ne sera pas une priorité).

Nous avons terminé avec ce tutoriel, et vous avez maintenant un bouton matériel pour éteindre votre Raspberry Pi… Félicitations !

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

5 thoughts on “Raspberry Pi : Ajouter un bouton d’extinction (avec Python)

  1. 20/07/2013 at 21 h 12 min

    Salut Stouf,

    Perso j’utilise une autre méthode un peu plus simple (donc pas forcément adaptée pour d’autres fonctions de boutons) :
    – J’utilise la fonction « wait_for_edge » qui met le script en pause tant qu’un changement d’état du GPIO n’intervient pas.

    #!/usr/bin/env python2.7
    
    # on importe les modules necessaires
    import os
    import RPi.GPIO as GPIO
    
    # on met RPi.GPIO en mode notation BCM (numéro des pins)
    GPIO.setmode(GPIO.BCM)
    
    # on met le GPIO 23 à UP pour eviter tout signal faux au demarrage
    GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def attente_extinction():
    	print "Attente du signal extinxtion"
    	# on met le bouton en attente d'appui et donc de passage du GPIO sur Down
    	# le programme est en pause tant qu'il n'y a pas d'appui sur le bouton - pas de charge CPU
    	GPIO.wait_for_edge(23, GPIO.FALLING)
    	# lorsque le GPIO passe sur down - appui - on stoppe la machine
    	print "** Signal extinction - la machine va stoppper **"
    	os.system('sudo halt')
    		
    attente_extinction() 
    
    GPIO.cleanup()
  2. 02/03/2014 at 14 h 37 min

    Bonjour et merci pour tes tutoriels qui m’ont permis de rajouter 2 boutons (extinction « propre » et Reset/On) sur le boitier de mon Raspberry.
    Cordialement

    1. Captain Stouf
      02/03/2014 at 16 h 03 min

      Bonjour et merci,
      je vais rajouter un guide d’ici peu afin d’apporter une amélioration notable du fonctionnement des boutons, stay tuned 😉

  3. Djeremaille
    15/02/2015 at 23 h 04 min

    Bonjour, jai un petit soucis.
    Ca fonctionne parfaitement pour moi sur Xbian, Volumio…
    Mais sous Retropie il m’exécute le script au premier plan et ne continue pas le démarrage, il attend que j’appuie sur le bouton…

    1. Captain Stouf
      02/03/2015 at 16 h 56 min

      Bonjour,
      Dans rc.local, tu peux essayer de rajouter  » & » à la fin de la ligne qui appelle le script du bouton…

Laisser un commentaire