Un servo est un moteur qui utilise un ensemble d’engrenages pour créer un mouvement rotatif. Les véhicules radiocommandés et les projets d’animation les utilisent souvent pour générer du mouvement. Ils varient en taille et en capacité, mais les petits servos sont bon marché et constituent un excellent moyen d’introduire du mouvement dans vos projets Raspberry Pi.
Cet article vous expliquera comment connecter un petit servo à votre Pi de la manière la plus simple possible avec le minimum de matériel.
les pièces
Tu auras besoin de :
- Un Raspberry Pi
- Carte SD avec le dernier système d’exploitation Raspbian
- Petit servo (TowerPro 9g ou équivalent)
Codes de couleur des servomoteurs
Les servos ont généralement trois fils. Deux sont pour l’alimentation et un pour le signal de données. La coloration de ces fils varie selon les fabricants mais ils suivent généralement l’un des schémas ci-dessous :

Le mien suit le schéma rouge/orange/marron.
Servos et PWM
Il existe de nombreuses ressources qui expliquent le fonctionnement des servos. Le point important est qu’ils prennent un signal de données PWM (Pulse Width Modulation). Il s’agit d’une séquence d’impulsions haut-bas où la synchronisation entre chaque impulsion détermine la position rotative.

Dans cet exemple de base, nous utiliserons un logiciel pour générer le signal PWM. Ce n’est pas aussi précis qu’un signal PWM généré par le matériel, mais assez bon pour les bases.
configuration materielle
La configuration la plus simple consiste à connecter le servo directement au Pi. Cela convient aux petits servos qui ne sont pas censés effectuer des tâches exigeantes. L’alimentation sera tirée via la broche 5V du Pi et est soumise à certaines limitations. Si votre servo consomme trop de courant, cela peut affecter le fonctionnement des périphériques USB ou du Pi lui-même.
N’importe quelle broche GPIO peut être utilisée
| Fil d’asservissement | Couleur | GPIO Raspberry Pi | commentaires |
|---|---|---|---|
| Puissance (+) | rouge | Broche 2 (5V) | |
| Signal/Données | Blanc/Jaune/Orange/Bleu | Broche 11 (GPIO17) | |
| Terre | Noir marron | Broche 9 | N’importe quelle broche de terre peut être utilisée |
N’importe quelle broche de masse du Pi peut être utilisée. Veuillez vous référer à l’image de l’en-tête GPIO du Raspberry Pi pour localiser les broches de terre supplémentaires.

Dans cet exemple, j’ai utilisé la broche 9 (noir) pour la masse. Le fil d’alimentation (rouge) est connecté à la broche 2. Le fil de signal (orange) peut être connecté à n’importe quelle broche GPIO mais je préfère utiliser la broche 11 (GPIO17) car elle est à côté de la broche 9 et cela facilite un peu le câblage. Si vous utilisez un autre GPIO, assurez-vous de mettre à jour les exemples de scripts avec le bon numéro.
Exemple de script d’asservissement Python #1
Une fois connecté, le moyen le plus simple de faire bouger votre servo est d’utiliser la bibliothèque Gpiozero dans un script Python. Il est installé par défaut dans la dernière image Raspbian.
Vous pouvez utiliser ce script Python :
from gpiozero import Servo
from time import sleep
myGPIO=17
servo = Servo(myGPIO)
while True:
servo.mid()
print("mid")
sleep(0.5)
servo.min()
print("min")
sleep(1)
servo.mid()
print("mid")
sleep(0.5)
servo.max()
print("max")
sleep(1)
Copiez le code ci-dessus dans un nouveau fichier texte nommé « servo1.py » ou téléchargez directement sur votre Pi depuis mon référentiel Bitbucket en utilisant :
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo1.py
Je recommande d’utiliser wget plutôt que de copier-coller afin de ne pas perdre l’indentation correcte.
Pour exécuter le script, utilisez la commande suivante :
python servo1.py
Le servo doit maintenant se déplacer entre ses positions minimale, médiane et maximale avec un petit délai entre les deux.
Exemple de script Python Servo #2 – Plage d’étalonnage
Le premier script utilise les valeurs par défaut de Gpiozero. Il suppose que le servo utilise une largeur de trame de signal de 20 ms. La largeur d’impulsion pour la rotation minimale et maximale est supposée être de 1 ms et 2 ms. Cette information devrait être disponible dans la spécification du servo et j’éviterais les vendeurs qui ne fournissent pas ces données.
J’ai trouvé qu’avec les paramètres par défaut, mon servo ne bougeait que de +45/-45 degrés. J’ai modifié les paramètres de largeur d’impulsion afin d’obtenir une rotation complète de 90 degrés dans les deux sens. Le script ci-dessous le démontre :
from gpiozero import Servo
from time import sleep
myGPIO=17
myCorrection=0.45
maxPW=(2.0+myCorrection)/1000
minPW=(1.0-myCorrection)/1000
servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)
while True:
servo.mid()
print("mid")
sleep(0.5)
servo.min()
print("min")
sleep(1)
servo.mid()
print("mid")
sleep(0.5)
servo.max()
print("max")
sleep(1)
Copiez le code ci-dessus dans un nouveau fichier texte nommé « servo2.py » ou téléchargez-le directement sur votre Pi depuis mon référentiel Bitbucket en utilisant :
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo2.py
Je recommande d’utiliser wget plutôt que de copier-coller afin de ne pas perdre l’indentation correcte.
Pour exécuter le script, utilisez la commande suivante :
python servo2.py
Le servo doit maintenant se déplacer entre ses positions minimale, médiane et maximale avec un petit délai entre les deux.
Dans cet exemple, la largeur d’impulsion minimale est diminuée par rapport à la valeur par défaut de 1 par une correction de 0,45 à 0,55 ms. La largeur d’impulsion maximale est augmentée de la valeur par défaut de 2 de 0,45 à 2,45 ms. Cela a donné à mon servo une rotation complète de 90 degrés dans les deux sens. Les valeurs « 0,55 » et « 2,45 » sont divisées par 1000 pour les convertir en millisecondes.
Il n’y a rien de magique à propos de « 0.45 ». C’était juste la correction qui fonctionnait le mieux pour mon servo.
Pour calculer ces nombres, j’ai commencé par :
myCorrection=0 maxPW=(2.0+myCorrection)/1000 minPW=(1.0-myCorrection)/1000
et augmenté/diminué le nombre de corrections par incréments de 0,05. Cela m’a permis de trouver le plus grand changement que je pouvais faire avant que le servo ne semble mécontent.
« myCorrection » doit être un nombre compris entre 0 et 1, mais il est peu probable qu’il soit jamais nécessaire d’être 1 !
Exemple de script servo #3 – Positionnement précis
Une fois que vous avez déterminé les valeurs de largeur d’impulsion min et max, vous pouvez utiliser la fonction « valeur » pour positionner le bras d’asservissement n’importe où entre ses limites.
La définition du paramètre « valeur » sur un nombre compris entre -1 et +1 déplace le bras entre ses positions minimale et maximale. Les exemples comprennent :
# Minimum position servo.value=-1 # Mid-point servo.value=0 # Maximum position servo.value=1 # Position between mid-point and maximum servo.value=0.5
Le script ci-dessous génère une plage de nombres de « valeurs » pour balayer le servo entre sa position maximale et minimale :
from gpiozero import Servo
from time import sleep
myGPIO=17
myCorrection=0
maxPW=(2.0+myCorrection)/1000
minPW=(1.0-myCorrection)/1000
servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)
while True:
print("Set value range -1.0 to +1.0")
for value in range(0,21):
value2=(float(value)-10)/10
servo.value=value2
print(value2)
sleep(0.5)
print("Set value range +1.0 to -1.0")
for value in range(20,-1,-1):
value2=(float(value)-10)/10
servo.value=value2
print(value2)
sleep(0.5)
Copiez le code ci-dessus dans un nouveau fichier texte nommé « servo3.py » ou téléchargez directement sur votre Pi depuis mon référentiel Bitbucket en utilisant :
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo3.py
Je recommande d’utiliser wget plutôt que de copier-coller afin de ne pas perdre l’indentation correcte.
Pour exécuter le script, utilisez la commande suivante :
python servo3.py
Le servo doit maintenant se déplacer entre ses positions minimale, médiane et maximale avec un petit délai entre les deux.
La première boucle « For » génère un ensemble d’entiers compris entre 0 et 20. La valeur est soustraite de 10 pour donner une plage de -10 à 10. La valeur est ensuite finalement divisée par 10 pour donner une plage de -1 à +1 . L’ensemble de valeurs d’origine contenait 20 entiers et nous avons encore 20 étapes dans la séquence. Pour augmenter le nombre d’étapes à 40, vous devez remplacer 20 par 40 et soustraire 20 au lieu de 10.
La deuxième boucle « For » fait la même chose mais génère une séquence de +1 à -1.
Prochaines étapes
Une fois que ces scripts fonctionnent, vous pouvez les modifier pour que le bras bouge comme vous le souhaitez. Par exemple, vous pouvez générer aléatoirement un nombre entre -1 et +1 pour positionner le bras entre ses limites maximale et minimale. Ou peut-être le déplacer en fonction de l’entrée d’un capteur ou d’un joystick ? Tant que vous pouvez convertir la plage de valeurs de votre capteur en une plage de -1 à +1, vous pouvez indiquer le résultat à l’aide d’un servo.
Jetez un œil au documentation officielle pour Gpiozero pour des informations techniques supplémentaires.
Voici une courte vidéo montrant le servo en mouvement à l’aide de ces trois exemples de scripts :

Où acheter de petits servos
Ces servos sont disponibles dans de nombreux points de vente, y compris [Amazon] et [eBay].
Vous pouvez en savoir plus sur ces appareils sur le page Wikipédia.
