Contrôler un servomoteur avec une plaque Arduino. Servo SG90.

Connexion du Servo SG90 à la plaque Arduino
Connexion du Servo SG90 à la plaque Arduino

Dans cet article nous allons expliquer le fonctionnement et les caractéristiques du servomoteur SG90. On pratiquera la connexion de ce module à la plaque d’ Arduino et son utilisation.

Un servomoteur est un moteur à courant continu, conçu pour se déplacer dans un angle fixe et maintenir cette position jusqu’à nouvel ordre. Les servos sont fréquemment utilisés en aéromodélisme et robotique grâce à cette capacité de bouger de façon angulaire.

Il existe une grande variété de servos dans le marché. On peut les différencier par la taille, la force, la vitesse, la précision… La principale caractéristique de ces moteurs est la force (le couple). Il est recomendé de choisir un servo avec un couple supérieur à celui dont on a besoin, parce que si on lui impose des charges plus hautes à sa force, on risque de endommager la parte mécanique; les engrenages en plastique peuvent céder et finir par se casser.

Tous les servos usés en robotique ont un connecteur à trois cables: VCC (rouge), GND (marron) et le signal (orange).

Cables de connexion du servo SG90 couleurs
Cables de connexion du servo

Bibliothèque « servo » d’Arduino.

Le contrôle de servos avec Arduino est très simple grâce à la disponibilité d’une bibliothèque visé à faciliter la communication entre la carte et les servomoteurs. On peut trouver le dossier complet sur la page officielle: Servo Library.

Une grande partie des plaques Arduino supportent jusqu’à 12 moteurs mais l’usage de la bibliothèque neutralise la fonctionnalité PWM des pins 9 et 10. Arduino Mega peut utiliser jusqu’à 48 moteurs et 12 servos disponibles sans perturber la fonctionnalité PWM; mais si on utilise de 12 à 23 moteurs, le PWM des pins 11 et 12 sera désactivé.

Fonctions de la bibliothèque:

  • attach (pin, min,max)

Cette fonction relie la variable servo à un pin.

Syntaxe:

servo.attach(pin);
servo.attach(pin, min, max);

On observe trois paramètres:

pin -> C’est la broche connectée au cable de signal de contrôle du servo.

min -> C’est l’ampleur de l’impulsion en microsecondes qui correspond à 0º (par défaut s’établit en 544).

max -> C’est l’ampleur de l’impulsion en microsecondes qui correspond à 180º (par défaut s’établit en 2400).

  • write(degrés)

Cette fonction fait tourner l’axe du servo un nombre précis de degrés selon notre souhait (entre 0º et 180º).

  • writeMicroseconds(temps)

Cette tâche indique la largeur de l’impulsion (en microsecondes) au servo. Les paramètres pour un servo standard sont: 1000 μs pour un déplacement complet à gauche, 2000 μs pour la droite et 1500 μs pour un positionnement central.

En revanche, si on désire un contrôle précis il faudra réviser les instructions de chaque fabricant afin de trouver la correspondance réelle entre les valeurs en microsecondes et le positionnement puisque la relation n’est pas directement proportionnelle. L’ idéale est de faire une étude avec un oscilloscope.

  • read()

Cette fonction lit la position actuelle du servo et renvoie une valeur entre 0º et 180º.

  • attached(pin)

Elle vérifie si la variable servo est reliée au pin indiqué et renvoie la valeur TRUE ou FALSE.

  • detach(pin)

Délie la variable servo au pin indiqué.

Un exemple classique pour apprendre à utiliser la bibliothèque, est celui de faire tourner le moteur de 0º à 180º et revenir à la position initiale.

Schéma de montage.

Le servo dispose de trois cables, deux pour l’alimentation (VCC et GND) et un cable pour le signal. Il est recomendable d’utiliser une source d’énergie externe même si Arduino peut proportionner le courant nécessaire pour un petit servo comme le SG90, il n’est pas le cas pour un servo plus grand ni pour plusieurs petits servos.

Il est nécessaire:

  • Arduino Uno ou équivalent.
  • Servo SG90.
  • Fils.
Cablage du servo SG90 avec Arduino Uno
Cablage du servo SG90

Pour le contrôle du servo on relie le cable de signal (jaune) au pin 2.

Code pour faire tourner le moteur de 0º à 180º.

#include <Servo.h>  // on inclut la bibliothèque servo

Servo servoMoteur;   // on crée un objet servo appelé servoMoteur

void setup(){ 
  // on associe le servo à la broche 2 d'Arduino
  servoMoteur.attach(2);
}
 
void loop(){
  // on déplace le servo à la position 0º
  servoMoteur.write(0);
  delay(1000);  // pause de 1 seconde
  
  // on déplace le servo à la position 90º
  servoMoteur.write(90);
  delay(1000);  // pause 1 seconde
  
  // on déplace le servo à la position 180º
  servoMoteur.write(180);
  delay(1000);  // pause 1 seconde
}

En-tête du code on ajoute la bibliothèque Servo.h qui contient les fonctions nécessaires pour gérer le servo. D’abord, on crée un objet « servo » que nous nommons servoMoteur.

#include <Servo.h>
Servo servoMotor;

Dans le bloc setup() on indique le pin que nous avons conecté au servo.

void setup(){
  servoMotor.attach(2);
}

Dans le bloc loop() avec l’instruction servoMoteur.write() on indique sur quel angle on veut positionner notre servo: 0º, 90º, 180º.

void loop(){
  servoMoteur.write(0);
  delay(1000);

  servoMoteur.write(90);
  delay(1000);

  servoMoteur.write(180);
  delay(1000);
}

Code pour faire avancer le servo degré à degré.

Par contre si nous voulons que notre servo fasse un balayage entre 0º et 180º et viceversa, on devra utiliser deux boucles for().

#include <Servo.h>  // on ajoute la bibliothèque servo

Servo servoMoteur;   //On crée un objet servo appelé servoMoteur

void setup(){ 
  Serial.begin(9600);
  //On associe le servo à la broche 2
  servoMoteur.attach(2);
  servoMoteur.write(0); // on initialise le servo sur l'angle 0
}
 
void loop(){
  // tour de 0 à 180º
  for (int i = 0; i <= 180; i++){
    servoMoteur.write(i);
    Serial.print("Angle:  ");
    Serial.println(i);
    delay(30);
  }
 // tour de 180 a 0º
  for (int i = 179; i > 0; i--){
    servoMoteur.write(i);
    Serial.print("Angle:  ");
    Serial.println(i);
    delay(30);
  }
}

Contrôle d’un servomoteur à travers d’un potentiomètre.

Il est nécessaire:

  • Arduino Uno ou équivalent.
  • Servo SG90.
  • Potentiomètre.
  • Fils.

On réalise les connexions suivantes:

Montage du servo SG90 avec un potentiomètre sur la plaque Arduino Uno.
Montage du servo avec un potentiomètre

La source d’énergie du moteur peut être la même que celle d’Arduino pourvu que la source puisse supporter la puissance du servo et soit de 5 V.

Les 5 V du USB uniquement marchent avec un servo SG90, servomoteurs d’autre type nécessiteront un source d’énergie externe.

Code:

/* Contrôler l'angle de rotation avec un potentiomètre. */
#include <Servo.h>  //on ajoute la bibliothèque

Servo servoMoteur;   // on crée un objet servo: servoMoteur

const int pinPuissan = 0;
const int pinServo = 2;
const int pulseMin = 650;   // impulsion pour pivoter le servo à 0º
const int pulseMax = 2550;  // impulsion pour pivoter le servo à 180º

int valeur;
int angle;

void setup() {
  Serial.begin(9600);
  servoMoteur.attach(pinServo, pulseMin, pulseMax);
}

void loop() {
  valeur = analogRead(pinPuissan);
  angle = map(valeur, 0, 1023, 0, 180);
  servoMoteur.write(angle);
  Serial.print("Angle:  ");
  Serial.println(angle);
  delay(20);
}

Dans la fonction loop() on fait une lecture du potentiomètre connecté au pin A0 (souvenez vous que celui-ci est un pin analogique et nous donnera de valeurs entre 0 et 1023). C’est pour cela que nous utilisons l’instruction map() afin d’adapter ces valeurs à d’autres entre 0º et 180º pour les envoyer au servomoteur.

Le servo doit pivoter à chaque fois que nous manipulons le potentiomètre; et le moniteur série doit nous montrer l’angle appliqué à chaque moment précis.

Capture du moniteur série montrant les valeurs lises par le potentiomètre.
Capture d’écran du moniteur série

Si la position du servo ne coïncide pas avec l’angle correspondant, est due à que la largeur de l’impulsion qu’utilise la bibliothèque n’est pas la même que celle du servo. Pour corrigé ce problème il est nécessaire d’indiquer la largeur de pulsion minimale (pour 0º) et maximale (pour 180º):

servoMotor.attach(9,900,2100);  // ces valeurs ne sont pas fixes, on doit chercher les valeurs optimales

On doit varier les valeurs 900 et 2100 jusqu’à atteindre les valeurs correctes.

Articles similaires
Laisser un commentaire