ARDUINO
COMMANDER UN SERVOMOTEUR

Principe de fonctionnement

Pour commander un servomoteur, il faut lui envoyer un train d'impulsions électriques. Les caractéristiques de ce train d'impulsions sont les suivantes :

Remarque

Ce signal modulant la largeur des impulsions se note PWM en anglais (Pulse Width Modulation) et MLI en français (Modulation de Largeur d'Impulsions).

Précautions à prendre

Respecter les couleurs pour le câblage

Une erreur de câblage... risque de détruire la carte Arduino.

Eviter les vibrations du servomoteur

En théorie :

En pratique :

Si le servomoteur vibre, c'est que la valeur de commande n'est pas adaptée. Il faut alors débrancher l'alimentation puis apporter une modification.

Exemples de programmes

Fonctionnement autonome

Bien de l'utilisation de la bibliothèque Servo ne soit pas indispensable, elle est bien pratique car elle simplifie l'écriture du code. L'exemple ci-dessous permet d'obtenir un aller et retour répétitif.

#include <Servo.h> // on importe la bibliothèque Servo
int pinServo=8;    // variable pour stocker le numéro du connecteur
Servo leServo;     // on crée l’objet leServo issu de la classe Servo

void setup() {
  leServo.attach(pinServo); // la commande du servomoteur est reliée à son connecteur
}

void loop() {
  leServo.write(20);  // axe du servomoteur mis à la position -50°
  delay(2000);        // on attend que la position angulaire soit atteinte
  leServo.write(170); // position angulaire à 50°
  delay(2000);        // nouvelle attente
}

Baisse de la vitesse angulaire

Il est possible de ralentir la vitesse angulaire de l'axe du servomoteur, à l'aide d'une boucle et de la fonction delay().

for (int i=0;i<180;i+=1) {
  leServo.write(i);
  delay(20);
}

Solution sans bibliothèque

L'utilisation de bibliothèques présente quelques inconvénients :

Il est donc toujours utile de savoir s'en passer.

int pinServo=8;

void placer(int angle) {      // angle allant de 0 à 180
  int periode=20000;          // en microsecondes
  int impulsion=(int)(5.55*angle+1000);
  digitalWrite(pinServo,LOW);
  for (int t=0;t<80;t++) { // boucle laissant au servo le temps d'atteindre sa position
    digitalWrite(pinServo,HIGH);
    delayMicroseconds(impulsion);
    digitalWrite(pinServo,LOW);
    delayMicroseconds(periode-impulsion);
  }
}

void setup() {
  pinMode(pinServo, OUTPUT);
}

void loop() {
  placer(20);  // position angulaire à -50°
  delay(2000);
  placer(170); // position angulaire à 50°
  delay(2000);
}

Remarque

La fonction map() modifie la plage de variation d’une variable. Ainsi, on aurait pu écrire :

int impulsion=map(angle, 0, 180, 1000, 2000);

Servomoteurs à rotation continue

Un servomoteur à rotation continue, ou servomoteur treuil, se commande de la même manière qu'un servomoteur classique : Le signal de commande est un train d'impulsions.

La durée d'une impulsion est comprise entre 1 ms et 2 ms environ, les valeurs limites variant d'un servomoteur à l'autre. Pour un servomoteur à rotation continue, on emploie de préférence la méthode writeMicroseconds(). Elle définit directement la largeur des impulsions, en microsecondes.

#include <Servo.h> 
Servo leServo;

void setup() { 
  leServo.attach(8);
}

void loop() {
  leServo.writeMicroseconds(1550); // rotation dans un sens
  delay(2000);
  leServo.writeMicroseconds(1500); // stop
  delay(1000);
  leServo.writeMicroseconds(1450); // rotation dans l'autre sens
  delay(2000);
  leServo.writeMicroseconds(1500); // stop
  delay(1000);
}