🛠 Variateur de luminosité LED en PWM
Objetivos
Hacer variar la luminosidad de un LED mediante MLI/PWM (modulación de ancho de pulso) en la Raspberry Pi 3 Model B. Comprender el ciclo de trabajo, la diferencia entre PWM por software (todos los pines, controlado por software) y PWM por hardware (disponible en GPIO12/13/18/19 en el Pi 3B, generado por el SoC), y realizar un efecto de «respiración».
Material
- Raspberry Pi 3 Model B con Raspberry Pi OS Lite
- LED + resistencia de 330 Ω en GPIO18 (pin físico 12 — pin PWM por hardware del BCM2837)
- Protoboard, cables Dupont
gpiozero(preinstalado) para la versión por software- Opción PWM por hardware: acceso a
/boot/firmware/config.txt
Código completo
Versión sencilla con PWM por software gpiozero (funciona en cualquier pin):
#!/usr/bin/env python3
"""respiration.py — effet respiration sur LED GPIO18 (broche physique 12).
PWM logiciel gpiozero ; pour le PWM matériel voir plus bas."""
from gpiozero import PWMLED
from time import sleep
led = PWMLED(18, pwm=True) # GPIO18 accepte aussi le PWM matériel
while True:
for pas in range(0, 101, 5): # montée 0 -> 100 %
led.value = pas / 100.0
sleep(0.05)
for pas in range(100, -1, -5): # descente 100 % -> 0
led.value = pas / 100.0
sleep(0.05)
Para el PWM por hardware en GPIO18, active el overlay en /boot/firmware/config.txt y reinicie:
echo 'dtoverlay=pwm-2chan,pin=18,func=2' | sudo tee -a /boot/firmware/config.txt
sudo reboot
Verificación esperada
El LED sube y baja progresivamente su luminosidad (efecto de respiración de aproximadamente 4 s por ciclo), sin escalones visibles. Con sudo python3 respiration.py ejecutándose en paralelo a watch -n1 cat /sys/class/pwm/*/* 2>/dev/null, se observan los archivos PWM tras la activación del overlay. Un LED en PWM al 20 % parece notablemente más oscuro que al 80 % — la percepción no es lineal, es normal.
Errores frecuentes
- Elegir un pin sin PWM por hardware y sorprenderse: solo GPIO12/13/18/19 para PWM por hardware en el Pi 3B; en otros pines, el PWM por software consume CPU y puede presentar jitter.
- Olvidar
sudo reboottras eldtoverlay: no aparece ningún controlador PWM en/sys/class/pwm. - Confundir GPIO18 (pin físico 12) con el pin 18 (GPIO24): verificar el diagrama de pines.
- Valor
led.valuefuera de 0..1:gpiozerolo ignora o lanza un error; mantenerpasos / 100.0. - LED siempre encendida a máxima intensidad en PWM por hardware: el pin no está enrutado hacia el PWM (parámetro
func=incorrecto en el overlay). - En una placa SBC tipo Banana Pi/Orange Pi con el mismo conector: la correspondencia de los pines PWM difiere — consultar la ficha de la placa. >
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