⚙️

Servomoteurs PWM Intermédiaire

🟢 Niveau 2 · Raspberry Pi Pico · Leçon 2/8

🎯 Objectifs

🛠️ Matériel nécessaire

🫐 Raspberry Pi Pico ⚙️ 2× Servo rotation continue 🔌 Câble USB 🔋 Alimentation 5V (powerbank) 🔗 Fils dupont
Les servomoteurs consomment beaucoup de courant ! N'alimente JAMAIS deux servos directement depuis le port USB du Pico. Utilise une alimentation externe 5V (batterie séparée) avec GND commun.

📖 Cours

Servo standard vs Servo à rotation continue

Notre robot Otto utilise des servomoteurs à rotation continue — différents des servos standard :

Le PWM 16-bit du Pico

Le Pico utilise un PWM 16-bit — plus précis que la micro:bit. Les valeurs vont de 0 à 65535 :

Constantes PWM
# Valeurs PWM pour servo à rotation continue (16-bit, 50Hz) STOP = 4915 # ~1.5 ms → servo arrêté CW_MAX = 3276 # ~1.0 ms → rotation max sens aiguille CCW_MAX = 6553 # ~2.0 ms → rotation max sens inverse # Formule : duty = (temps_ms / 20ms) * 65535 # 1.0ms → 3276, 1.5ms → 4915, 2.0ms → 6553

Configuration du PWM sur le Pico

Configuration PWM
from machine import Pin, PWM import time # Créer les objets PWM sur GP15 et GP16 servo_gauche = PWM(Pin(15)) servo_droit = PWM(Pin(16)) # Régler la fréquence à 50Hz (20ms de période) servo_gauche.freq(50) servo_droit.freq(50) # Définir les constantes de vitesse STOP = 4915 CW_MAX = 3276 CCW_MAX = 6553 # Envoyer le signal d'arrêt servo_gauche.duty_u16(STOP) servo_droit.duty_u16(STOP)

Tester les directions

Test directions
from machine import Pin, PWM import time servo_gauche = PWM(Pin(15)) servo_droit = PWM(Pin(16)) servo_gauche.freq(50) servo_droit.freq(50) STOP = 4915 CW_MAX = 3276 CCW_MAX = 6553 # Test : tourne dans un sens pendant 2 secondes servo_gauche.duty_u16(CW_MAX) time.sleep(2) # Arrête servo_gauche.duty_u16(STOP) time.sleep(1) # Tourne dans l'autre sens servo_gauche.duty_u16(CCW_MAX) time.sleep(2) # Arrête servo_gauche.duty_u16(STOP)
💡
Sur un servo à rotation continue, STOP (1.5ms) = arrêt. Les valeurs entre STOP et CW_MAX donnent différentes vitesses ! Essaie 4000 ou 4500 pour une rotation lente.

Calibration du point d'arrêt

Chaque servo est légèrement différent. Si ton servo tourne encore avec la valeur STOP = 4915, ajuste légèrement :

Calibration
from machine import Pin, PWM import time servo = PWM(Pin(15)) servo.freq(50) # Trouve le point exact où le servo s'arrête # Commence par 4915 et ajuste par ±50 jusqu'à arrêt complet STOP = 4915 # modifie ce nombre si le servo ne s'arrête pas servo.duty_u16(STOP) print("Le servo devrait être arrêté. Ajuste STOP si besoin.")

✏️ Exercices

Exercice 1

Calibration

Trouve la valeur exacte de STOP pour tes deux servos. Note-les ! Ils peuvent être légèrement différents (ex: servo gauche = 4900, servo droit = 4930).

Exercice 2

Vitesses progressives

Programme un servo pour qu'il démarre doucement, accélère progressivement jusqu'à la vitesse max, puis décélère et s'arrête. Utilise une boucle for avec des valeurs PWM intermédiaires.

Exercice 3

Deux servos en parallèle

Branche les deux servos. Envoie CW_MAX sur les deux en même temps. Observe : si les servos sont face à face (comme dans le robot), ils doivent tourner dans des sens opposés pour aller "dans la même direction". Identifie quelles valeurs font "avancer" le robot.

🧠 À retenir

  • PWM(Pin(n)) — crée un objet PWM sur le pin n
  • servo.freq(50) — fréquence 50Hz (obligatoire pour les servos)
  • servo.duty_u16(valeur) — envoie le signal (0 à 65535)
  • STOP = 4915 (~1.5ms) — servo à rotation continue arrêté
  • CW_MAX = 3276 (~1.0ms) — rotation maximale sens horaire
  • CCW_MAX = 6553 (~2.0ms) — rotation maximale sens anti-horaire
  • Alimente toujours les servos avec une source externe !
← Leçon 1 — Intro Pico Leçon 3 — Mouvement →