đź•’ : 3 h maximum
Prérequis:
But:
- Mettre en oeuvre du développement logiciel avec Python et langage C (gcc)
Répertoire du travail:
~/Works/RPI_2
Installation
installer la lib pour utiliser libgpiod dans python
sudo apt update
sudo apt install python3-libgpiod # Installe le binding Python pour libgpiod
Interpréteur en ligne , python3
on va reprendre le montage du tp précédent.

bruno@rpi364:~/Works/RPI_2 $ python Python 3.9.2 (default, Mar 20 2025, 02:07:39) [GCC 10.2.1 20210110] on linux Type "help", "copyright", "credits" or "license" for more information. >>>
en ligne de commande on va piloter la led GPIO17
>>> import gpiod #charger la librarie gpiod
>>> chip = gpiod.Chip('gpiochip0') # Crée un objet chip à partir de la classe gpiod.Chip.
>>> led = chip.get_line(17)
>>> led.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
>>> led.set_value(1) # ON
>>> led.set_value(0) # OFF
>>> led.release() # Libération propre
On v a ici s’initier la POO , programmation orientĂ©e objet
# Importation de la classe gpiod depuis le module gpiod
# En POO: On importe la 'boîte à outils' principale contenant les classes nécessaires
>>> import gpiod
# Instanciation de l'objet 'chip' Ă partir de la classe Chip
# En POO: gpiod.Chip est le constructeur qui crée un objet représentant le contrôleur matériel
# 'gpiochip0' est le nom du device matériel (vérifiable avec gpiodetect)
>>> chip = gpiod.Chip('gpiochip0')
# Création d'un objet 'led' à partir de la méthode get_line() de l'objet chip
# En POO: get_line() est une méthode d'instance qui retourne un objet Line
# 17 correspond à l'offset (GPIO17 en numérotation BCM)
>>> led = chip.get_line(17)
# Configuration de l'objet led via la méthode request()
# En POO:
# - consumer="LED" : Nom arbitraire pour identifier l'usage (principe d'encapsulation)
# - type=... : Spécifie le comportement de l'objet (ici sortie)
# Cela illustre le principe d'abstraction: on configure sans savoir comment c'est implémenté
>>> led.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
# Utilisation de la méthode set_value() de l'objet led
# En POO:
# - set_value() est une méthode qui modifie l'état interne de l'objet
# - 1/0 représente l'état HIGH/LOW (interface simplifiée vers le matériel)
>>> led.set_value(1) # ON - Active la sortie (méthode publique d'interface)
>>> led.set_value(0) # OFF - Désactive la sortie
# Appel de la méthode release() pour libérer les ressources
# En POO:
# - Gestion propre des ressources (destruction explicite)
# - Bonne pratique pour éviter les fuites mémoire et les conflits matériels
# - Analogie avec le destructeur (mais appelé manuellement ici)
>>> led.release() # Libération propre de l'objet led
Concepts POO illustrés :
- Encapsulation :
- Les détails matériels sont cachés dans les objets
ChipetLine - On interagit via des méthodes simples (
set_value()) sans voir la complexité sous-jacente
- Les détails matériels sont cachés dans les objets
- Abstraction :
gpiod.Chipabstrait le contrôleur matérielLINE_REQ_DIR_OUTest une constante qui masque les détails bas niveau
- Messaging :
led.set_value(1)envoie un « message » Ă l’objet pour changer d’Ă©tat
- Gestion du cycle de vie :
- Construction :
gpiod.Chip() - Utilisation : méthodes
request(),set_value() - Destruction :
release()
- Construction :
Vous allez revoir les concepts de la POO en étudiant le C++
Passons au code blink.py
#!/bin/python3i
mport gpiod
import time
# Configuration
LED_CHIP = 'gpiochip0' # Nom du contrĂ´leur GPIO
LED_PIN = 17 # Numéro GPIO (BCM)
INTERVAL = 1.0 # 1 seconde allumé, 1 seconde éteint (0.5 Hz)
# Initialisation
chip = gpiod.Chip(LED_CHIP) # Ouvre le contrĂ´leur GPIO
led = chip.get_line(LED_PIN) # Récupère la ligne GPIO
led.request(consumer="blink", type=gpiod.LINE_REQ_DIR_OUT) # Configure en sortie
# Clignotement
try:
while True:
led.set_value(1) # Allume la LED
time.sleep(INTERVAL) # Attend 1 seconde
led.set_value(0) # Éteint la LED
time.sleep(INTERVAL) # Attend 1 seconde
except KeyboardInterrupt:
pass
# Nettoyage
led.set_value(0) # Éteint la LED
led.release() # Libère la GPIO
chip.close() # Ferme le contrĂ´leur
print("Programme arrêté, LED éteinte")
Saisir ce code et le tester
répertoire: blink , code : blink.py
Avec le Debugger pdb
bruno@rpi364:~/Works/RPI_2/blink $ python3 -m pdb blink.py
> /home/bruno/Works/RPI_2/blink/blink.py(2)<module>()
-> import gpiod
(Pdb) n
> /home/bruno/Works/RPI_2/blink/blink.py(3)<module>()
-> import time
(Pdb) n
> /home/bruno/Works/RPI_2/blink/blink.py(6)<module>()
-> LED_CHIP = 'gpiochip0' # Nom du contrĂ´leur GPIO
(Pdb) n
> /home/bruno/Works/RPI_2/blink/blink.py(7)<module>()
-> LED_PIN = 17 # Numéro GPIO (BCM)
(Pdb) p LED_CHIP
'gpiochip0'
(Pdb)
- Commandes essentielles :
n(next) : ExĂ©cute la ligne suivantec(continue) : Continue jusqu’au prochain point d’arrĂŞtp <variable>: Affiche la valeur (ex:p LED_PIN)l(list) : Montre le code autour de la ligne actuelleq(quit) : Quitte le dĂ©bogueur
Tester ce code avec pdb
vous pouvez vous aider du cours python
Donner l’organigramme et le PL avec Monia
Avec l’ILS on va reprendre le 2 ème schĂ©ma (dĂ©jĂ vu)

Code ilsled.py
Répertoire : ilsled , code : ilsled.py
#!/usr/bin/env python3
# Script de copie GPIO27 → GPIO17 - Version pédagogique
# Importation des bibliothèques
import gpiod # Pour contrĂ´ler les GPIO
import time # Pour les petites pauses
# === Configuration ===
BROCHE_ENTREE = 27 # GPIO27 en entrée (capteur/bouton)
BROCHE_SORTIE = 17 # GPIO17 en sortie (LED/relais)
NOM_CHIP = 'gpiochip0' # Nom du contrĂ´leur GPIO (toujours gpiochip0 sur RPi)
# === Initialisation GPIO ===
# 1. On ouvre le contrĂ´leur GPIO
chip = gpiod.Chip(NOM_CHIP)
# 2. On configure les broches :
# - GPIO27 en entrée (pour lire un bouton/capteur)
# - GPIO17 en sortie (pour piloter une LED/relais)
entree = chip.get_line(BROCHE_ENTREE)
sortie = chip.get_line(BROCHE_SORTIE)
entree.request(consumer="entree", type=gpiod.LINE_REQ_DIR_IN)
sortie.request(consumer="sortie", type=gpiod.LINE_REQ_DIR_OUT)
# === Boucle principale ===
try:
print("Démarrage de la copie GPIO27 → GPIO17 (CTRL+C pour arrêter)")
while True:
# 1. Lire l'état actuel de GPIO27 (0 ou 1)
etat_entree = entree.get_value()
# 2. Copier cette valeur sur GPIO17
sortie.set_value(etat_entree)
# 3. Petite pause pour éviter de surcharger le CPU
time.sleep(0.05) # 50ms
except KeyboardInterrupt:
# === Nettoyage ===
print("\nArrĂŞt propre du programme...")
entree.release()
sortie.release()
chip.close()
print("GPIO libérées, script terminé.")
Saisir ce code et tester
Répertoire: ilsled , code: ilsled.py


