🛠 Variation d'intensité d'une LED avec le PWM matériel
Objectifs
Faire varier l'intensité d'une LED avec la modulation de largeur d'impulsion (PWM) sur le Raspberry Pi 3 A+ : PWM matériel sur GPIO18 (broche 12, signal « PWM » du connecteur 40 broches) contre PWM logiciel gpiozero, rapport cyclique et fréquence.
Matériel
- Raspberry Pi 3 A+ sous Raspberry Pi OS Bookworm, LED + résistance 330 Ω
- LED + 330 Ω entre GPIO18 (broche 12) et GND (broche 14) ; tout GPIO convient en PWM logiciel
sudo apt install python3-gpiozero
Code complet
#!/usr/bin/env python3
# pwm_led.py — respiration de LED (GPIO18 = PWM matériel)
from gpiozero import PWMLED
from time import sleep
led = PWMLED("GPIO18", pwm=True) # GPIO18 = broche 12, PWM matériel
led.pwm_frequency = 100 # Hz ; défaut gpiozero : 100 Hz
# respiration : montée puis descente du rapport cyclique
for i in range(0, 101, 5):
led.value = i / 100.0 # 0.0 = éteinte, 1.0 = pleine
sleep(0.05)
for i in range(100, -1, -5):
led.value = i / 100.0
sleep(0.05)
# clignotement précis piloté par le contrôleur PWM matériel
led.blink(on_time=0.5, off_time=0.5, fade_in_time=0.2, fade_out_time=0.2)
sleep(5)
led.off
python3 pwm_led.py
# Vérifier le brochage PWM : le site de référence du connecteur 40 broches
Vérification attendue
La LED monte progressivement en luminosité sur ~1 s, redescend, puis clignote avec des fondus. Au multimètre sur GPIO18, la tension moyenne suit le rapport cyclique (≈1,65 V à 50 % sur la base 3,3 V).
Erreurs fréquentes
- Confondre PWM matériel (GPIO18, aussi GPIO12/13/19) et PWM logiciel (n'importe quel GPIO, moins précis) : sur 3 A+ le contrôleur matériel est unique et partagé.
- Fréquence trop basse (<50 Hz) : la LED se met à scintiller visiblement.
- Oublier la résistance : à 100 % du rapport cyclique le courant dépasse les limites de la broche.
- Sur les servomoteurs, imposer
pwm_frequency = 50; par défaut à 100 Hz le servo vibre ou brûle.
Autres tutoriels pour cette carte
- Allumer une LED en C avec libgpiod sur le GPIO 40 broches
- Bouton poussoir et retour console avec gpiozero
- Premier script Python : inventaire du système
- Capteur I2C : température et pression avec BME280
- Connexion WiFi station et administration en SSH
- Démarrage SD/USB et récupération d'une carte qui ne boot plus
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython