🤖

Mouvement de base Intermédiaire

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

🎯 Objectifs

🛠️ Matériel nécessaire

🫐 Raspberry Pi Pico 🤖 Robot Otto assemblé 🔋 Alimentation 5V 💻 Thonny IDE

📖 Cours

Le robot différentiel

Notre robot Otto est un robot différentiel : il a deux roues indépendantes. En contrôlant la vitesse et la direction de chaque roue séparément, on peut faire tous les mouvements :

Mouvement Roue Gauche Roue Droite
⬆️ Avancer ↺ CCW_MAX ↻ CW_MAX
⬇️ Reculer ↻ CW_MAX ↺ CCW_MAX
↩️ Tourner gauche ↻ CW_MAX ↻ CW_MAX
↪️ Tourner droite ↺ CCW_MAX ↺ CCW_MAX

Le code complet — 1.Servo.py

Voici le fichier de mouvements de base de notre robot. Copie-le sur le Pico sous le nom 1.Servo.py :

pico/1.Servo.py
from machine import Pin, PWM, time_pulse_us import time # PWM setup servo_gauche = PWM(Pin(15)) servo_droit = PWM(Pin(16)) servo_gauche.freq(50) servo_droit.freq(50) # === Pulse Width Constants (16-bit duty) === STOP = 4915 # ~1.5 ms CW_MAX = 3276 # ~1.0 ms Max Sens Aiguille CCW_MAX = 6553 # ~2.0 ms Max Oppose def avance(temps_secondes = 2): servo_gauche.duty_u16(CCW_MAX) servo_droit.duty_u16(CW_MAX) time.sleep(temps_secondes) stop() def recule(temps_secondes = 2): servo_gauche.duty_u16(CW_MAX) servo_droit.duty_u16(CCW_MAX) time.sleep(temps_secondes) stop() def tourne_gauche(temps_secondes = 1): servo_gauche.duty_u16(CW_MAX) servo_droit.duty_u16(CW_MAX) time.sleep(temps_secondes) stop() def tourne_droite(temps_secondes = 1): servo_gauche.duty_u16(CCW_MAX) servo_droit.duty_u16(CCW_MAX) time.sleep(temps_secondes) stop() def stop(): servo_gauche.duty_u16(STOP) servo_droit.duty_u16(STOP)

Analyse du code

Points importants :

Utiliser les fonctions de mouvement

main.py — exemple de parcours
# Importe toutes les fonctions de 1.Servo.py from Servo import * # ou copie le code directement import time # Parcours carré avance(1) # avance 1 seconde time.sleep(0.2) # petite pause tourne_droite(0.5) # tourne 90° (calibre la durée !) time.sleep(0.2) avance(1) time.sleep(0.2) tourne_droite(0.5) time.sleep(0.2) avance(1) time.sleep(0.2) tourne_droite(0.5) time.sleep(0.2) avance(1) # quatrième côté du carré stop()
⏱️
Pour faire un virage à 90°, tu dois calibrer la durée expérimentalement. Commence par tourne_droite(0.5) et ajuste jusqu'à obtenir exactement 90°. La durée dépend de la vitesse des servos et du poids du robot !

Ajouter des vitesses variables

Vitesses variables
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 def avance_vitesse(vitesse, temps): # vitesse entre 0.0 (lent) et 1.0 (max) # Calcule le duty_u16 proportionnellement g_duty = int(STOP + (CCW_MAX - STOP) * vitesse) d_duty = int(STOP - (STOP - CW_MAX) * vitesse) servo_gauche.duty_u16(g_duty) servo_droit.duty_u16(d_duty) time.sleep(temps) stop() def stop(): servo_gauche.duty_u16(STOP) servo_droit.duty_u16(STOP) # Exemple : avance à 50% de vitesse pendant 2 secondes avance_vitesse(0.5, 2)

✏️ Exercices

Exercice 1

Calibration des virages

Trace un carré sur le sol (par exemple avec du masking tape). Calibre les durées de tourne_droite() et tourne_gauche() pour que le robot fasse exactement 90°. Note les valeurs dans ton cahier !

Exercice 2

Parcours en forme de 8

Programme le robot pour qu'il trace un 8 : avance, tourne droite à 180°, avance, tourne gauche à 180°. Répète 3 fois pour voir si c'est précis.

Exercice 3 — Défi

Ton initiale

Programme le robot pour qu'il trace la première lettre de ton prénom sur le sol. Tu dois calculer les angles et les distances. Prends une photo du résultat !

🧠 À retenir

  • Robot différentiel : deux roues indépendantes contrôlent tous les mouvements
  • Avancer : roues dans des sens opposés (car montées face à face)
  • Tourner : roues dans le même sens
  • Paramètre par défaut : def avance(temps=2)
  • Toujours appeler stop() après un mouvement
  • Calibre les durées de virage expérimentalement sur ta surface réelle !
← Leçon 2 — Servomoteurs Leçon 4 — Parcours →