🛠 Variation d'intensité d'une LED avec le PWM
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
- Orange Pi PC sous Armbian, alimentation 5 V / 2 A (jack DC)
- 1 LED + résistance 330 Ω
- Câble vers la broche PWM activée par overlay + GND (logique 3.3 V)
- sudo armbian-config ou édition de /boot/armbianEnv.txt pour activer l'overlay PWM
Code complet
- 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
- 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
- Oublier l'overlay : sans lui, aucun /sys/class/pwm/pwmchip apparaît — c'est le point de blocage n°1 sous Armbian.
- Écrire duty_cycle avant period : le noyau rejette ou tronque ; toujours period d'abord.
- Période trop basse avec une LED blanche : scintillement visible ; rester à ≥ 1 kHz.
- Brancher la LED sur une broche qui n'est pas multiplexée en PWM : rien ne clignote, vérifier le pinmux avec le schéma.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash