🛠 Variation d'intensité d'une LED avec le PWM
Objetivos
Utilizar la salida PWM (modulación por ancho de pulso) del H3 para hacer «respirar» un LED: variar la luminosidad mediante el ciclo de trabajo en lugar de un parpadeo rápido. El conector de 40 pines de la Orange Pi PC expone funciones PWM (lista de funciones: UART, I2C, SPI, PWM, CAN, I2S, SPDIF, LRADC, ADC). Bajo el kernel mainline, el PWM pasa por la clase sysfs pwmchip, sin biblioteca del fabricante. > NO VERIFICADO: el pin exacto del conector conectado al controlador PWM0 y su número de pwmchip dependen del overlay del device tree de su imagen Armbian (overlay sun8i-h3-pwm a activar); verifíquelo con el esquema oficial o pwminfo en su tarjeta.
Material
- Orange Pi PC bajo Armbian, fuente de alimentación de 5 V / 2 A (conector DC)
- 1 LED + resistencia de 330 Ω
- Cable hacia el pin PWM activado por overlay + GND (lógica de 3.3 V)
- sudo armbian-config o edición de /boot/armbianEnv.txt para activar el overlay PWM
Código completo
- Activar el PWM y luego identificar el canal:
# Activer l'overlay PWM (armbian-config > Hardware > Overlays > pwm)
sudo sed -i 's/^overlays=.*/& pwm/' /boot/armbianEnv.txt && sudo reboot
# Après reboot : lister les contrôleurs PWM exposés
ls /sys/class/pwm/ # pwmchip0, pwmchipN...
echo 0 | sudo tee /sys/class/pwm/pwmchip0/export # exporter le canal 0
- Script de respiración en Python:
#!/usr/bin/env python3
"""respiration.py — effet breathing LED via sysfs PWM (Orange Pi PC)."""
from pathlib import Path
import time
PWM = Path("/sys/class/pwm/pwmchip0/pwm0") # canal exporté ci-dessus
PERIOD_NS = 20_000 # 20 kHz : inaudible, sans scintillement
def main -> None:
(PWM / "period").write_text(str(PERIOD_NS))
(PWM / "polarity").write_text("normal")
(PWM / "enable").write_text("1")
try:
while True:
for pct in list(range(0, 101, 2)) + list(range(98, -1, -2)):
duty = PERIOD_NS * pct // 100
(PWM / "duty_cycle").write_text(str(duty))
time.sleep(0.02)
finally:
(PWM / "enable").write_text("0")
if __name__ == "__main__":
main
Verificación esperada
El LED sube y baja de luminosidad de forma continua (respiración de ~4 s por ciclo), sin escalonamiento visible. cat /sys/class/pwm/pwmchip0/pwm0/duty_cycle sigue las variaciones.
Errores frecuentes
> NO VERIFICADO: número exacto de pin PWM en el conector — confirmar en el esquema oficial antes de cablear.
- Olvidar el overlay: sin él, no aparece ningún /sys/class/pwm/pwmchip — este es el punto de bloqueo n.º 1 bajo Armbian.
- Escribir duty_cycle antes que period: el kernel lo rechaza o lo trunca; siempre period primero.
- Periodo demasiado bajo con un LED blanco: parpadeo visible; mantener ≥ 1 kHz.
- Conectar el LED a un pin que no está multiplexado como PWM: no parpadea nada, verifique el pinmux con el esquema.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash