🛠 Servo moteur sur PWM0 (GPIO18) : 50 Hz et 2,5 à 12,5 %
Objectifs
Piloter un servo d'angle classique avec le PWM matériel du CM1. Sur BCM2835, le canal PWM0 est routé en alternate sur GPIO18. Un servo standard attend une période de 20 ms (50 Hz) et lit la position sur la largeur d'impulsion : 1 ms environ au centre, la plage utile s'étend de 0,5 ms (2,5 % de rapport cyclique) à 2,5 ms (12,5 %). On configure le PWM via le device tree overlay pwm puis en sysfs/pigpio, sans PWM logiciel qui jittere.
Matériel
- Un Compute Module 1 sur IO Board
- 1 servo d'angle (SG90/MG90S) alimenté séparément en 5 V si couple demandé
- GPIO18 (broche 12 de J6) vers le fil signal, masses communes
Code complet
# Activer le PWM matériel
echo 'dtoverlay=pwm-28' | sudo tee -a /boot/config.txt
sudo reboot
# Pilotage pigpio (daemon PWM matériel)
sudo pigpiod
pigs p 18 0 # arrêt
pigs p 18 64 # ~1,56 % -> butée gauche (50 Hz)
pigs p 18 128 # ~3,1 % -> centre
pigs p 18 256 # ~6,25 %
pigs p 18 512 # ~12,5 % -> butée droite
# Balayage doux
for d in 64 96 128 160 192 224 256; do pigs p 18 $d; sleep 0.3; done
Vérification attendue
Le servo se place nettement sur chaque consigne et tient sa position sans bourdonnement excessif. La plage utile s'étend entre pigs p 18 64 (0,5 ms/2,5 %) et pigs p 18 512 (2,5 ms/12,5 %) pour une sortie 8 bits à 50 Hz ; au-delà de 12,5 %, le servo bute et consomme. Le PWM matériel ne présente pas les trous de la méthode logicielle pendant les accès SD.
Erreurs fréquentes
- Utiliser le PWM logiciel (mode
pwmsans matériel) : des micro-coupures font trembler le servo ; vérifier que l'overlay est bien actif (ls /sys/class/pwm). - Alimenter le servo depuis le 3,3 V du CM1 : sous-dimensionné, le SoC se réinitialise au démarrage du moteur ; alimenter en 5 V externe avec masse commune.
- Rapport cyclique hors plage : au-dessus de 12,5 % ou sous 2,5 %, le servo cale en butée et chauffe.
- Confondre PWM0 (GPIO18) et PWM1 (GPIO13) : le brochage alternate diffère, lire la table des fonctions du BCM2835.
- Oublier la masse commune entre alim servo et CM1 : le servo vibre aléatoirement.
Autres tutoriels pour cette carte
- Flasher l'eMMC du CM1 avec rpiboot et le jumper J4
- Premier boot : Bullseye legacy, rails 3,3 V et ordre des alimentations
- Première LED sur GPIO17 : banques, courants et broches réservées
- BME280 sur I2C0 (GPIO2/3) : activer i2c_arm et lire l'ID 0x60
- Caméra officielle sur le connecteur FPC CSI du CM1
- Boot sans EEPROM : fallback USB et bootcode.bin sur eMMC
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash