🛠 Variation d'intensité d'une LED avec le PWM matériel (GPIO18)
Objectifs
Apprivoiser la modulation de largeur d'impulsion (PWM) : faire « respirer » une LED en variant le rapport cyclique. Le BCM2835 du Model B+ expose une sortie PWM matérielle sur GPIO18 (broche 12) — la seule du connecteur 40 broches à l'état par défaut — garantie sans à-coups même sous charge CPU.
Matériel
- Raspberry Pi Model B+ sous Raspberry Pi OS legacy 32 bits
- 1 LED + résistance 330 Ω
- Fils Dupont : broche 12 (GPIO18) → résistance → LED → broche 14 (GND)
- Éventuellement un transistor NPN (BC547) pour piloter un bandeau de LED, GPIO18 sur la base via 1 kΩ
Code complet
sudo apt install -y python3-rpi.gpio
sudo python3 fade.py
#!/usr/bin/env python3
"""Respiration LED sur GPIO18 (PWM matérielle) — Model B+."""
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
p = GPIO.PWM(18, 200) # 200 Hz : inodore pour l'œil
p.start(0)
try:
while True:
up = range(0, 101, 5) # rampe montante
down = range(95, -1, -5) # rampe descendante
for dc in list(up) + list(down):
p.ChangeDutyCycle(dc) # 0 % = éteinte, 100 % = pleine
time.sleep(0.05)
finally:
p.stop
GPIO.cleanup
Vérification attendue
La LED monte puis descend en luminosité en boucle, sans scintillement perceptible. Un oscilloscope sur GPIO18 montre un carré à 200 Hz dont le rapport cyclique évolue. Ctrl+C arrête proprement le programme.
Erreurs fréquentes
- PWM logicielle sur une autre broche : possible avec RPi.GPIO, mais le BCM2835 mono-cœur produit des à-coups sous charge — préférer GPIO18.
- Fréquence trop basse (quelques Hz) : la LED clignote au lieu de varier.
- Oubli de p.stop : résidu de signal après Ctrl+C hors du finally.
- Confondre PWM et sortie analogique : le B+ n'a aucun convertisseur analogique-numérique ni DAC ; le PWM n'est que des tout-ou-rien rapides.
Autres tutoriels pour cette carte
- Allumer une LED depuis la GPIO 17 avec libgpiod
- Lire un bouton et afficher les appuis dans la console
- Premier script Python : faire clignoter la LED
- Interroger un capteur I2C (BME280) sur le bus du 40 broches
- Mettre le B+ en réseau par Ethernet et piloter en SSH
- Amorçage microSD, pannes de boot et procédure de recouvrement
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython