🛠 Variation d'intensité d'une LED avec PWM (sysfs pwm)
Objetivos
Hacer « respirar » un LED variando el ciclo de trabajo de una señal PWM a través de la interfaz sysfs /sys/class/pwm. El conector de 40 pines multiplexa salidas PWM, y el LED verde de estado de la placa está controlado por PWM (pwm2 en mainline); el ventilador de 5 V del conector dedicado también está regulado por PWM (velocidad mínima del ventilador a 55 °C, velocidad máxima a 65 °C en el device-tree mainline).
Material
- Orange Pi 5 Plus alimentada (5 V / 4 A, conector Type-C cerca del puerto Ethernet)
- LED + resistencia de 330 Ω en un pin multiplexado PWM del conector (consultar la figura oficial « Pin Definition »; el conector multiplexa PWM entre UART/I2C/SPI/CAN/I2S)
- Terminal; no se requieren paquetes adicionales (el PWM sysfs está en el kernel)
Código completo
# 1. Trouver le contrôleur PWM exposé (pwmchipN)
cat /sys/class/pwm/pwmchip*/uevent 2>/dev/null
# Attacher le canal 0 du premier contrôleur (adapter le numéro à votre carte) :
echo 0 | sudo tee /sys/class/pwm/pwmchip0/export
P=/sys/class/pwm/pwmchip0/pwm0
echo 20000000 | sudo tee $P/period # période 20 ms -> 50 Hz
echo 0 | sudo tee $P/duty_cycle # 0 % : LED éteinte
echo 1 | sudo tee $P/enable # activer la sortie
# 2. Respiration : montée 0 -> 100 % puis descente, par pas de 1 %
while :; do
for d in $(seq 0 200000 20000000); do echo $d | sudo tee $P/duty_cycle >/dev/null; sleep 0.02; done
for d in $(seq 20000000 -200000 0); do echo $d | sudo tee $P/duty_cycle >/dev/null; sleep 0.02; done
done
# Stop : Ctrl-C, puis echo 0 | sudo tee $P/enable
# Nettoyage : echo 0 | sudo tee /sys/class/pwm/pwmchip0/unexport
Verificación esperada
El LED sube y baja de luminosidad de forma continua (respiración de aproximadamente 1,6 s por ciclo). cat $P/duty_cycle sigue los valores escritos; la frecuencia permanece en 50 Hz (período de 20 000 000 ns) independientemente de la luminosidad.
Errores frecuentes
- Escribir en un pwmchip no exportado: « Permission denied » en
/export= el controlador no está activado en el device-tree; verificar consudo cat /sys/kernel/debug/pwmla lista de controladores y canales libres. - Confundir period y duty_cycle: period fija la frecuencia, duty_cycle la intensidad; duty_cycle > period se satura silenciosamente.
- Olvidar
enable=1: la salida permanece inactiva, el LED no cambia. - >
Otros tutoriales para esta placa
- Allumer une LED via le GPIO 40 broches (libgpiod)
- Lire un bouton poussoir et afficher dans la console
- Premier script Python : fiche signalétique de la carte et LED
- Lire un capteur I2C (BMP280) depuis le bus du connecteur
- Exploiter le double Ethernet 2,5 GbE et sécuriser le SSH
- Booter sur NVMe (M.2 PCIe 3.0 x4) et récupérer une carte brique via MaskROM
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash