Projet 15:Servo

1. Description
Les voitures intelligentes DIY intègrent généralement une fonction d’évitement automatique des obstacles. Lors du montage, nous avons besoin d’un servomoteur pour faire pivoter le module ultrasonique à gauche et à droite, puis détecter la distance entre la voiture et l’obstacle afin de contrôler la voiture pour éviter l’obstacle.
Si d’autres microcontrôleurs sont utilisés pour contrôler la rotation du servo, il faut définir une certaine fréquence et largeur d’impulsion pour contrôler l’angle du servo. Mais si la carte principale micro:bit est utilisée pour contrôler l’angle du servo, il suffit de définir l’angle de commande dans l’environnement de développement : l’impulsion correspondante sera automatiquement générée pour piloter la rotation du servo. Dans ce projet, vous apprendrez à faire osciller le servo entre 0° et 90°.
Le servomoteur est un actionneur rotatif à contrôle de position, composé principalement du boîtier, de la carte électronique, du moteur sans noyau, des engrenages et d’un capteur de position. Son principe de fonctionnement est que le servo reçoit le signal envoyé par le MCU ou le récepteur, génère un signal de référence avec une période de 20 ms et une largeur de 1,5 ms, puis compare la tension continue obtenue à la tension du potentiomètre et en déduit la différence de tension en sortie.
Pour le servo utilisé dans ce projet, le fil marron est la masse, le fil rouge est le + et le fil orange est le fil de signal.

2. Informations sur le Servo
L’angle de rotation du servomoteur est contrôlé en régulant le rapport cyclique du signal PWM (modulation de largeur d’impulsion). Le cycle standard du signal PWM est de 20 ms (50 Hz). Théoriquement, la largeur se situe entre 1 ms et 2 ms, mais en pratique elle varie entre 0,5 ms et 2,5 ms. La largeur correspond à l’angle de rotation de 0° à 180°. Notez toutefois que pour des marques différentes, le même signal peut entraîner des angles de rotation différents.

Après mesure, la plage d’impulsion du servo est de 0,65 ms à 2,5 ms. Pour un servo de 180 degrés, la relation de commande correspondante est la suivante :
Time on High Level |
Angle of the Servo |
Reference Signal Cycle Time(20ms) |
|---|---|---|
0.65ms |
0 degree |
0.65ms high level+19.35ms low level |
1.5ms |
90 degrees |
1.5ms high level+18.5ms low level |
2.5ms |
180degrees |
2.5ms high level+17.5ms low level |
3. Paramètres
Tension de fonctionnement : DC 4.8V ~ 6V
Plage d’angle de fonctionnement : environ 180 ° (à 500 → 2500 μsec)
Dimensions : 22.9*12.2*30mm
Plage de largeur d’impulsion : 500 → 2500 μsec
Vitesse à vide : 0.12 ± 0.01 s / 60 (DC 4.8V), 0.1 ± 0.01 s / 60 (DC 6V)
Courant à vide : 200 ± 20mA (DC 4.8V), 220 ± 20mA (DC 6V)
Couple d’arrêt : 1.3 ± 0.01kg · cm (DC 4.8V), 1.5 ± 0.1kg · cm (DC 6V)
Courant au blocage : ≦ 850mA (DC 4.8V) ≦ 1000mA (DC 6V)
Courant de repos : 3 ± 1mA (DC 4.8V), 4 ± 1mA (DC 6V)
Poids : 9±1g (sans bras de servo)
Température de fonctionnement : -30℃~60℃
Il convient de noter de ne pas utiliser l’alimentation d’un ordinateur, car si la demande en courant dépasse 500 mA, le servo peut être endommagé. Il est recommandé d’utiliser une batterie externe pour l’alimentation.
4. Préparation
Insérez la carte micro:bit dans la fente du keyestudio 4WD Mecanum Robot Car V2.0
Placez les piles dans le porte-piles
Passez l’interrupteur d’alimentation sur la position ON
Connectez le micro:bit à l’ordinateur via un câble USB
Ouvrez la version hors ligne de Mu.
5. Code de test
Lancez le logiciel Mu et ouvrez le fichier “Servo.py” pour importer le code. Vous pouvez également saisir le code vous-même dans la fenêtre d’édition.
(Remarque : Tous les mots et symboles en anglais doivent être écrits en anglais.)
Cliquez sur “Check” pour vérifier les erreurs dans le code. Le programme est erroné si des soulignements ou des curseurs sont affichés.
Si le code est correct, connectez le micro:bit à votre ordinateur et cliquez sur “Flash” pour téléverser le code sur la carte micro:bit.

from microbit import *
class Servo:
def __init__(self, pin, freq=50, min_us=600, max_us=2400, angle=180):
self.min_us = min_us
self.max_us = max_us
self.us = 0
self.freq = freq
self.angle = angle
self.analog_period = 0
self.pin = pin
analog_period = round((1/self.freq) * 1000) # hertz to miliseconds
self.pin.set_analog_period(analog_period)
def write_us(self, us):
us = min(self.max_us, max(self.min_us, us))
duty = round(us * 1024 * self.freq // 1000000)
self.pin.write_analog(duty)
sleep(100)
self.pin.write_analog(0)
def write_angle(self, degrees=None):
if degrees is None:
degrees = math.degrees(radians)
degrees = degrees % 360
total_range = self.max_us - self.min_us
us = self.min_us + total_range * degrees // self.angle
self.write_us(us)
Servo(pin14).write_angle(0)
display.show(Image.HAPPY)
while True:
Servo(pin14).write_angle(0)
sleep(1000)
Servo(pin14).write_angle(45)
sleep(1000)
Servo(pin14).write_angle(90)
sleep(1000)
Servo(pin14).write_angle(135)
sleep(1000)
Servo(pin14).write_angle(180)
sleep(1000)
4. Résultat du test
Après avoir téléchargé le code sur la carte avec succès, alimentez en externe (mettre le DIP switch sur ON), puis appuyez sur le bouton de réinitialisation du micro:bit.

La matrice de LED affiche un smiley et le servo tourne selon le motif 0°~45°~90°~135°~180°~0°.