🛠 Variation d'intensité d'une LED en PWM
Objetivos
Hacer variar la intensidad de un LED mediante PWM en el Model B Rev 2: el GPIO18 (P1-12) es el pin PWM por hardware del BCM2835; aquí utilizaremos el objeto PWM de RPi.GPIO para un fundido progresivo.
Material
- Raspberry Pi Model B Rev 2, Raspbian legacy 32 bits
- LED + resistencia de 330 Ω en GPIO18 (P1-12) hacia GND
sudo apt install python-rpi.gpio- Recordatorio: no hay convertidor digital-analógico en la placa; el PWM es la única forma sencilla de «simular» una tensión variable.
Código completo
#!/usr/bin/env python
# fondu.py - balayage PWM sur GPIO18 (broche PWM materielle du BCM2835)
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
p = GPIO.PWM(18, 1000) # 1 kHz
p.start(0)
try:
while True:
for duty in list(range(0, 101, 5)) + list(range(95, -5, -5)):
p.ChangeDutyCycle(duty) # variation du rapport cyclique
time.sleep(0.02)
except KeyboardInterrupt:
pass
finally:
p.stop
GPIO.cleanup
Verificación esperada
El LED sube y baja de luminosidad en bucle (fundido tipo «respiración»). Al detenerse (Ctrl-C), se apaga completamente. Un osciloscopio en GPIO18 mostraría una señal rectangular a 1 kHz cuyo ciclo de trabajo evoluciona.
Errores frecuentes
- Olvidar
p.stopy luegoGPIO.cleanup: el LED permanece encendido a plena intensidad después del script. - Poner una frecuencia demasiado baja (unos pocos Hz): parpadeo visible, el ojo lo percibe.
- Confundir GPIO18 (PWM por hardware) y GPIO17: el fundido funciona por software en otros pines, pero solo el 18 tiene PWM por hardware.
- Resistencia demasiado alta (por encima de 1 kΩ): el LED apenas es visible incluso al 100 %.
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