Dans ce tutoriel, vous apprendrez comment fonctionnent les servomoteurs et comment les contrôler avec Arduino. J’ai inclus des schémas de câblage et plusieurs exemples de code !
Les servomoteurs sont souvent utilisés dans les projets de robotique, mais on les trouve aussi dans les voitures RC, les avions, etc. Ils sont très utiles lorsque vous avez besoin d’un contrôle précis de la position et/ou d’un couple élevé.
Dans la première partie de cet article, nous examinerons le fonctionnement interne d’un servo et le type de signal de contrôle qu’il utilise. J’explique également les différences entre un servo standard et un servo à rotation continue. Ensuite, je vous montrerai comment connecter un servomoteur à l’Arduino.
Avec le premier exemple de code, vous pouvez contrôler à la fois la position et la vitesse du servomoteur. Ensuite, nous verrons comment contrôler un servo avec un potentiomètre et comment modifier le code pour contrôler plusieurs servos simultanément. Enfin, à la fin de cet article, vous trouverez les spécifications et dimensions de certains des servomoteurs les plus populaires sur le marché.
Fournitures
Composants matériels
| SG90 micro servo | × 1 | Amazon |
| MG996R high-torque servo | × 1 | Amazon |
| Arduino Uno Rev3 | × 1 | Amazon |
| Jumper wires | × 15 | Amazon |
| Breadboard | × 1 | Amazon |
| 10 kΩ potentiometer (type breadboard) | × 1 | Amazon |
| USB cable type A/B | × 1 | Amazon |
| 5V power supply (optionnel) | × 1 | Amazon |
Logiciel
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
Comment fonctionne un servomoteur ?
Un servomoteur hobby standard se compose généralement d’un petit moteur électrique, d’un potentiomètre, d’une électronique de contrôle et d’une boîte de vitesses. La position de l’arbre de sortie est constamment mesurée par le potentiomètre interne et comparée à la position cible définie par le contrôleur (par exemple, l’Arduino).
Selon l’erreur, l’électronique de contrôle ajuste la position réelle de l’arbre de sortie pour qu’elle corresponde à la position cible. C’est ce qu’on appelle un système de contrôle en boucle fermée.

La boîte de vitesses réduit la vitesse du moteur, ce qui augmente le couple à l’arbre de sortie. La vitesse maximale de l’arbre de sortie est généralement d’environ 60 tr/min.
Contrôle du servo
Les servomoteurs sont contrôlés en envoyant un signal PWM (modulation de largeur d’impulsion) à la ligne de signal du servo. La largeur des impulsions détermine la position de l’arbre de sortie. Lorsque vous envoyez au servo un signal avec une largeur d’impulsion de 1,5 millisecondes (ms), le servo se positionne à la position neutre (90 degrés). Les positions min (0 degrés) et max (180 degrés) correspondent généralement à une largeur d’impulsion de 1 ms et 2 ms respectivement. Notez que cela peut varier légèrement selon les types et marques de servos (par exemple 0,5 et 2,5 ms). Beaucoup de servos ne tournent que sur environ 170 degrés (voire seulement 90), mais la position médiane est presque toujours à 1,5 ms.
Pour ajuster les positions min et max dans le code, voir la section ci-dessous.

Les servomoteurs attendent généralement une impulsion toutes les 20 millisecondes ou à 50 Hz, mais beaucoup de servos RC fonctionnent bien dans une plage de 40 à 200 Hz.
Servo 360 degrés (continu) vs servo 180 degrés (standard)
La plupart des servos RC sont de type 180 degrés, ce qui signifie qu’ils ne peuvent tourner que dans une plage de 0 à 180 degrés. Cependant, des servos à rotation continue, aussi appelés servos 360 degrés, sont également disponibles.
Les servos à rotation continue réagissent différemment au signal de contrôle par rapport aux servos standard 180 degrés. Avec un servo à rotation continue, vous ne pouvez pas contrôler la position exacte de l’arbre de sortie, seulement la vitesse et la direction. Une impulsion de 1 ms mettra le servo à pleine vitesse dans un sens, et une impulsion de 2 ms à pleine vitesse dans l’autre. Une valeur proche de 1,5 ms arrête le moteur.
Si votre servo se comporte de manière inattendue, il se peut que vous utilisiez un servo continu au lieu d’un servo standard.


