🛠 Variation d'intensité d'une LED avec le PWM
Objetivos
Hacer variar la intensidad de un LED externo en el ODROID-C4 utilizando la salida PWM del SoC Amlogic S905X3 (el conector de 40 pines expone hasta 6 canales PWM). Aprenderás a exportar un canal a través de /sys/class/pwm, a razonar en términos de periodo (ns) y ciclo de trabajo (duty_cycle), y a escribir una respiración (breathing) en bash.
Material
- ODROID-C4 con Armbian current
- 1 LED + resistencia de 330 Ω (los pines son de 3,3 V: nunca uses un LED sin resistencia)
- Cables jumper
- >
Código completo
#!/usr/bin/env bash
# respiration.sh - fade d'une LED sur pwmchip0 / channel 0
# Adapter le numéro de chip/canal selon le brochage confirmé.
CHIP=/sys/class/pwm/pwmchip0
sudo sh -c "echo 0 > $CHIP/export" 2>/dev/null || true
sleep 0.3
CH=$CHIP/pwm0
sudo sh -c "echo 20000 > $CH/period" # période 20 kHz (50 µs)
sudo sh -c "echo 1 > $CH/enable"
for step in $(seq 0 20 100) ; do # montée 0 -> 100 %
duty=$(( 20000 * step / 100 ))
sudo sh -c "echo $duty > $CH/duty_cycle"
sleep 0.05
done
for step in $(seq 100 -20 0) ; do # descente 100 -> 0 %
duty=$(( 20000 * step / 100 ))
sudo sh -c "echo $duty > $CH/duty_cycle"
sleep 0.05
done
sudo sh -c "echo 0 > $CHIP/unexport"
Verificación esperada
El LED aumenta progresivamente su luminosidad y luego disminuye en aproximadamente un segundo, sin parpadeo perceptible (20 kHz). cat $CH/duty_cycle sigue los valores escritos. Después de ejecutar el script, pwmchip0 ya no contiene la carpeta pwm0 (canal liberado). Si $CHIP no existe, lista ls /sys/class/pwm/ y verifica que el overlay PWM esté activado en /boot/armbianEnv.txt (overlay_add=).
Errores frecuentes
- Escribir
duty_cycleantes deperiod: el valor se sobrescribe o se rechaza; siempre define primero el periodo y luego el ciclo de trabajo. - Confundir nanosegundos y microsegundos: el periodo está en ns (20000 = 20 µs = 50 kHz).
- Olvidar la resistencia: un cortocircuito LED-GND en un pin de 3,3 V puede dañar el banco GPIO.
exportdevuelve «Device or resource busy»: el canal está reservado por el kernel o un overlay; elige otro canal.- >
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