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 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()
Un problème?
Pas de son ?
- Est ce que le code est en cours d'exécution ?
- OUI:
Le défi
1. Sur