🛠 PWM : faire respirer la LED bleue
Objetivos
Dominar la salida PWM del ODROID-XU4 bajo Linux mainline: el device tree expone el canal PWM0 para el ventilador y PWM2 para el LED azul heartbeat. Liberarás el trigger del kernel para controlar tú mismo el ciclo de trabajo y hacer que el LED «respire».
Material
- ODROID-XU4 bajo Armbian (kernel 6.6.x, device tree mainline exynos5422-odroidxu4)
- Acceso root (sudo); no se requiere cableado, el LED azul está integrado
Código completo
#!/usr/bin/env bash
# respirer.sh — fade de la LED bleue heartbeat (PWM2) du XU4
set -euo pipefail
CHIP=/sys/class/pwm/pwmchip0
# 1) Liberer le trigger heartbeat pose par le device tree
if [ -e /sys/class/leds/odroid:blue:heartbeat/trigger ]; then
echo none | sudo tee /sys/class/leds/odroid:blue:heartbeat/trigger
fi
# 2) Exporter le canal PWM2 (PWM0 = ventilateur, ne pas y toucher !)
echo 2 | sudo tee "$CHIP/export" >/dev/null 2>&1 || true
PWM="$CHIP/pwm2"
sudo tee "$PWM/period" >/dev/null <<< 1000000 # periode 1 ms (ns)
for d in $(seq 0 50000 1000000) $(seq 1000000 -50000 0); do
echo "$d" | sudo tee "$PWM/duty_cycle" >/dev/null
sleep 0.03
done
Verificación esperada
El LED azul integrado sube y baja progresivamente su luminosidad. cat $PWM/duty_cycle sigue los valores escritos. El ventilador (pwm0, controlado por el governor térmico a 50/60/70 °C) continúa funcionando con normalidad.
Errores frecuentes
- Olvidar escribir
noneen el trigger heartbeat: el kernel mantiene el control del canal y tus escrituras se ignoran. - Exportar el canal 0: alimenta el pwm-fan, recuperarlo rompe la regulación térmica.
- Confundir periodo y ciclo de trabajo: ambos se expresan en nanosegundos, duty > period es inválido.
- Ejecutar sin sudo: los archivos sysfs pertenecen a root.
- Descuidar el desgaste: el desvanecimiento en bucle infinito consume algo de CPU, añade un sleep.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash