Skip to Content

Comment contrôler des servomoteurs avec Arduino

Comment contrôler des servomoteurs avec Arduino

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× 1Amazon
MG996R high-torque servo× 1Amazon
Arduino Uno Rev3× 1Amazon
Jumper wires× 15Amazon
Breadboard× 1Amazon
10 kΩ potentiometer (type breadboard)× 1Amazon
USB cable type A/B× 1Amazon
5V power supply (optionnel)× 1Amazon

Logiciel

Arduino IDEArduino IDE

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.

Schéma d’un servomoteur RC (Hwang et al. 2018)

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.

Impulsions pour contrôler le servo

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.

Servo motor with Arduino Uno wiring diagram.
Schéma de câblage d’un servomoteur avec Arduino Uno

Les connexions sont également indiquées dans le tableau ci-dessous.

Connexions du servomoteur

ServomoteurArduino
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 :

servo-motor-with-arduino-uno-and-external-power-supply-wiring-diagram-schematic-circuit-tutorial
Câblage d’un servo avec Arduino Uno et alimentation externe

Connexions pour servomoteur avec alimentation externe

ServomoteurConnexion
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

servo-motor-with-arduino-uno-and-potentiometer-wiring-diagram-schematic-circuit
Schéma de câblage pour 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.

how-to-control-multiple-servo-motors-with-arduino-wiring-diagram-schematic-circuit-tutorial-1
Plusieurs servomoteurs connectés à l’Arduino Uno et à une alimentation externe.

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

tower-pro-sg90-analog-micro-servo-motor-9g-1
[Source : towerpro.com.tw]

Brochage

MarronGND
RougeVCC
JauneSignal (PWM)

Spécifications

Tension de fonctionnement4,8 V
Poids9 g
Couple de blocage1,8 kg/cm (4,8 V)
Type de pignonJeu de pignons POM
Vitesse de fonctionnement0,12 s/60° (4,8 V)
Température de fonctionnement0 – 55 °C
CoûtCheck price

Dimensions

A34,5 mm
B22,8 mm
C26,7 mm
D12,6 mm
E32,5 mm
F16 mm
sg90-micro-servo-motor-dimensions-2
[Source : towerpro.com.tw]

MG90S digital micro servo

tower pro mg90s digital micro servo
[Source : towerpro.com.tw]

Brochage

MarronGND
RougeVCC
JauneSignal (PWM)

Spécifications

Tension de fonctionnement4,8 V
Poids13,4 g
Couple de blocage1,8 kg/cm (4,8 V), 2,2 kg/cm (6,6 V)
Type de pignonAluminium 6061-T6
Vitesse de fonctionnement0,10 s/60° (4,8 V), 0,08 s/60° (6,0 V)
Température de fonctionnement0 – 55 °C
CoûtCheck price

Dimensions

A32,5 mm
B22,8 mm
C28,4 mm
D12,4 mm
E32,1 mm
F18,5 mm
sg90-micro-servo-motor-dimensions-2
[Source : towerpro.com.tw]

MG996R high torque digital servo

[Source : towerpro.com.tw]

Brochage

MarronGND
RougeVCC
JauneSignal (PWM)

Spécifications

Tension de fonctionnement4,8 – 6,6 V
Courant au repos10 mA
Courant de fonctionnement sans charge170 mA
Courant de blocage1400 mA
Poids55 g
Couple de blocage9,4 kg/cm (4,8 V), 11 kg/cm (6,0 V)
Type de pignonPignon métallique
Vitesse de fonctionnement0,19 s/60° (4,8 V), 0,15 s/60° (6,0 V)
Température de fonctionnement0 – 55 °C
CoûtCheck price

Dimensions

A42,7 mm
B40,9 mm
C37 mm
D20 mm
E54 mm
F26,8 mm
sg90-micro-servo-motor-dimensions-2
[Source : towerpro.com.tw]

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 :

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.