🛠 Variation d'intensité d'une LED avec le PWM

Orange Pi PC (Allwinner H3) · intermediaire · Schéma : IMG-orangepi-pc-intermediaire-1-opipc-pwm-led.svg — LED externe avec résistance connectée à une broche PWM du connecteur 40 broches de l'Orange Pi PC, signal PWM et rapport cyclique illustrés par une respiration lumineuse.

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

Código completo

  1. 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
  1. 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.

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales