🛠 Variation d'intensité d'une LED avec PWM
Objetivos
Hacer variar la intensidad de un LED (respiración luminosa) con la salida PWM del Amlogic S905 expuesta en el conector J2, utilizando la interfaz sysfs PWM del kernel mainline (el DTS meson-gxbb-odroidc2 denomina las señales PWM D y PWM B en el conector).
Material
- ODROID-C2 bajo Armbian/mainline (interfaz /sys/class/pwm)
- LED + resistencia, opcionalmente transistor NPN (2N2222) si hay varios LED en carga
- Pin del J2 que lleva la señal PWM D (el DTS mainline lo nombra explícitamente en el conector J2)
- >
Código completo
#!/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
Verificación esperada
El LED modula progresivamente de apagado a intensidad máxima y viceversa, sin parpadeo perceptible. cat $P/duty_cycle sigue la rampa. Si /sys/class/pwm está vacío, el controlador PWM no está activado: añadir el overlay/device-tree correspondiente (armbian-config > overlays) y reiniciar.
Errores frecuentes
- Escribir duty_cycle > period: comportamiento indefinido, mantener duty <= period.
- Olvidar enable=1: la salida permanece en estado inactivo.
- Canal incorrecto: el PWM D no es necesariamente pwm0; probar cada canal exportado.
- Cargar el LED directamente en el pin: mantenerse por debajo de la corriente admisible del GPIO (límite del wiki no reconfirmado), de lo contrario usar un transistor.
- >
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