🛠 Variation d'intensité LED avec le PWM matériel (et son piège)
Objetivos
Hacer variar la intensidad de un LED con la modulación de ancho de pulso (PWM). La trampa principal del BCM2835: una sola salida PWM por hardware, en GPIO18 (pin físico 12). Si otro uso (sonido, otro motor) reclama este canal, todo lo demás debe pasar por PWM por software, menos preciso. Este tutorial muestra el enfoque con RPi.GPIO e ilustra la restricción.
Material
- Raspberry Pi Model B Rev 1 con imagen legacy de 32 bits
- LED + resistencia de 330 Ω en GPIO18 (pin 12) y GND (pin 6)
sudo apt install -y python3-rpi.gpio- GPIO18 es también el pin de audio PWM: un altavoz conectado a él entrará en conflicto con su LED.
Código completo
#!/usr/bin/env python3
"""Respiration LED sur GPIO18 - PWM materiel UNIQUE du BCM2835."""
import RPi.GPIO as GPIO
import time
LED = 18 # SEULE broche PWM materielle du Model B Rev 1 (broche 12)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED, GPIO.OUT)
p = GPIO.PWM(LED, 100) # frequence 100 Hz
p.start(0)
try:
while True: # montee puis descente du rapport cyclique
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.05)
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
p.stop
GPIO.cleanup
Verificación esperada
El LED «respira»: la intensidad sube y baja en bucle. Verifique con cat /sys/kernel/debug/pwm (si está disponible) que el canal PWM por hardware está correctamente reclamado. Pruebe la trampa: lance un segundo script PWM en GPIO18; el segundo fallará o recuperará el único canal.
Errores frecuentes
- Elegir GPIO17 para el PWM por hardware: RPi.GPIO cambia entonces a PWM por software (simulado) sin avisar; solo el pin 18 es por hardware.
- Conflicto de audio: el sonido por jack utiliza el mismo módulo PWM; un
aplaypuede perturbar el LED (y viceversa). - Frecuencia demasiado baja (< 50 Hz): parpadeo visible; PWM por software a alta frecuencia: el ARM11 no es suficiente.
- Olvidar
p.stopantes deGPIO.cleanup: el pin sigue emitiendo. - Esperar una salida analógica: el PWM es una tensión media, no un verdadero DAC (el BCM2835 no tiene DAC).
Otros tutoriales para esta placa
- Allumer une LED via le GPIO avec libgpiod
- Lire un bouton poussoir et afficher l'état dans la console
- Premier script Python : faire clignoter la LED
- Lire un capteur I2C (température/humidité) sur le bus 1
- Configurer l'Ethernet 10/100 et piloter le Pi en SSH
- Boot sur SD, partitions et procédure de recouvrement
Ejemplos de código para esta placa
led_blink.pyPythonbutton_led.pyPythonservo_sweep.pyPythondht_temp.pyPythonoled_i2c.pyPythonmcp3008_read.pyPython