🛠 Variation d'intensité LED avec le PWM matériel (et son piège)
Objectifs
Faire varier l'intensité d'une LED avec la modulation de largeur d'impulsion (PWM). Piège majeur du BCM2835 : une seule sortie PWM matérielle, sur GPIO18 (broche physique 12). Si un autre usage (son, autre moteur) réclame ce canal, tout le reste doit passer par du PWM logiciel, moins précis. Ce tutoriel montre l'approche avec RPi.GPIO et illustre la contrainte.
Matériel
- Raspberry Pi Model B Rev 1 sous image legacy 32 bits
- LED + résistance 330 Ω sur GPIO18 (broche 12) et GND (broche 6)
sudo apt install -y python3-rpi.gpio- GPIO18 est aussi la broche audio PWM : un haut-parleur connecté dessus sera en conflit avec votre LED.
Code complet
#!/usr/bin/env python3
"""Respiration LED sur GPIO18 - PWM matériel UNIQUE du BCM2835."""
import RPi.GPIO as GPIO
import time
LED = 18 # SEULE broche PWM materielle du Model B Rev 1 (broche 12)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)
p = GPIO.PWM(LED, 100) # fréquence 100 Hz
p.start(0)
try:
while True: # montee puis descente du rapport cyclique
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.05)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
p.stop
GPIO.cleanup
Vérification attendue
La LED « respire » : l'intensité monte et descend en boucle. Vérifiez avec cat /sys/kernel/debug/pwm (si disponible) que le canal PWM matériel est bien réclamé. Testez le piège : lancez un second script PWM sur GPIO18, le second échoue ou récupère l'unique canal.
Erreurs fréquentes
- Choisir GPIO17 pour le PWM matériel : RPi.GPIO bascule alors en PWM logiciel (simulé) sans prévenir ; seule la broche 18 est matérielle.
- Conflit audio : le son par prise jack utilise le même module PWM ; un
aplaypeut perturber la LED (et vice versa). - Fréquence trop basse (< 50 Hz) : scintillement visible ; PWM logiciel à fréquence élevée : l'ARM11 n'y suffit pas.
- Oublier
p.stopavantGPIO.cleanup: la broche reste émettrice. - Attendre une sortie analogique : le PWM est une tension moyenne, pas un vrai DAC (le BCM2835 n'a pas de DAC).
Autres tutoriels pour cette carte
- Allumer une LED via le GPIO avec libgpiod
- Lire un bouton poussoir et afficher l'état dans la console
- Premier script Python : faire clignoter la LED
- Lire un capteur I2C (température/humidité) sur le bus 1
- Configurer l'Ethernet 10/100 et piloter le Pi en SSH
- Boot sur SD, partitions et procédure de recouvrement
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython