P2E-Servo-FR
Le servo-moteur
Qu'est-ce qu'un Servo-Moteur ?
Un servo-moteur est un dispositif typiquement utilisé en modélisme pour, par exemple, contrôler la direction d'une voiture télécommandée, l'orientation d'un avion.
Sur un servo-moteur, l'angle de rotation de l'axe reste sur une position fixe. L'angle de l'axe peut être positionné entre 0 et 90° (modélisme) ou 0 et 180°C (hobbyiste) en fonction du signal communiqué au servo-moteur (la demande du microcontroleur).
Un servo-moteur comprend :
- Un moteur électrique (continu), généralement assez petit.
- Des engrenages réducteur en sortie du ce moteur (pour avoir moins de vitesse et plus de couple ou de force).
- Un capteur type "potentiomètre" raccordé sur la sortie.
Il s'agit donc d'une résistance qui varie en fonction de l'angle, ce qui permet de mesurer l'angle de rotation sur l'axe de sortie. - Un asservissement électronique pour contrôler la position/rotation, de cet axe de sortie pour le maintenir à la bonne position.
Contrôler un servo-moteur
Le servo-moteur s'alimente avec une tension de 5V (6V max) et utilise un signal PWM particulier pour communiquer l'angle de rotation au moteur.
Le temps d'impulsion du signal permet de déterminer la position du servo-moteur:
- 1.25 ms = 0 degré
- 1.50 ms = 90 degrés
- 1.75 ms = 180 degrés
Source: Area RC-Bot
Raccordement d'un servo-moteur
Puisque l'interface de commande est assez simple, un servo-moteur se raccorde avec seulement 3 fils (la masse, +5v et la commande d'impulsion). Les raccordements les plus standardisés sont:
Noir, Rouge, Blanc :
- Noir: Raccordé à la Masse,
- Rouge: Alimentation moteur et logique de commande. Raccordé à VCC 5v,
- Blanc: Commande de la position du servo-moteur.
Marron, Rouge, Jaune :
Couleurs du standard Graupner.
- Marrons: Raccordé à la Masse,
- Rouge: Alimentation moteur et logique de commande. Raccordé à VCC 5v,
- Jaune: Commande de la position du servo-moteur.
Les autres cas :
La plupart des servo-moteur ont 3 conducteurs avec des couleurs noir, rouge et blanc OU brun, rouge et orange/jaune/etc:
- brun ou noir = MASSE/GND (borne négative de l'alimentation)
- Rouge = alimentation servo (Vservo, borne positive de l'alimentation)
- Orange, jaune, blanc ou bleu = Commande de position du servo
Bibliothèque
La bibliothèque servo utilisée dans ces exemples est déjà installée sur le Raspberry-Pi Pico du Pico-2-Explorer.
Il est possible de l'installée sur un autre Raspberry-Pi Pico depuis le dépôt micropython-pico disponible ici sur Github.
Cas pratique
Cet exemple se déroulera en deux temps:
- Positionnement sur une position arbitraire pour démontrer le fonctionnement d'un servo-moteur.
- Positionnement en fonction de la position d'un potentiomètre, très utile pour déterminer l'amplitude d'un servo-moteur.
Branchement
Afin d'éviter tout incident de polarisation, il est préférable de brancher:
- le +5V en premier. Celui-ci se connecte au centre du connecteur.
- la masse (GND) en second
- le signal en dernier (sur GP22).
![]() |
La tension 5V provient de la connexion USB. |
Code simple
Bien que la plupart des servo-moteurs hobbyistes disposent d'une amplitude angulaire proche de 180°, cet exemple se limitera volontairement à une amplitude de 90°.
Le script ci-dessous positionne l'angle du servo à 0° puis 45° puis 90° avant de revenir à 0°. Une pause de 2 secondes est insérée entre chaque positionnement d'axe. Cette série d'opérations est répétée 5 fois puis le script s'arrête.
Cet exemple est disponible dans le dépôt dans le sous-répertoire servo (voir servo-simple.py)
1 from machine import Pin
2 from servo import Servo
3 import time
4
5 s = Servo( Pin.board.GP22 )
6 for i in range( 5 ):
7 s.angle(0)
8 time.sleep(2)
9 s.angle(45)
10 time.sleep(2)
11 s.angle(90)
12 time.sleep(2)
13 s.detach()
14 print("That s all Folks")
Voici quelques explications utiles:
- Ligne 2: import de la classe Servo permettant de prendre le contrôle d'un servo-moteur.
- Ligne 5: création d'une instance de la classe Servo attachée à la broche GP22.
- Ligne 9: positionnement de l'axe à un angle de 45 degrés (valeur entre 0 et 180) et active l'asservissement afin de maintenir cette angle.
- Ligne 13: Après l'exécution des 5 iterations, la méthode detach() libère l'asservissement du servo-moteur (jusqu'au prochain appel à la méthode angle()).
Code avancé
L'exemple ci-dessous utilise la position du potentiomètre (de 0 à 3.3V) pour positionner l'axe du servo-moteur entre 0 et 180°.
La relation entre orientation du potentiomètre et l'angle de l'axe suit une relation proportionnelle.
Ce script, disponible sous le nom "[servo-pot.py]", est très pratique pour tester rapidement les capacités d'un servo-moteur.
1 from machine import Pin, ADC
2 from servo import Servo
3 from maps import map
4 import time
5
6 Pin( 23, Pin.OUT, value=True )
7
8 last_ticks = time.ticks_ms()
9 a0 = ADC( Pin( Pin.board.GP28 ) )
10 s = Servo( Pin.board.GP22 )
11 while True:
12 val = 0
13 for i in range( 10 ):
14 val += (a0.read_u16()>>6)
15 val = val/10
16
17 angle = map(val, 0, 1023, 0, 180)
18 s.angle( int(angle) )
19
20 if time.ticks_diff( time.ticks_ms(), last_ticks ) > 1000:
21 print( 'adc_10bits=%5i , Angle=%3i' % (val, int(angle)) )
22 last_ticks = time.ticks_ms()
Voici quelques explications utiles:
- Ligne 6: désactivation du mode d'économie d'énergie pour réduire le bruit sur l'alimentation.
- Lignes 9 et 10: création d'une instance de la classe ADC sur l'entrée analogique du GPIO 28 --et-- de la classe Servo attachée au GPIO 22.
- Lignes 12 à 15: lecture sur l'entrée analogique. Calcul par valeur moyenne réduite à 10 bits (0 à 1023, procédé détaillé dans la section "entrée analogique").
- Ligne 17: utilisation de la fonction map(), pour convertir la valeur 10 bits (de 0 à 1023) vers une valeur de sortie de 0 à 180 (valeur angulaire).
- Ligne 18: la valeur retournée par map() pouvant être un nombre décimal (float), celle-ci est convertir en entier avec int() avant de communiquer l'angle au servo avec s.angle().
- Lignes 20 à 22: section utilisée pour afficher l'angle d'asservissement une fois par seconde au plus (afin de ne pas surcharger la sortie REPL).
Un problème?
Le servo ne bouge pas ?
- Vérifier le branchement électrique du servo.
- Vérifier que le signal est bien branché sur GP22
- Vérifier que le servo est bien alimenté avec 5V (et non 3.3V).
Le potentiomètre ne bouge pas l'angle du servo ?
- Vérifier les points ci-avant.
- Est-ce bien le second script "servo-pot.py" qui est exécuté ?
- Le potentiomètre est il branché sur le GPIO 28 ? (le script doit afficher une valeur ADC toute les secondes)
Le défi
Brancher le bouton Btn 1 sur le GPIO 20.
Modifier le script servo-pot.py afin de détecter la pression sur le bouton.
A chaque pression du bouton, le servo passe successivement sur les positions angulaires 0°, 90°, 180° avant de recommencer le cycle. Se faisant, il prend le pas sur le fonctionnement du potentiomètre.
Toute modification du potentiomètre re-aligne la position angulaire du servo sur celle du potentiomètre.