🛠 Variation d'intensité d'une LED en PWM
Objetivos
Comprender la modulación de ancho de pulso (PWM): una salida digital solo genera 0 o 3,3 V, pero al conmutar muy rápidamente se modula la potencia media. Utilizarás el PWM por hardware del conector de 40 pines (GPIO18, pin 12) y un «LED respiratorio» en Python, y luego el PWM por hardware mediante pigpio en C.
Material
- Placa tipo Raspberry Pi 3 Model B+ con Raspberry Pi OS
- LED + resistencia de 330 Ω en GPIO18 (pin 12, pin PWM por hardware)
- Opción C:
sudo apt install pigpioy luegosudo pigpiod
Código completo
#!/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, "demarrer 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;
}
Verificación esperada
El LED sube y baja de luminosidad de forma continua («respiración» de aproximadamente 2 s por ciclo) sin escalonamiento visible. Con la versión en C, el osciloscopio lógico (o una aplicación para smartphone) muestra una señal rectangular de 50 Hz cuyo ancho varía entre 1 y 2 ms. pigs rgr 18 muestra la configuración PWM activa.
Errores frecuentes
- Elegir un pin sin PWM por hardware: el PWM por software (gpiozero) funciona en cualquier pin, pero tiembla si la placa está sobrecargada; GPIO18 es el pin PWM por hardware adecuado.
- Olvidar
sudo pigpiodantes de ejecutar el binario C:gpioInitialfalla inmediatamente. - Dejar el PWM activo al salir del script: el LED permanece encendido a media potencia — siempre restablecer
gpioHardwarePWM(18, 0, 0). - Confundir ciclo de trabajo y frecuencia: aquí la frecuencia permanece en 50 Hz, solo cambia el ancho de pulso.
- Fuente de alimentación insuficiente: bajo una carga PWM + USB elevada, una fuente de 1 A provoca reinicios; utiliza una de 2,5 A.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython