🛠 Variation d'intensité d'une LED avec le PWM
Objetivos
Hacer variar la intensidad luminosa de un LED mediante la modulación de ancho de pulso (PWM). En la Raspberry Pi 5, el PWM por hardware está disponible en los GPIO 12, 13, 18 y 19, todos controlados por el chip RP1. Se realiza un efecto de «respiración» (breathing LED) en Python con gpiozero.
Material
- Raspberry Pi 5 con Raspberry Pi OS de 64 bits
- 1 LED + resistencia de 470 Ω
- Cable en el pin físico 12 = GPIO18 (PWM por hardware), GND en el pin 6
- gpiozero preinstalado
Código completo
#!/usr/bin/env python3
# breathe.py — effet respiration sur LED PWM (GPIO18 = broche physique 12)
# PWM materiel Pi 5 : GPIO 12, 13, 18, 19 (pilotés par la puce RP1).
from gpiozero import PWMLED
from time import sleep
led = PWMLED(18, freq=1000) # 1 kHz : imperceptible pour l'œil
try:
while True:
# montée progressive de 0 % à 100 %
for duty in range(0, 101, 2):
led.value = duty / 100.0
sleep(0.02)
# descente progressive de 100 % à 0 %
for duty in range(100, -1, -2):
led.value = duty / 100.0
sleep(0.02)
except KeyboardInterrupt:
led.off
Alternativa en línea de comandos con el PWM por hardware exportado:
echo 18 | sudo tee /sys/class/pwm/pwmchip0/export
sleep 0.2
echo 1000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable
Verificación esperada
El LED se intensifica y luego se atenúa en bucle, sin parpadeo visible. Con la variante sysfs, el LED permanece al 50 % de luminosidad (duty_cycle = la mitad del periodo).
Errores frecuentes
- Elegir un GPIO sin PWM por hardware (por ejemplo, GPIO17): gpiozero recurre a un PWM por software, más irregular; prefiera 12/13/18/19.
- Reutilizar pwmchip0 cuando el PWM ya está ocupado por un overlay: liberar con
echo 18 > .../pwmchip0/unexporto verificarconfig.txt. - LED parpadeante en lugar de variada: frecuencia demasiado baja, añada
freq=1000a PWMLED. - Olvidar la resistencia en PWM: la corriente media es menor, pero los picos siguen siendo peligrosos para el pin.
- No apagar el LED al salir del script: llame siempre a
led.offen el bloque de excepción.
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