đź•’ : 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 :

  1. Encapsulation :
    • Les dĂ©tails matĂ©riels sont cachĂ©s dans les objets Chip et Line
    • On interagit via des mĂ©thodes simples (set_value()) sans voir la complexitĂ© sous-jacente
  2. Abstraction :
    • gpiod.Chip abstrait le contrĂ´leur matĂ©riel
    • LINE_REQ_DIR_OUT est une constante qui masque les dĂ©tails bas niveau
  3. Messaging :
    • led.set_value(1) envoie un « message » Ă  l’objet pour changer d’Ă©tat
  4. Gestion du cycle de vie :
    • Construction : gpiod.Chip()
    • Utilisation : mĂ©thodes request()set_value()
    • Destruction : release()

Vous allez revoir les concepts de la POO en étudiant le C++

#!/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) 
  1. Commandes essentielles :
    • n (next) : ExĂ©cute la ligne suivante
    • c (continue) : Continue jusqu’au prochain point d’arrĂŞt
    • p <variable> : Affiche la valeur (ex: p LED_PIN)
    • l (list) : Montre le code autour de la ligne actuelle
    • q (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

Donner les organigrammes et Pl avec Monia

Conclusion du TP