⚙️

Servomoteur Avancé

🔵 Niveau 1 · BBC micro:bit · Leçon 7/8

🎯 Objectifs

🛠️ Matériel nécessaire

🔲 BBC micro:bit v2 🔌 Câble USB ⚙️ Servomoteur (ex: SG90) 🔋 Alimentation 5V externe 🔗 Fils de connexion
⚠️
Le servomoteur a besoin d'une alimentation externe ! Branche le fil de signal sur pin0 de la micro:bit, et alimente le servo en 5V séparément (GND commun avec la micro:bit).

📖 Cours

C'est quoi le PWM ?

PWM = Pulse Width Modulation (modulation de largeur d'impulsion). Le servo reçoit des impulsions électriques très rapides. La durée de chaque impulsion détermine la position du servo :

Ces impulsions se répètent 50 fois par seconde (50 Hz, donc période = 20ms).

Exemple 1 — Contrôle direct PWM

1.PWM.py
from microbit import * servo = pin0 servo.set_analog_period(20) # f = 50hz donc p = 20ms # PWM entre 26 et 128 servo.write_analog(26) sleep(500) servo.write_analog(56) sleep(500) servo.write_analog(126) sleep(500)

La micro:bit utilise des valeurs de 0 à 1023 pour le PWM analogique. Pour un servo standard :

Exemple 2 — Conversion angle → PWM

Pour travailler avec des angles en degrés, on crée une fonction de conversion :

2.Angle.py
from microbit import * servo = pin0 servo.set_analog_period(20) def servo_angle(pin, angle): # Fait un mapping d'angle (0-180) vers PWM (26-128) pwm = int(26 + (angle / 180) * (128 - 26)) pin.write_analog(pwm) servo_angle(servo,0) sleep(500) servo_angle(servo,45) sleep(500) servo_angle(servo,90) sleep(500) servo_angle(servo,135) sleep(500) servo_angle(servo,180) sleep(500)

La formule 26 + (angle / 180) * (128 - 26) est un mapping linéaire : elle fait correspondre proportionnellement les angles (0→180) aux valeurs PWM (26→128).

Exemple 3 — Classe Servo (programmation orientée objet)

Pour les projets complexes, on crée une classe qui encapsule tout le comportement du servo. Ce fichier se sauvegarde dans Servo.py et on l'importe dans main.py :

3.Class_Servo.py — fichier Servo.py
##### dans un fichier Servo.py from microbit import * class Servo: def __init__(self, pin, periode = 20): self.pin = pin self.pin.set_analog_period(periode) def tourne(self, angle): # Fait un mapping d'angle (0-180) vers PWM (26-128) pwm = int(26 + (angle / 180) * (128 - 26)) self.pin.write_analog(pwm)
3.Class_Servo.py — fichier main.py
##### dans le fichier main.py from microbit import * from Servo import Servo pince = Servo(pin0) pince.tourne(0) sleep(500) pince.tourne(45) sleep(500) pince.tourne(90) sleep(500) pince.tourne(180) sleep(500)

Exemple 4 — Mouvement lent (tourne_ralenti)

La version avancée de la classe Servo permet un mouvement progressif et fluide :

4.Ralenti.py — méthode tourne_ralenti
def tourne_ralenti(self, angle_final, pas=1, delai=20): if self.angle < angle_final: # tourne a partir de self.angle vers to angle_final while self.angle <= angle_final: self.tourne(self.angle) self.angle += pas sleep(delai) else: # sens oppose while self.angle >= angle_final: self.tourne(self.angle) self.angle -= pas sleep(delai)

Cette méthode incrémente l'angle de pas degrés toutes les delai millisecondes, créant un mouvement fluide.

✏️ Exercices

Exercice 1

Bras contrôlé par boutons

Utilise la fonction servo_angle() pour contrôler un servo avec les boutons : A → tourne de 10° vers la droite, B → tourne de 10° vers la gauche. Garde une variable angle_actuel et assure-toi qu'il reste entre 0 et 180.

Exercice 2

Pince automatique

Programme une séquence automatique avec la classe Servo : ouvre (0°) → attends 1s → ferme progressivement jusqu'à 90° → attends 2s → ouvre complètement (180°) → recommence. Utilise tourne_ralenti().

Exercice 3 — Défi

Contrôle par inclinaison

Contrôle le servo avec l'accéléromètre ! En inclinant la micro:bit à gauche ou à droite, le servo tourne dans la direction correspondante. Utilise accelerometer.get_x() qui retourne une valeur entre -1024 et +1024.

🧠 À retenir

  • PWM — signal qui contrôle les servomoteurs par la durée des impulsions
  • set_analog_period(20) — fixe la période à 20ms (50 Hz)
  • write_analog(valeur) — envoie le signal PWM (26 à 128 pour un servo)
  • Formule : pwm = 26 + (angle / 180) * (128 - 26)
  • class NomClasse: — définit une classe (un modèle d'objet)
  • __init__ — méthode exécutée à la création d'un objet
  • self — référence à l'objet lui-même dans la classe
← Leçon 6 — Listes & Fonctions Leçon 8 — Radio →