servo-pwm-sysfs.sh
La interfaz PWM del kernel Linux (sysfs) es idéntica en todas las placas: periodo 20 ms, impulso 0,5-2,5 ms. Este script bash barre un servo en 3 ciclos y luego corta la alimentación para evitar el zumbido.
Hardware necesario
Una BeaglePlay (TI AM625) con la imagen Debian oficial, alimentada a 5 V/3 A por USB-C, con su zócalo mikroBUS, conector Grove y cinco LEDs de usuario. 1 servo de ángulo + alimentación externa de 5 V (nunca el 5 V de la placa por encima de un micro servo).
Cableado
Señal del servo en el pin PWM del conector (canal expuesto en /sys/class/pwm tras activarlo), alimentación externa, masas comunes.
Funcionamiento
export crea la carpeta del canal; period/duty_cycle van en nanosegundos. La función servo_angle convierte el ángulo en impulso; enable corta el señal limpiamente. En Debian: los cinco LEDs de usuario (USR0-4) los gestiona gpio-leds con triggers (heartbeat, disco…); para E/S cruda use libgpiod (gpiochip0) en una línea libre del mikroBUS.
Para ir más lejos
Exponer la función en un pequeño demonio Python (python3-pwmio o escrituras sysfs) para control remoto.
servo-pwm-sysfs.sh
#!/bin/bash
# Servo d'angle via /sys/class/pwm (interface noyau standard).
# Exemple pour le canal PWM 0 du connecteur (a adapter a la carte :
# ls /sys/class/pwm/ apres activation du PWM dans le firmware/overlay).
PWM="/sys/class/pwm/pwmchip0"
CANAL=0
# Exporter le canal s'il n'existe pas.
if [ ! -d "$PWM/pwm$CANAL" ]; then
echo $CANAL > "$PWM/export" 2>/dev/null || {
echo "PWM $CANAL indisponible : activer le canal (overlay/device tree)"; exit 1; }
sleep 1
fi
# Configuration : frequence 50 Hz = periode 20 000 000 ns.
echo 20000000 > "$PWM/pwm$CANAL/period"
echo 1500000 > "$PWM/pwm$CANAL/duty_cycle" # 1,5 ms = 90 degres
echo 1 > "$PWM/pwm$CANAL/enable"
servo_angle() { # $1 = angle 0..180
local ns=$((500000 + $1 * 2000000 / 180)) # 0,5..2,5 ms en ns
echo $ns > "$PWM/pwm$CANAL/duty_cycle"
}
for cycle in 1 2 3; do
for a in $(seq 0 10 180); do servo_angle $a; sleep 0.1; done
for a in $(seq 180 -10 0); do servo_angle $a; sleep 0.1; done
done
echo 0 > "$PWM/pwm$CANAL/enable" # coupe l'alimentation du servo
# Penser a « echo $CANAL > $PWM/unexport » au propre.