Aucun produit dans le panier.
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 codes! Les servomoteurs sont souvent utilisés dans les projets de robotique mais vous pouvez également les trouver dans les voitures RC, les avions, etc. Ils sont très utiles lorsque vous avez besoin d’un contrôle de position précis 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 commande qu’il utilise. J’explique également quelles sont les différences entre un servo standard et un servo continu. Ensuite, je vais vous montrer 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. Après cela, nous examinerons le contrôle d’un servo avec un potentiomètre et comment vous pouvez modifier le code pour contrôler plusieurs servomoteurs en même temps. Enfin, à la fin de cet article, vous trouverez les spécifications et les dimensions de certains des servomoteurs les plus populaires du marché.
Composants matériels
- Micro servo
- SG90 Servo à couple élevé MG996R
- Arduino Uno Rev3
- Fils de cavalier
- Planche à pain Potentiomètre
- 10 kΩ (type planche à pain)
- Câble USB type A / B
- Alimentation 5 V (en option)
Comment fonctionne un servomoteur?
Un servo de loisir standard se compose généralement d’un petit moteur électrique, d’un potentiomètre, d’une électronique de commande 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).
En fonction de l’erreur, l’électronique de commande ajuste la position réelle de l’arbre de sortie afin qu’elle corresponde à la position cible. Ceci est connu comme un système de contrôle en boucle fermée.
Le réducteur diminue la vitesse du moteur, ce qui augmente le couple au niveau de l’arbre de sortie. La vitesse maximale de l’arbre de sortie est généralement d’environ 60 tr / min.
Commande 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 déplace vers la position neutre (90 degrés). Les positions min (0 degré) 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 entre les différents types et marques de servomoteurs (par exemple 0,5 et 2,5 ms). De nombreux servos ne tournent que d’environ 170 degrés (ou même seulement 90), mais la position médiane est presque toujours à 1,5 ms.
Pour régler la position min et max dans le code, consultez la section ci-dessous .

Les servomoteurs s’attendent généralement à une impulsion toutes les 20 millisecondes ou 50 Hz, mais de nombreux servos RC fonctionnent correctement dans une plage de 40 à 200 Hz.
Servo 360 degrés (continu) vs 180 degrés (standard)
La plupart des servos RC sont de la variété à 180 degrés, ce qui signifie qu’ils ne peuvent tourner que dans une plage de 0 à 180 degrés. Cependant, la rotation continue, également connue sous le nom de servomoteurs à 360 degrés, est également disponible.
Les servos à rotation continue réagissent différemment au signal de commande que les 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 définira la vitesse du servomoteur à pleine vitesse dans un sens et une impulsion de 2 ms à pleine vitesse dans l’autre. Une valeur proche de 1,5 ms permet au moteur de s’arrêter.
Si votre servo se comporte d’une manière inattendue, vous pouvez utiliser un servo continu au lieu d’un servo standard.


Comment connecter un servomoteur à l’Arduino?
Le câblage d’un servomoteur est très simple car il vous suffit de connecter trois fils: alimentation, masse et signal. Le fil d’alimentation est généralement rouge et doit être connecté à 5 V.
Un micro servo comme le SG90 consomme environ 10 mA lorsqu’il est inactif et 100 à 250 mA en rotation, vous pouvez donc l’alimenter directement avec la sortie 5 V de l’Arduino. Cependant, vous devez être prudent lorsque vous utilisez plusieurs servomoteurs ou plus. Si votre ou vos moteurs consomment plus de 300 mA, vous devez utiliser une alimentation externe pour éviter d’endommager l’Arduino! Reportez-vous au schéma ci-dessous pour l’utilisation d’alimentations externes.
Le fil de terre est généralement noir ou marron et doit être connecté à la broche de terre de l’Arduino. Lorsque vous utilisez une alimentation séparée, connectez le fil de terre à la fois à l’Arduino et à la terre de l’alimentation.
Le fil de signal est généralement jaune, orange ou blanc peut être connecté à l’une des broches numériques de l’Arduino. Dans ce cas, je l’ai connecté à la broche numérique 9.

Les connexions sont également données dans le tableau ci-dessous.
Connexions du servomoteur
Servomoteur | Arduino |
---|---|
Puissance (rouge) | 5 V |
Sol (noir ou marron) | GND |
Signal (jaune, orange ou blanc) | Broche 9 |
Comme je l’ai mentionné précédemment, si vous utilisez des servomoteurs volumineux ou multiples, vous devez utiliser une alimentation externe. Connectez simplement l’alimentation électrique comme indiqué dans le schéma de câblage ci-dessous. Assurez-vous de connecter la broche GND de l’Arduino et l’alimentation ensemble.
Vous pouvez également utiliser cette configuration si votre servomoteur nécessite une tension différente de celle que l’Arduino peut fournir, par exemple 6 V ou plus.