Pour plus d’informations, consultez notre tutoriel Positional versus Continuous Servos.
Comment connecter un servomoteur à l’Arduino ?
Le câblage d’un servomoteur est très simple car il suffit de connecter trois fils : alimentation, masse et signal. Le fil d’alimentation est généralement rouge et doit être connecté au 5 V.
Un micro servo comme le SG90 consomme environ 10 mA au repos et 100 à 250 mA en rotation, vous pouvez donc l’alimenter directement via la sortie 5 V de l’Arduino. Cependant, il faut être prudent avec plusieurs servos ou des servos plus gros.Si votre ou vos moteurs consomment plus de 300 mA, vous devez utiliser une alimentation externe pour éviter d’endommager l’Arduino !Voir le schéma ci-dessous pour l’utilisation d’alimentations externes.
Le fil de masse est généralement noir ou marron et doit être connecté à la broche GND de l’Arduino. Lors de l’utilisation d’une alimentation séparée, connectez la masse à la fois à l’Arduino et à l’alimentation.
Le fil de signal est généralement jaune, orange ou blanc et peut être connecté à n’importe quelle broche numérique de l’Arduino. Ici, je l’ai connecté à la broche numérique 9.

Les connexions sont également indiquées dans le tableau ci-dessous.
Connexions du servomoteur
| Servomoteur | Arduino |
|---|---|
| Alimentation (rouge) | 5 V |
| Masse (noir ou marron) | GND |
| Signal (jaune, orange ou blanc) | Broche 9 |
Comme mentionné précédemment, si vous utilisez des servos gros ou multiples, vous devez utiliser une alimentation externe. Connectez simplement l’alimentation comme indiqué dans le schéma ci-dessous. Assurez-vous de relier la broche GND de l’Arduino à la masse de l’alimentation.
Vous pouvez aussi utiliser cette configuration si votre servomoteur nécessite une tension différente de celle fournie par l’Arduino, par exemple 6 V ou plus. L’image suivante montre comment utiliser une alimentation externe pour alimenter le servo :

