🛠 Variation d'intensité d'une LED avec le PWM
Objetivos
Hacer variar la intensidad de un LED (efecto de fundido «respiración») con la salida PWM del ODROID-N2. El conector de 40 pines expone 6 canales PWM (especificaciones CNX); aquí nos centramos en la línea PWM asociada a GPIOX_4 (pin físico 13). Bajo el kernel mainline, el controlador PWM Amlogic (AO/EE) aparece en /sys/class/pwm.
Material
- ODROID-N2/N2+ con Armbian (mainline)
- 1 LED + resistencia de 330 Ω entre PIN_13 y GND (PIN_25)
- Paquete
pwmconfigo acceso sysfs; un transistor (2N2222 + resistencia de 1 kΩ) si el LED consume más - >
Código completo
#!/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
Verificación esperada
Tras la exportación, /sys/class/pwm/pwmchip0/pwm0/ contiene period, duty_cycle, enable. El script hace variar la luminosidad del LED de apagado a intensidad máxima en pasos del 5 % (ciclo de trabajo 0 → 50000/500000 ns). cat duty_cycle sigue el valor escrito. Para la frecuencia, 20 kHz: period=50000, duty=25000 para el 50 %.
Errores frecuentes
exportrechaza el canal: está reservado por el device-tree (controlador de pantalla o ventilador); probar conecho 1o otro pwmchip.- period/duty en el orden incorrecto: escribir period antes que duty, de lo contrario duty > period es rechazado (EINVAL).
- Frecuencia demasiado baja: por debajo de ~100 Hz el LED parpadea visiblemente; mantenerse entre 1–20 kHz.
- Confundir duty_ratio y duty_cycle: duty_cycle se expresa en nanosegundos, no en porcentaje.
- El canal PWM del pin 13 no está activado en el DTB: en algunas imágenes se necesita un overlay (
dtoverlay/overlays=en la config) — > - Olvidar
enable=1: no parpadea nada aunque duty_cycle sea distinto de cero.
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