Servomoteur avec connexions d’alimentation externe
Servomoteur | Connexion | |
---|---|---|
Puissance (rouge) | Alimentation 5 V | |
Sol (noir ou marron) | Masse d’alimentation et Arduino GND | |
Signal (jaune, orange ou blanc) |
|
Servomoteur avec 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 comprend également un code pour balayer le bras servo d’avant en arrière automatiquement.
Vous pouvez télécharger l’exemple de code sur votre Arduino via l’IDE Arduino. Ensuite, je vais vous expliquer comment fonctionne le code.
Vous pouvez copier le code en cliquant sur le bouton dans le coin supérieur droit du champ de code.
/* 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
// Create a variable to store the servo position:
int angle = 0;
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 (angle = 0; angle <= 180; angle += 1) {
myservo.write(angle);
delay(15);
}
// And back from 180 to 0 degrees:
for (angle = 180; angle >= 0; angle -= 1) {
myservo.write(angle);
delay(30);
}
delay(1000);
}
Comment fonctionne le code
La première étape consiste à inclure la bibliothèque Arduino requise. Vous pouvez également trouver cette bibliothèque sous Sketch> Inclure la bibliothèque> Servo.
// Include the servo library:
#include <Servo.h>
Ensuite, vous devez créer un nouvel objet de la classe Servo. Dans ce cas, j’ai appelé le servo «myservo» mais vous pouvez également utiliser d’autres noms. Notez que vous devrez également changer le nom du servo dans le reste du code.
// Create a new servo object:
Servo myservo;
After that, I defined to which Arduino pin the servo motor is connected.
// Define the servo pin:
#define servoPin 9
The statement #define
is used to give a name to a constant value. The compiler will replace any references to this constant with the defined value when the program is compiled. So everywhere you mention servoPin
, the compiler will replace it with the value 9 when the program is compiled.
La variable angle
est utilisée pour stocker la position actuelle du servo en degrés.
// Create a variable to store the servo position:
int angle = 0;
In the setup section of the code, we link the servo object that we created to the pin that will control the servo. The attach()
function also has two optional parameters, which I discuss in the section below.
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
Control angle/position:
Dans la première partie de la boucle, nous disons simplement au servomoteur de se déplacer selon un angle particulier avec la fonction write()
. Notez que vous avez besoin d’un délai entre les commandes pour donner au servomoteur un certain temps pour se déplacer vers la position définie.
// Tell the servo to go to a particular angle:
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
myservo.write(0);
delay(1000);
Vitesse de contrôle:
Dans la dernière partie du code, j’ai utilisé deux boucles for pour balayer le servomoteur d’avant en arrière. Ce morceau de code peut également être utile si vous souhaitez contrôler la vitesse du servomoteur. En modifiant la valeur du retard à la fin de la boucle for, vous pouvez régler la vitesse du bras d’asservissement.
// Sweep from 0 to 180 degrees:
for (angle = 0; angle <= 180; angle += 1) {
myservo.write(angle);
delay(15);
}
// And back from 180 to 0 degrees:
for (angle = 180; angle >= 0; angle -= 1) {
myservo.write(angle);
delay(30);
}
Pourquoi mon servo ne tourne-t-il pas à 0 – 180 degrés?
Comme je l’ai expliqué dans l’introduction, l’angle de l’arbre de sortie du servomoteur est déterminé par la largeur de l’impulsion électrique qui est appliquée au fil de commande. Généralement, une largeur d’impulsion d’environ 1 ms (milliseconde) correspond à la position minimum, 2 ms à la position maximum et 1,5 ms à 90 ° (position neutre). Cependant, cela peut varier légèrement entre les marques et même les différents servos de la même marque. Cela signifie que vous devrez ajuster les valeurs minimum et maximum dans le code pour correspondre au servo que vous utilisez.
La bibliothèque Arduino Servo facilite le réglage de l’angle minimum et maximum du servomoteur en spécifiant deux paramètres optionnels dans la attach()
fonction. Dans cette fonction, le premier paramètre est le numéro de la broche à laquelle le servo est attaché. Le deuxième paramètre est la largeur d’impulsion, en microsecondes (μs), correspondant à l’angle minimum (0 degré) du servomoteur. Le troisième paramètre est la largeur d’impulsion, en microsecondes, correspondant à l’angle maximum (180 degrés) du servomoteur.
Par défaut, la largeur d’impulsion minimale et maximale est définie sur 544 et 2400 microsecondes. Ces valeurs fonctionnent pour la plupart des servos courants, mais vous devez parfois ajuster légèrement les valeurs.
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 d’asservissement atteint 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

Le contrôle de la position d’un servomoteur avec un potentiomètre est très simple et peut être très utile si vous souhaitez régler la position du moteur à la main. Comme vous pouvez le voir dans le schéma de câblage ci-dessus, le servomoteur est câblé de la même manière qu’auparavant. La seule différence est que j’ai utilisé une maquette pour distribuer l’alimentation de l’Arduino.
Le potentiomètre a trois broches, connectez les broches extérieures à 5 V et GND. La broche centrale du potentiomètre est connectée à la broche analogique A0 de l’Arduino.
Servomoteur avec potentiomètre Exemple de code Arduino
L’exemple de code ci-dessous vous permet de contrôler un servomoteur avec un potentiomètre.
Vous pouvez copier le code en cliquant sur le bouton dans le coin supérieur droit du champ de code.
/* 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 la section de configuration et de boucle du code, une nouvelle variable reading
est ajoutée et la broche d’entrée du potentiomètre est définie.
Dans la section boucle du code, nous lisons la valeur de la broche analogique A0 avec la fonction analogRead()
.
reading = analogRead(potPin); // read the analog input
Arduino boards contain a 10-bit analog to digital converter (ADC), so this gives us a value between 0 and 1023 depending on the position of the potentiometer.
Comme le servomoteur ne peut tourner qu’entre 0 et 180 degrés, nous devons réduire les 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
Lastly, we write the angle to the servo motor:
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ôle de plusieurs servomoteurs
Contrôler plusieurs servos est tout aussi simple que d’en contrôler un seul, mais je reçois souvent des questions sur la façon de modifier le code. Par conséquent, j’ai 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 suffisamment de courant pour alimenter tous les moteurs.
Pour cet exemple, nous utilisons simplement plus de broches Arduino pour les servos supplémentaires. Cependant, cela signifie que vous êtes limité à 12 servos lorsque vous utilisez un Arduino Uno et que vous risquez de ne pas avoir assez de broches pour d’autres composants.
Une autre option consiste à utiliser un ou plusieurs pilotes PWM / servo PCA9685 . Ce pilote vous permet de contrôler 16 servos avec seulement 2 broches de l’Arduino en utilisant I2C. Adafruit les vend également sous la forme d’un bouclier Arduino .
Parce que la configuration de ces servomoteurs est un peu plus difficile, je vais couvrir cela dans un didacticiel séparé.
Arduino avec plusieurs exemples de code de servos
Comme vous pouvez le voir dans l’exemple ci-dessous, il vous suffit de créer plus d’objets de la classe Servo avec des noms différents. Vous pouvez adresser chaque servo en utilisant le nom correct dans la section configuration et boucle 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 du servomoteur
Vous trouverez ci-dessous les spécifications de certains des servomoteurs les plus populaires du marché. Le fabricant original de ces servomoteurs est Tower Pro Pte Ltd. mais des modèles similaires peuvent également être achetés auprès de nombreux autres fournisseurs.
SG90 analog micro servo

Pinout
Brown | GND |
Red | VCC |
Yellow | Signal (PWM) |
Specifications
Operating voltage | 4.8 V |
Weight | 9 g |
Stall torque | 1.8 kg/cm (4.8 V) |
Gear type | POM gear set |
Operating speed | 0.12 sec/60° (4.8 V) |
Operating temperature | 0 – 55 °C |
Cost | 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

Pinout
Brown | GND |
Red | VCC |
Yellow | Signal (PWM) |
Specifications
Operating voltage | 4.8 V |
Weight | 13.4 g |
Stall torque | 1.8 kg/cm (4.8 V), 2.2 kg/cm (6.6 V) |
Gear type | 6061-T6 aluminum |
Operating speed | 0.10 sec/60° (4.8 V), 0.08 sec/60° (6.0 V) |
Operating temperature | 0 – 55 °C |
Cost | 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

Pinout
Brown | GND |
Red | VCC |
Yellow | Signal (PWM) |
Specifications
Operating voltage | 4.8 – 6.6 V |
Current draw at idle | 10 mA |
No-load operating current draw | 170 mA |
Stall current draw | 1400 mA |
Weight | 55 g |
Stall torque | 9.4 kg/cm (4.8 V), 11 kg/cm (6.0 V) |
Gear type | Metal gear |
Operating speed | 0.19 sec/60° (4.8 V), 0.15 sec/60° (6.0 V) |
Operating temperature | 0 – 55 °C |
Cost | 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 les servomoteurs avec Arduino. Nous avons examiné les bases du contrôle de la position et de la vitesse des servomoteurs, comment contrôler un servomoteur avec un potentiomètre et comment contrôler plusieurs servomoteurs en même temps.
J’espère que vous avez trouvé cet article utile et instructif. Si c’est le cas, partagez-le avec un ami qui aime aussi l’électronique et la fabrication d’objets!
J’aimerais savoir quel projet vous prévoyez de construire ou avez déjà construit avec des servomoteurs et l’Arduino. Si vous avez des questions, des suggestions ou si vous pensez que des éléments manquent dans ce tutoriel, veuillez laisser un commentaire ci-dessous .
9 Comments