Connexions pour servomoteur avec alimentation externe
| Servomoteur | Connexion |
|---|---|
| Alimentation (rouge) | Alimentation 5 V |
| Masse (noir ou marron) | Masse alimentation et GND Arduino |
| Signal (jaune, orange ou blanc) | Broche 9 Arduino |
Exemple de code Arduino
Pour contrôler le servomoteur, nous utiliserons la bibliothèque Servo.h qui est préinstallée avec l’IDE Arduino. Avec l’exemple de code ci-dessous, vous pouvez contrôler la position exacte du servomoteur et il inclut aussi un code pour balayer automatiquement le bras du servo d’un côté à l’autre.
Vous pouvez téléverser l’exemple de code sur votre Arduino via l’IDE Arduino. Ensuite, je vous expliquerai comment le code fonctionne.
/* Servo motor with Arduino example code. Position and sweep. More info: https://www.makerguides.com/ */
// Include the servo library:
#include "Servo.h"
// Create a new servo object:
Servo myservo;
// Define the servo pin:
#define servoPin 9
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
void loop() {
// Tell the servo to go to a particular angle:
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
myservo.write(0);
delay(1000);
// Sweep from 0 to 180 degrees:
for (int angle = 0; angle <= 180; angle += 1) {
myservo.write(angle);
delay(15);
}
// And back from 180 to 0 degrees:
for (int angle = 180; angle >= 0; angle -= 1) {
myservo.write(angle);
delay(15);
}
delay(1000);
}
Comment fonctionne le code
La première étape est d’inclure la bibliothèque Arduino requise. Vous pouvez aussi la trouver sous Sketch > Include Library > Servo.
// Include the servo library: #include "Servo.h"
Ensuite, vous devez créer un nouvel objet de la classe Servo. Ici, j’ai appelé le servo ‘myservo’, mais vous pouvez utiliser d’autres noms. Notez que vous devrez aussi changer le nom du servo dans le reste du code.
// Create a new servo object: Servo myservo;
Après cela, j’ai défini à quelle broche Arduino le servomoteur est connecté.
// Define the servo pin: #define servoPin 9
L’instruction #define est utilisée pour donner un nom à une valeur constante. Le compilateur remplacera toute référence à cette constante par la valeur définie lors de la compilation du programme. Ainsi, partout où vous mentionnez servoPin, le compilateur le remplacera par la valeur 9 lors de la compilation.
Dans la section setup du code, nous lions l’objet servo créé à la broche qui contrôlera le servo. La fonction attach() a aussi deux paramètres optionnels, que j’aborde dans la section ci-dessous.
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
Contrôle de l’angle/position :
Dans la première partie de la boucle, nous demandons simplement au servomoteur de se déplacer à un angle particulier avec la fonction write(). Notez qu’il faut un délai entre les commandes pour laisser le temps au servo de se positionner.
// Tell the servo to go to a particular angle: myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(0); delay(1000);
Contrôle de la vitesse :
Dans la dernière partie du code, j’ai utilisé deux boucles for pour balayer le servomoteur d’avant en arrière. Ce code peut aussi être utile si vous voulez contrôler la vitesse du servo. En modifiant la valeur du délai à la fin de la boucle for, vous pouvez ajuster la vitesse du bras du servo.
// Sweep from 0 to 180 degrees:
for (int angle = 0; angle <= 180; angle += 1) {
myservo.write(angle);
delay(15);
}
// And back from 180 to 0 degrees:
for (int angle = 180; angle >= 0; angle -= 1) {
myservo.write(angle);
delay(15);
}
Pourquoi mon servo ne tourne-t-il pas sur toute la plage 0 – 180 degrés ?
Comme expliqué dans l’introduction, l’angle de l’arbre de sortie du servomoteur est déterminé par la largeur de l’impulsion électrique appliquée au fil de contrôle. En général, une largeur d’impulsion d’environ 1 ms correspond à la position minimale, 2 ms à la position maximale, et 1,5 ms à 90° (position neutre). Cependant, cela peut varier légèrement selon les marques et même entre différents servos d’une même marque. Cela signifie que vous devrez ajuster les valeurs min et max dans le code pour correspondre au servo que vous utilisez.
La bibliothèque Arduino Servo facilite grandement le réglage des angles min et max du servomoteur en spécifiant deux paramètres optionnels dans la fonction attach(). Dans cette fonction, le premier paramètre est le numéro de la broche à laquelle le servo est connecté. Le deuxième paramètre est la largeur d’impulsion, en microsecondes (μs), correspondant à l’angle minimum (0 degré) du servo. Le troisième paramètre est la largeur d’impulsion, en microsecondes, correspondant à l’angle maximum (180 degrés) du servo.
Par défaut, la largeur d’impulsion min et max est réglée à 544 et 2400 microsecondes. Ces valeurs conviennent à la plupart des servos courants, mais parfois il faut ajuster légèrement.
Je recommande d’ajuster les valeurs min et max par petits incréments (10-20 microsecondes) pour éviter d’endommager le servo. Si le bras du servo heurte les limites physiques du moteur, augmentez la valeur min et diminuez la valeur max.
#define servoPin 9
int min = 480;
int max = 2500;
Servo myservo;
void setup() {
myservo.attach(servoPin, min, max);
}
Contrôler un servomoteur avec un potentiomètre et Arduino

