🛠 Variation d'intensité d'une LED en PWM
Objectifs
Comprendre la modulation de largeur d'impulsion (PWM) : une sortie numérique ne fait que 0 ou 3,3 V, mais en hachant très vite on module la puissance moyenne. Vous utiliserez le PWM matériel du connecteur 40 broches (GPIO18, broche 12) et un « breathing LED » en Python, puis le PWM matériel via pigpio en C.
Matériel
- Carte type Raspberry Pi 3 Model B+ sous Raspberry Pi OS
- LED + résistance 330 Ω sur GPIO18 (broche 12, broche PWM matérielle)
- Option C :
sudo apt install pigpiopuissudo pigpiod
Code complet
#!/usr/bin/env python3
"""Respiration LED sur GPIO18 (broche PWM matérielle)."""
from gpiozero import PWMLED
from time import sleep
led = PWMLED(18) # PWM : valeur de 0.0 (éteinte) à 1.0 (pleine)
while True:
for pas in range(0, 101, 2): # montée 0 -> 100 %
led.value = pas / 100.0
sleep(0.02)
for pas in range(100, -1, -2): # descente 100 -> 0 %
led.value = pas / 100.0
sleep(0.02)
/* Version PWM matérielle : gcc servo.c -o servo -lpigpio (pigpiod lancé).
50 Hz, impulsions 1-2 ms : la même mécanique pilote un servomoteur. */
#include <pigpio.h>
#include <stdio.h>
int main(void) {
if (gpioInitial < 0) { fprintf(stderr, "démarrer pigpiod d'abord\n"); return 1; }
int pulse_us = 1000, dir = 20;
for (int i = 0; i < 250; i++) {
gpioHardwarePWM(18, 20000, pulse_us * 10); /* 50 Hz, pulse en 0,1 us */
if (pulse_us <= 1000 || pulse_us >= 2000) dir = -dir;
pulse_us += dir;
timeSleep(20000);
}
gpioHardwarePWM(18, 0, 0); /* couper le PWM avant de sortir */
gpioTerminate;
return 0;
}
Vérification attendue
La LED monte et descend en luminosité de façon continue (« respiration » d'environ 2 s par cycle) sans crénelage visible. Avec la version C, l'oscilloscope logique (ou une appli smartphone) montre un créneau de 50 Hz dont la largeur varie entre 1 et 2 ms. pigs rgr 18 affiche la configuration PWM active.
Erreurs fréquentes
- Choisir une broche sans PWM matérielle : le PWM logiciel (gpiozero) fonctionne sur toute broche mais tremble si la carte est chargée ; GPIO18 est la broche PWM matérielle propre.
- Oublier
sudo pigpiodavant le binaire C :gpioInitialéchoue immédiatement. - Laisser le PWM actif à la sortie du script : la LED reste allumée à mi-puissance — toujours remettre
gpioHardwarePWM(18, 0, 0). - Confondre rapport cyclique et fréquence : ici la fréquence reste 50 Hz, seule la largeur d'impulsion change.
- Alimentation faible : sous forte charge PWM + USB, une alimentation 1 A provoque des bridages ; prendre du 2,5 A.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython