Aller au contenu

Bouton physique “shutdown”

Objectif

Créer un bouton physique permettant d’éteindre proprement le Raspberry Pi

➡️ Si on débranche directement l’alimentation :

  • risque de corruption de la carte SD
  • perte de données
  • système instable

Compatibilité

Cette doc fonctionne sur Raspberry Pi 2 Model B avec un système Linux (Raspberry Pi OS, Debian, Ubuntu, Fedora..)

Le script utilise la commande shutdown disponible uniquement sur Linux

La méthode système (gpio-shutdown) peut fonctionner selon la configuration mais peut être interceptée par une interface graphique.

Note

Ce montage est réalisé sur un Raspberry Pi 2 Model B, mais fonctionne normalement sur la plupart des autres modèles (Raspberry Pi 3, 4, Zero…).

Les GPIO étant standardisés le principe reste le même. Seule la disposition physique des pins peut varier légèrement selon le modèle.

Matériel nécessaire

Pour réaliser ce montage, il faut :

  • un Raspberry Pi 2 Model B
  • un bouton poussoir
  • 2 fils jumper (Dupont)

Les fils (important)

Les fils utilisés sont appelés fils jumper (ou Dupont).

➡️ Ce sont des câbles avec des embouts adaptés aux pins du Raspberry Pi


Types de fils

Il existe plusieurs types :

  • mâle → mâle (le plus courant)
  • mâle → femelle
  • femelle → femelle

➡️ Pour ce projet le plus simple est d’utiliser :

  • 2 fils mâle → mâle

Pourquoi ces fils ?

Ils permettent de :

  • connecter facilement le bouton aux GPIO
  • éviter de souder
  • brancher / débrancher rapidement

Tip

Les fils jumper permettent de tester facilement sans soudure.


Comment brancher

🪢Chaque fil relie :

  • un côté du bouton
  • une pin du Raspberry Pi

➡️ Exemple :

  • fil 1 → GPIO17 (pin 11)
  • fil 2 → GND (pin 6)

Warning

Vérifiez le schéma des pins de votre modèle de Raspberry Pi avant de brancher.

Étape 0 : branchement du bouton

Brancher le bouton entre :

GPIO17 → pin physique 11

GND → pin physique 6

Schéma des pins :

(extérieur)   (intérieur)

   1               2
   3               4
   5               6 
   7               8
   9               10
   11              12

Orientation

Place le Raspberry Pi :

  • ports USB vers toi
  • pins en haut à droite

➡️ pin 1 = en haut à gauche

Test du bouton

_OUUVRE UN TERMINAL

📁Créer un fichier :

bash nano shutdown.py

copie colle ce code dans shutdown.py :

from gpiozero import Button
from signal import pause

button = Button(17, pull_up=True)

def test():
    print("BOUTON APPUYE")

button.when_pressed = test

pause()
💾 sauvegarde

CTRL + O → ENTER → CTRL + X

Execute dans le terminal :

sudo python3 shutdown.py
APPUIE SUR LE BOUTON

Si tu vois "BOUTON APPUYE" le bouton fonctionne bien

Comment fonctionne le bouton (très important)

Un bouton 4 pattes :

  • A est connecté à C

  • B est connecté à D

En réalité quand tu appuies

  • A se connecte à B
  • (et donc C à D)

➡️ Il faut donc brancher A + B (= un côté + l’autre côté)

Installation

Étape 1 : créer le script Python

_ Ouvrir un terminal

📁 Ouvre le fichier :

nano shutdown.py

Étape 2 : écrire le code

Copier et coller le code suivant :

from gpiozero import Button
from signal import pause
import os

Button(17, pull_up=True).when_pressed = lambda: os.system("shutdown now")

pause()
  1. Importe les modules nécessaires

  2. dit que le bouton est branché sur GPIO17

  3. lorsqu'on appuie sur le bouton il faut lancer shutdown now

  4. reste en attente afin de continuer à écouter le bouton

Étape 3 : sauvegarder 💾

Dans nano shutdown.py : CTRL + O → ENTER → CTRL + X

Étape 4 : lancer le script

_ Dans le terminal :

sudo python3 shutdown.py

Etape 5 : tester

appuyer sur le bouton (normalement instantané, mais si ça ne marche pas, maintenir appuyé quelques secondes)

le Raspberry Pi s’éteint proprement (NORMALEMENT😅)

Lancement automatique au démarrage

_ Ouvrir le fichier dans le terminal :

sudo nano /etc/rc.local

Copie colle ça dedans :

#!/bin/sh -e 

sudo python3 /home/<utilisateur>/shutdown.py &

exit 0
  1. Permet l'exécution dans le shell (nécessaire pour que rc.local fonctionne)

  2. Exécution du script python avec les droits admin

  3. le & lance le script en arrière-plan

  4. exit 0 : le script s'est terminé proprement

💾 Sauvegarde CTRL + O → ENTER → CTRL + X

il faut rendre le fichier exécutable :

sudo chmod +x /etc/rc.local
Redémarrer :
sudo reboot 

Success

🎉🥳🥳🥳🥳🥳Normalement, tout fonctionne !!!👏👏👏👏🥳🥳

bravo, t'es un.e machine💚

Méthodes possibles

Méthode avec un script Python

  • contrôle direct du GPIO
  • fonctionne souvent
  • nécessite un script

Méthode système (gpio-shutdown)

Configuration dans /boot/firmware/config.txt :

dtoverlay=gpio-shutdown,gpio_pin=17
- peut être interceptée par l’interface graphique

  • peut ouvrir un menu au lieu d’éteindre directement

Glossaire

  • GPIO (General Purpose Input/Output)
    Broches du Raspberry Pi permettant d’envoyer ou recevoir des signaux

  • PIN
    Emplacement physique numéroté sur le Raspberry Pi

  • GPIO17
    Nom du GPIO utilisé dans le code. Correspond à la pin physique 11

  • GND (Ground)
    Masse électrique. Permet de fermer le circuit

  • Pull-up
    Résistance interne qui maintient le signal à l’état haut par défaut

  • Button (gpiozero)
    Objet Python représentant un bouton connecté à un GPIO.

  • when_pressed
    Événement déclenché lorsque le bouton est appuyé.

  • Lambda
    Fonction courte écrite sur une seule ligne en Python

  • shutdown
    Commande système permettant d’éteindre proprement le Raspberry Pi

  • sudo
    Commande permettant d’exécuter une action avec les droits admin

  • rc.local
    Fichier exécuté au démarrage du Raspberry Pi

  • dtoverlay
    Configuration permettant d’activer des fonctionnalités matérielles comme gpio-shutdown

  • gpio-shutdown
    Méthode système permettant d’éteindre le rpi via un GPIO sans script Python