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

Objectifs

Utiliser la sortie PWM (impulsion-width modulation) du H3 pour faire « respirer » une LED : varier la luminosité par rapport cyclique plutôt que par clignotement rapide. Le connecteur 40 broches de l'Orange Pi PC expose des fonctions PWM (liste des fonctions : UART, I2C, SPI, PWM, CAN, I2S, SPDIF, LRADC, ADC). Sous kernel mainline, le PWM passe par la classe sysfs pwmchip, sans bibliothèque vendor.

Matériel

Code complet

  1. Activer le PWM puis repérer le 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 respiration 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

Vérification attendue

La LED monte et descend en luminosité de façon continue (respiration ~4 s par cycle), sans crénelage visible. cat /sys/class/pwm/pwmchip0/pwm0/duty_cycle suit les variations.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels