🛠 Lire un bouton poussoir en Python avec python3-libgpiod
Objectifs
Câbler un bouton poussoir sur le connecteur 40 broches de la ROCK 3B et afficher chaque appui dans la console avec python3-libgpiod, en utilisant les événements d'interruption (rising edge) plutôt qu'un sondage en boucle. C'est le premier script Python de la série : il sert de base aux tutoriels capteurs et IoT.
Matériel
- Radxa ROCK 3B sous Radxa OS, alimentation USB-C PD 12 V / 2 A
- 1 bouton poussoir, 1 résistance 10 kΩ (pull-up vers 3,3 V), câbles Dupont
sudo apt install python3-gpiod gpiod
Code complet
#!/usr/bin/env python3
"""Bouton sur le connecteur 40 broches — affiche les appuis (ROCK 3B).
Résolvez CHIP/LINE avec `gpiofind PIN_11` sur VOTRE image : les numéros
diffèrent entre noyau constructeur (Radxa) et noyau mainline >= 6.11."""
from gpiod import Chip, LineRequest
CHIP, LINE = "gpiochip3", 1 # exemple GPIO3_A1 derrière PIN_11 — CONFIRMER
with Chip(CHIP) as chip:
req = chip.request_lines(
consumer="rock3b-demo",
config={LINE: LineRequest.REQUEST_INPUT},
)
print("appui attendu (front montant), Ctrl-C pour quitter")
while True:
for ev in req.event_wait(timeout_ms=None):
e = req.event_get
if e and e.event_type == 1 and e.line == LINE: # RISING_EDGE
print("bouton pressé")
Vérification attendue
sudo python3 bouton.py démarre sans erreur ; chaque appui (front montant) affiche « bouton pressé ». Ctrl-C libère proprement la ligne. Avec pull-up matériel + bouton vers la masse, le repos est 1 et l'appui 0 : si rien ne s'affiche, inversez bouton/câble ou testez sudo gpioget $(gpiofind PIN_11) au multimètre logique.
Erreurs fréquentes
- Recoller les numéros CHIP/LINE d'un autre tuto : la doc GPIOD de Radxa insiste — résolvez toujours avec
gpiofind PIN_xx, car le mapping change entre image constructeur et mainline. - API python3-libgpiod : les versions récentes (libgpiod v2) utilisent
request_lines(config=...), les anciennesline.request(consumer=..., type=...)— adaptez selon le paquet Debian installé. - Laisser la broche en l'air sans pull : l'état oscille aléatoirement ; le pull-up matériel 10 kΩ vers 3,3 V est le plus pédagogique.
- Confondre broche physique du connecteur et ligne libgpiod : seul le numéro de ligne intéresse le script.
- Oublier la masse commune entre breadboard et carte : le front montant n'arrive jamais franchement.
Autres tutoriels pour cette carte
- Faire clignoter une LED via le GPIO avec libgpiod
- Premier réseau : Ethernet double gigabit, Wi-Fi optionnel et SSH
- Installer et booter le système sur un SSD NVMe (M.2 M-Key)
- Interroger un capteur I2C sur le connecteur 40 broches
- Surveiller température et fréquence CPU, piloter le ventilateur PWM
- Routeur / passerelle réseau double Gigabit avec OpenWrt et PoE
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash