Comment contrôler les 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 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

  1. Micro servo
  2. SG90 Servo à couple élevé MG996R
  3. Arduino Uno Rev3
  4. Fils de cavalier
  5. Planche à pain Potentiomètre
  6. 10 kΩ (type planche à pain)
  7. Câble USB type A / B
  8. 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.

Schematic of an RC servo motor

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

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 .

servo control 2

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.

servo motor with arduino uno wiring diagram schematic circuit tutorial
Servomoteur avec schéma de câblage Arduino Uno.

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

Connexions du servomoteur

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

servo-moteur-avec-arduino-uno-et-alimentation-externe-schéma-câblage-tutoriel-circuit-schématique
Servomoteur alimenté par une alimentation externe.

Servomoteur avec connexions d’alimentation externe

ServomoteurConnexion
Puissance (rouge)Alimentation 5 V
Sol (noir ou marron)Masse d’alimentation et Arduino GND
Signal (jaune, orange ou blanc)
Broche 9 Arduino

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

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.

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.

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 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 .

q? encoding=UTF8&ASIN=B07BRS249H&Format= SL250 &ID=AsinImage&MarketPlace=US&ServiceVersion=20070822&WS=1&tag=makerguides 20&language=en US
Pilotes PWM / servo PCA9685

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

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

Pinout

BrownGND
RedVCC
YellowSignal (PWM)

Specifications

Operating voltage4.8 V
Weight9 g
Stall torque1.8 kg/cm (4.8 V)
Gear typePOM gear set
Operating speed0.12 sec/60° (4.8 V)
Operating temperature0 – 55 °C
CostCheck 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]

Pinout

BrownGND
RedVCC
YellowSignal (PWM)

Specifications

Operating voltage4.8 V
Weight13.4 g
Stall torque1.8 kg/cm (4.8 V), 2.2 kg/cm (6.6 V)
Gear type6061-T6 aluminum
Operating speed0.10 sec/60° (4.8 V), 0.08 sec/60° (6.0 V)
Operating temperature0 – 55 °C
CostCheck 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

tower pro mg996r high torque servo
[Source: towerpro.com.tw]

Pinout

BrownGND
RedVCC
YellowSignal (PWM)

Specifications

Operating voltage4.8 – 6.6 V
Current draw at idle10 mA
No-load operating current draw170 mA
Stall current draw1400 mA
Weight55 g
Stall torque9.4 kg/cm (4.8 V), 11 kg/cm (6.0 V)
Gear typeMetal gear
Operating speed0.19 sec/60° (4.8 V), 0.15 sec/60° (6.0 V)
Operating temperature0 – 55 °C
CostCheck 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 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

  1. Bonjour, A la fin de votre post => Comment contrôler les servomoteurs avec Arduino 20/02/2021 /par Volta / in ARDUINO vous précisez: => 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 . Puisque vous m'y invitez, après avoir lu votre post très enrichissant, j'aimerais vous soumettre un projet qui dépasse mes compétences actuelles. Voilà, il s'agit pour moi de réaliser un prototype. Je ne compte pas industrialiser ma fabrication. Mon objectif est de faire fonctionner un servomoteur à l'aide d'un capteur de présence infrarouge non détectable à l'oeil et d'une carte Arduino UNO dont je possède un clone chinois Je m'adresse à vous n'ayant pas l'expérience en programmation et en électronique pour configurer seul ces 2 articles. Le servo devrait pivoter de 90° et revenir à son point de départ après une temporisation de 3/4 de seconde et être prêt à renouveler l'opération suite à une nouvelle sollicitation du capteur. L'objectif est de faire basculer une petite trappe en contreplaqué epr 10 mm de 25 x 25cm et de la relever aussi rapidement qu'elle a basculé.(poids de la trappe env 350 gr. Pouvez-vous si vous avez la solution m'aider à réaliser cette opération en m'indiquant le type de pièces dont j'aurais besoin pour aboutir ( c'est à dire programmation et branchement)? Je reste à votre disposition pour tout renseignement Cordialement G.Lecomte
    • bonjour merci pour votre contact ce type d'opération nécessite l'intervention de nos technicien il seront plus utile pour vous guider. vous devais réservait une consultation ça coute environ 40$
  2. mon projet est de fabriqué des étagères automatiques qui serviront plus particulièrement aux personnes de courtes tailles et des personnes handicapés d'atteindre les différents ingrédients de le cuisine sans aucun effort physique. nous aurons deux bras avec chacun dotés de trois étagères sous forme de boite qui vont effectuer des mouvement de rotation pour ramener les étagères au niveau de la personnes. D'après vous j'aurai besoin de quel type de Servo et aussi combien? NB: je réaliserais ça sous petit format.
  3. votre tutoriel sur ardino uno rev 3 m'a vivement interessé.Je désire employer cette carte avec un servo s 90 pour commander des aiguillages en modélisme ferrovière.Comment donner une impulsion à la carte et donc au servo manuellement: inter 3 positions ou 2 poussoirs ?Comment régler la course du servo. Je dispose de régleurs de servos Dual servo motor drive et servo constansy master avec potentiomètre. Comment les inclure dans le cablage.Si vous pouvez m'indiquer un ouvrage de base répondant à ces questions? Merci d'avance.
    • bonjour, Merci pour votre contacte, pour répondre a votre question vous auriez besoin de consulter un de nos techniciens pour bien vous expliquer comment réaliser votre projet.$$ ^^
  4. bonjour j ai un bug avec la libraire servo.h lorsque je veux utiliser deux moteurs DC avec un pont H et un servo moteur. existe il une alternative a cette librairie ?
  5. Bonjour mesdames, messieurs, Très interessant cet article sur les servomoteurs et merci de le partager avec les utilisateurs. Je voudrais bien vous faire une question. J'utilises un servo de 25 Kg (360°) pour automatiser le functionement d'une microvalve de 3 vois. D'un jour au lendemain, le servo a commencé à tourner en continue sans s'arrêter dans la position demandée. De ce que j'ai lu, c'est un des symptômes d'un possible cortocircuit. Mais si c'est ça, il n'est pas visible. Est-ce qu'il peut avoir un micro component endomagé dans la petite carte electronique du servo qui peut causer un cortocircuit? Comment peut-on tester ou le problem de cortocircuit se trouvé? Merci de votre attention par avance. Cordialement, Cristina Rincón

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Rejoindre la liste d'attente Nous vous informerons lorsque le produit arrivera en stock. Veuillez laisser votre adresse E-mail et la quantité voulue.

Main Menu

بحاجة الى مساعدة ؟