Contrôler la position d’un servomoteur avec un potentiomètre est très simple et peut être très utile si vous voulez ajuster la position du moteur manuellement. Comme vous le voyez dans le schéma ci-dessus, le servomoteur est câblé de la même manière qu’avant. La seule différence est que j’ai utilisé une breadboard pour distribuer l’alimentation depuis l’Arduino.
Le potentiomètre a trois broches, connectez les broches extérieures au 5 V et à la masse. La broche centrale du potentiomètre est connectée à la broche analogique A0 de l’Arduino.
Exemple de code Arduino pour servomoteur avec potentiomètre
Le code exemple ci-dessous vous permet de contrôler un servomoteur avec un potentiomètre.
/* Servo motor with potentiometer and Arduino example code. More info: https://www.makerguides.com/ */
#include "Servo.h" // include the required Arduino library
#define servoPin 9 // Arduino pin for the servo
#define potPin A0 // Arduino pin for the potentiometer
int angle = 0; // variable to store the servo position in degrees
int reading = 0; // variable to store the reading from the analog input
Servo myservo; // create a new object of the servo class
void setup() {
myservo.attach(servoPin);
}
void loop() {
reading = analogRead(potPin); // read the analog input
angle = map(reading, 0, 1023, 0, 180); // map the input to a value between 0 and 180 degrees
myservo.write(angle); // tell the servo to go to the set position
delay(15); // wait 15 ms for the servo to reach the position
}
Notez qu’avant les sections setup et loop du code, une nouvelle variable reading est ajoutée et la broche d’entrée du potentiomètre est définie.
Dans la section loop du code, nous lisons la valeur de la broche analogique A0 avec la fonction analogRead().
reading = analogRead(potPin); // read the analog input
Les cartes Arduino contiennent un convertisseur analogique-numérique (ADC) 10 bits, ce qui nous donne une valeur entre 0 et 1023 selon la position du potentiomètre.
Comme le servomoteur ne peut tourner que de 0 à 180 degrés, nous devons réduire l’échelle des valeurs avec la fonction map(). Cette fonction remappe un nombre d’une plage à une autre.
angle = map(reading, 0, 1023, 0, 180); // map the input to a value between 0 and 180 degrees
Enfin, nous écrivons l’angle au servomoteur :
myservo.write(angle); // tell the servo to go to the set position delay(15); // wait 15 ms for the servo to reach the position
Contrôler plusieurs servomoteurs
Contrôler plusieurs servos est aussi simple que d’en contrôler un seul, mais on me demande souvent comment modifier le code. J’ai donc ajouté un exemple simple ci-dessous.

Notez que vous devrez utiliser une alimentation externe pour alimenter les servos car l’Arduino ne peut pas fournir assez de courant pour tous les moteurs.
Pour cet exemple, nous utilisons simplement plus de broches Arduino pour les servos supplémentaires. Cependant, cela limite à 12 servos avec un Arduino Uno, et vous risquez de ne plus avoir assez de broches pour d’autres composants.
Une autre option est d’utiliser un ou plusieurs PCA9685 PWM/servo drivers. Ce driver vous permet de contrôler 16 servos avec seulement 2 broches de l’Arduino via I2C. Adafruit vend aussi ces modules sous forme d’Arduino shield.
Comme la configuration de ces drivers est un peu plus complexe, je la traiterai dans un tutoriel séparé.
Exemple de code Arduino avec plusieurs servos
Comme vous le voyez dans l’exemple ci-dessous, il suffit de créer plusieurs objets de la classe Servo avec des noms différents. Vous pouvez adresser chaque servo en utilisant le nom correct dans les sections setup et loop du code.
/* Arduino with multiple servos example code. More info: https://www.makerguides.com/ */
#include "Servo.h"
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup()
{
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
servo4.attach(12);
servo5.attach(13);
}
void loop()
{
servo1.write(0);
servo2.write(0);
servo3.write(0);
servo4.write(0);
servo5.write(0);
delay(2000);
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
delay(1000);
servo1.write(180);
servo2.write(180);
servo3.write(180);
servo4.write(180);
servo5.write(180);
delay(1000);
}
Spécifications des servomoteurs
Vous trouverez ci-dessous les spécifications de certains des servomoteurs les plus populaires sur le marché. Le fabricant original de ces servos est Tower Pro Pte Ltd. mais des modèles similaires peuvent être achetés chez de nombreux autres fournisseurs.
SG90 analog micro servo

Brochage
| Marron | GND |
| Rouge | VCC |
| Jaune | Signal (PWM) |
Spécifications
| Tension de fonctionnement | 4,8 V |
| Poids | 9 g |
| Couple de blocage | 1,8 kg/cm (4,8 V) |
| Type de pignon | Jeu de pignons POM |
| Vitesse de fonctionnement | 0,12 s/60° (4,8 V) |
| Température de fonctionnement | 0 – 55 °C |
| Coût | Check price |
Dimensions
| A | 34,5 mm |
| B | 22,8 mm |
| C | 26,7 mm |
| D | 12,6 mm |
| E | 32,5 mm |
| F | 16 mm |

MG90S digital micro servo

Brochage
| Marron | GND |
| Rouge | VCC |
| Jaune | Signal (PWM) |
Spécifications
| Tension de fonctionnement | 4,8 V |
| Poids | 13,4 g |
| Couple de blocage | 1,8 kg/cm (4,8 V), 2,2 kg/cm (6,6 V) |
| Type de pignon | Aluminium 6061-T6 |
| Vitesse de fonctionnement | 0,10 s/60° (4,8 V), 0,08 s/60° (6,0 V) |
| Température de fonctionnement | 0 – 55 °C |
| Coût | Check price |
Dimensions
| A | 32,5 mm |
| B | 22,8 mm |
| C | 28,4 mm |
| D | 12,4 mm |
| E | 32,1 mm |
| F | 18,5 mm |

MG996R high torque digital servo

Brochage
| Marron | GND |
| Rouge | VCC |
| Jaune | Signal (PWM) |
Spécifications
| Tension de fonctionnement | 4,8 – 6,6 V |
| Courant au repos | 10 mA |
| Courant de fonctionnement sans charge | 170 mA |
| Courant de blocage | 1400 mA |
| Poids | 55 g |
| Couple de blocage | 9,4 kg/cm (4,8 V), 11 kg/cm (6,0 V) |
| Type de pignon | Pignon métallique |
| Vitesse de fonctionnement | 0,19 s/60° (4,8 V), 0,15 s/60° (6,0 V) |
| Température de fonctionnement | 0 – 55 °C |
| Coût | Check price |
Dimensions
| A | 42,7 mm |
| B | 40,9 mm |
| C | 37 mm |
| D | 20 mm |
| E | 54 mm |
| F | 26,8 mm |

Conclusion
Dans ce tutoriel, je vous ai montré comment utiliser des servomoteurs avec Arduino. Nous avons vu les bases du contrôle de la position et de la vitesse des servos, comment contrôler un servo avec un potentiomètre, et comment contrôler plusieurs servos simultanément.
Si vous souhaitez en savoir plus sur d’autres types de moteurs, consultez les articles ci-dessous :
- Positional versus Continuous Servos
- 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino Tutorial
- How to control a Stepper Motor with Arduino Motor Shield Rev3
- How to control a stepper motor with A4988 driver and Arduino
J’ai aussi un article sur How To Control Servo Motors using ESP32 si vous voulez travailler avec un microcontrôleur ESP32 à la place.
Si vous avez des questions, des suggestions, ou si vous pensez que des éléments manquent dans ce tutoriel, n’hésitez pas à laisser un commentaire ci-dessous.

