tourne_ralenti()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).
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 :
Pour travailler avec des angles en degrés, on crée une fonction de conversion :
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).
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 :
##### 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)##### 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)La version avancée de la classe Servo permet un mouvement progressif et fluide :
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.
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.
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().
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.
pwm = 26 + (angle / 180) * (128 - 26)