🛠 Variation d'intensité d'une LED avec le PWM
Objectifs
Faire varier l'intensité d'une LED (fondu « respiration ») avec la sortie PWM de l'ODROID-N2. Le connecteur 40 broches expose 6 canaux PWM (spécifications CNX) ; on cible ici la ligne PWM associée à GPIOX_4 (broche physique 13). Sous kernel mainline, le contrôleur PWM Amlogic (AO/EE) apparaît dans /sys/class/pwm.
Matériel
- ODROID-N2/N2+ sous Armbian (mainline)
- 1 LED + résistance 330 Ω entre PIN_13 et GND (PIN_25)
- Paquet
pwmconfigou accès sysfs ; un transistor (2N2222 + résistance 1 kΩ) si la LED est plus gourmande - >
Code complet
#!/usr/bin/env bash
# respiration.sh — fondu PWM sur pwmchip0 canal 0 (vérifier le canal !)
set -e
CHIP=/sys/class/pwm/pwmchip0
[ -e $CHIP/pwm0 ] || echo 0 | sudo tee $CHIP/export
sleep 0.2
echo 500000 | sudo tee $CHIP/pwm0/period # 500 µs = 2 kHz
echo 1 | sudo tee $CHIP/pwm0/enable
while true; do
for d in $(seq 0 25000 50000); do # montée
echo $d | sudo tee $CHIP/pwm0/duty_cycle; sleep 0.03; done
for d in $(seq 50000 -25000 0); do # descente
echo $d | sudo tee $CHIP/pwm0/duty_cycle; sleep 0.03; done
done
Vérification attendue
Après export, /sys/class/pwm/pwmchip0/pwm0/ contient period, duty_cycle, enable. Le script fait varier la luminosité de la LED de éteinte à pleine intensité par paliers de 5 % (rapport cyclique 0 → 50000/500000 ns). cat duty_cycle suit la valeur écrite. Pour la fréquence, 20 kHz : period=50000, duty=25000 pour 50 %.
Erreurs fréquentes
exportrefuse le canal : il est réservé par le device-tree (pilote d'affichage ou ventilo) ; essayerecho 1ou un autre pwmchip.- period/duty dans le mauvais ordre : écrire period avant duty, sinon duty > period est rejeté (EINVAL).
- Fréquence trop basse : au-dessous de ~100 Hz la LED scintille visiblement ; rester à 1–20 kHz.
- Confondre duty_ratio et duty_cycle : duty_cycle s'exprime en nanosecondes, pas en pourcentage.
- Le canal PWM de la broche 13 n'est pas activé dans le DTB : sur certaines images il faut un overlay (
dtoverlay/overlays=dans config) — > - Oublier
enable=1: rien ne clignote même si duty_cycle est non nul.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash