🛠 Variation d'intensité d'une LED avec le PWM
Objectifs
Faire varier l'intensité lumineuse d'une LED avec la modulation de largeur d'impulsion (PWM). Sur le Raspberry Pi 5, le PWM matériel est disponible sur les GPIO 12, 13, 18 et 19, tous pilotés par la puce RP1. On réalise un effet de « respiration » (breathing LED) en Python avec gpiozero.
Matériel
- Raspberry Pi 5 sous Raspberry Pi OS 64 bits
- 1 LED + résistance 470 Ω
- Câble sur broche physique 12 = GPIO18 (PWM matériel), GND sur broche 6
- gpiozero préinstallé
Code complet
#!/usr/bin/env python3
# breathe.py — effet respiration sur LED PWM (GPIO18 = broche physique 12)
# PWM matériel Pi 5 : GPIO 12, 13, 18, 19 (pilotés par la puce RP1).
from gpiozero import PWMLED
from time import sleep
led = PWMLED(18, freq=1000) # 1 kHz : imperceptible pour l'œil
try:
while True:
# montée progressive de 0 % à 100 %
for duty in range(0, 101, 2):
led.value = duty / 100.0
sleep(0.02)
# descente progressive de 100 % à 0 %
for duty in range(100, -1, -2):
led.value = duty / 100.0
sleep(0.02)
except KeyboardInterrupt:
led.off
Alternative en ligne de commande avec le PWM matériel exporté :
echo 18 | sudo tee /sys/class/pwm/pwmchip0/export
sleep 0.2
echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable
Vérification attendue
La LED s'intensifie puis s'estompe en boucle, sans scintillement visible. Avec la variante sysfs, la LED reste à 50 % de luminosité (duty_cycle = moitié de la période).
Erreurs fréquentes
- Choisir un GPIO sans PWM matériel (par exemple GPIO17) : gpiozero retombe sur un PWM logiciel, plus irrégulier ; préférer 12/13/18/19.
- Réutiliser pwmchip0 quand le PWM est déjà pris par un overlay : libérer avec
echo 18 > .../pwmchip0/unexportou vérifierconfig.txt. - LED clignotante au lieu de variée : fréquence trop basse, ajouter
freq=1000à PWMLED. - Oublier la résistance en PWM : le courant moyen est plus faible mais les pics restent dangereux pour la broche.
- Ne pas éteindre la LED à la sortie du script : toujours appeler
led.offdans le bloc d'exception.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython