🛠 Variateur de lumière : PWM sur une LED
Objetivos
Comprender la modulación de ancho de pulso (PWM): variar la luminosidad de un LED cambiando el ciclo de trabajo. El conector J8 del Pi 2 expone una salida PWM por hardware en GPIO18; primero utilizarás el PWM por software de RPi.GPIO (simple y flexible), y luego activarás el PWM por hardware mediante config.txt.
Material
- Raspberry Pi 2 Model B con Raspberry Pi OS de 32 bits
- LED + resistencia de 330 Ω en GPIO18 (pin 12 del J8)
- Paquete: sudo apt install python3-rpi.gpio
Código completo
#!/usr/bin/env python3
"""pwm_led.py — rampe d'intensite PWM (logiciel) sur GPIO18."""
import RPi.GPIO as GPIO
from time import sleep
PIN = 18 # aussi la sortie PWM materielle du J8
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.OUT)
pwm = GPIO.PWM(PIN, 1000) # frequence 1 kHz
pwm.start(0)
try:
while True:
for dc in range(0, 101, 5): # monte doucement
pwm.ChangeDutyCycle(dc)
sleep(0.05)
for dc in range(100, -1, -5): # descend doucement
pwm.ChangeDutyCycle(dc)
sleep(0.05)
except KeyboardInterrupt:
pass
pwm.stop
GPIO.cleanup
Verificación esperada
El LED se intensifica y luego se atenúa en un bucle continuo (efecto respiración). Al 0 % está apagado, al 100 % a plena intensidad. Para el PWM por hardware, añade dtoverlay=pwm (o pwm-2chan) en /boot/config.txt, reinicia y luego controla /sys/class/pwm: la señal permanece exacta incluso bajo carga, a diferencia del PWM por software.
Errores frecuentes
- Confusión entre PWM por hardware y por software: el PWM por software de RPi.GPIO funciona en cualquier pin pero se degrada bajo alta carga de CPU; el hardware (GPIO18) mantiene la precisión.
- Olvidar GPIO.cleanup: el pin permanece ocupado y el siguiente script falla.
- Frecuencia demasiado baja: por debajo de ~100 Hz el LED parpadea visiblemente; mantén 1 kHz.
- Usar el pin 12 en PWM por hardware sin editar config.txt ni reiniciar: no aparece nada en /sys/class/pwm.
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