🛠 Variation d'intensité d'une LED avec PWM (sysfs pwm)
Objectifs
Faire « respirer » une LED en faisant varier le rapport cyclique d'un signal PWM via l'interface sysfs /sys/class/pwm. Le connecteur 40 broches multiplexe des sorties PWM, et la LED verte de statut de la carte est elle-même pilotée en PWM (pwm2 en mainline) ; le ventilateur 5 V du connecteur dédié est aussi régulé en PWM (palier ventilateur à 55 °C, plein régime à 65 °C dans le device-tree mainline).
Matériel
- Orange Pi 5 Plus alimentée (5 V / 4 A, Type-C côté Ethernet)
- LED + résistance 330 Ω sur une broche multiplexée PWM du connecteur (consulter la figure officielle « Pin Definition » ; le connecteur multiplexe PWM parmi UART/I2C/SPI/CAN/I2S)
- Terminal ; aucun paquet requis (sysfs PWM est dans le noyau)
Code complet
# 1. Trouver le contrôleur PWM exposé (pwmchipN)
cat /sys/class/pwm/pwmchip*/uevent 2>/dev/null
# Attacher le canal 0 du premier contrôleur (adapter le numéro à votre carte) :
echo 0 | sudo tee /sys/class/pwm/pwmchip0/export
P=/sys/class/pwm/pwmchip0/pwm0
echo 20000000 | sudo tee $P/period # période 20 ms -> 50 Hz
echo 0 | sudo tee $P/duty_cycle # 0 % : LED éteinte
echo 1 | sudo tee $P/enable # activer la sortie
# 2. Respiration : montée 0 -> 100 % puis descente, par pas de 1 %
while :; do
for d in $(seq 0 200000 20000000); do echo $d | sudo tee $P/duty_cycle >/dev/null; sleep 0.02; done
for d in $(seq 20000000 -200000 0); do echo $d | sudo tee $P/duty_cycle >/dev/null; sleep 0.02; done
done
# Stop : Ctrl-C, puis echo 0 | sudo tee $P/enable
# Nettoyage : echo 0 | sudo tee /sys/class/pwm/pwmchip0/unexport
Vérification attendue
La LED monte puis descend en luminosité de façon continue (respiration d'environ 1,6 s par cycle). cat $P/duty_cycle suit les valeurs écrites ; la fréquence reste à 50 Hz (période 20 000 000 ns) quelle que soit la luminosité.
Erreurs fréquentes
- Écrire dans un pwmchip non exporté : « Permission denied » sur /export = le contrôleur n'est pas activé dans le device-tree ; vérifier avec
sudo cat /sys/kernel/debug/pwmla liste des contrôleurs et canaux libres. - Confondre period et duty_cycle : period fixe la fréquence, duty_cycle l'intensité ; duty_cycle > period est saturé silencieusement.
- Oublier
enable=1: la sortie reste inactive, la LED ne bouge pas. - >
Autres tutoriels pour cette carte
- Allumer une LED via le GPIO 40 broches (libgpiod)
- Lire un bouton poussoir et afficher dans la console
- Premier script Python : fiche signalétique de la carte et LED
- Lire un capteur I2C (BMP280) depuis le bus du connecteur
- Exploiter le double Ethernet 2,5 GbE et sécuriser le SSH
- Booter sur NVMe (M.2 PCIe 3.0 x4) et récupérer une carte brique via MaskROM
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash