🛠 Variation d'intensité d'une LED avec PWM
Objectifs
Faire varier l'intensité d'une LED (respiration lumineuse) avec la sortie PWM de l'Amlogic S905 exposée sur le connecteur J2, en utilisant l'interface sysfs PWM du noyau mainline (la DTS meson-gxbb-odroidc2 nomme les signaux PWM D et PWM B sur l'en-tête).
Matériel
- ODROID-C2 sous Armbian/mainline (interface /sys/class/pwm)
- LED + résistance, éventuellement transistor NPN (2N2222) si plusieurs LED en charge
- Broche J2 portant le signal PWM D (la DTS mainline le nomme explicitement sur l'en-tête J2)
- >
Code complet
#!/usr/bin/env bash
# pwm_respiration.sh — respiration LED via sysfs PWM
set -e
CHIP=$(ls /sys/class/pwm/ | grep -m1 pwmchip || true)
[ -z "$CHIP" ] && { echo "aucun pwmchip — activer le overlay PWM (armbian-config)"; exit 1; }
echo 0 > /sys/class/pwm/$CHIP/export
P=/sys/class/pwm/$CHIP/pwm0
echo 20000 > $P/period # 20 us de periode
while :; do
for pct in $(seq 0 5 100) $(seq 95 -5 0); do
echo $(( (20000 * pct) / 100 )) > $P/duty_cycle
echo 1 > $P/enable
sleep 0.03
done
done
Vérification attendue
La LED module progressivement d'éteinte à pleine intensité puis inversement, sans scintillement perceptible. cat $P/duty_cycle suit la rampe. Si /sys/class/pwm est vide, le contrôleur PWM n'est pas activé : ajouter le overlay/device-tree ad hoc (armbian-config > overlays) puis redémarrer.
Erreurs fréquentes
- Écrire duty_cycle > period : comportement indéfini, garder duty <= period.
- Oublier enable=1 : la sortie reste à l'état inactif.
- Mauvais canal : le PWM D n'est pas forcément pwm0 ; tester chaque canal exporté.
- Charger la LED directement sur la broche : rester sous le courant admissible GPIO (limite du wiki non reconfirmée) sinon passer par un transistor.
- >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash