Accueil / Arduino / Piloter un servomoteur avec un Arduino

Piloter un servomoteur avec un Arduino

Vous aurez certainement besoin d’utiliser des servomoteurs dans bon nombre de vos projets Arduino (ou Raspberry). Il existe trois grandes familles de servomoteurs : positionnement angulaire, rotation continue, déplacement linéaire.

Cet article ne traite que des servomoteurs de positionnement angulaire. Les servomoteurs à déplacement linéaire (par exemple ceux que vous pourrez récupérer en recyclant un lecteur de DVD) fait l’objet d’un article dédié car ils sont gérés par la même librairie que les moteurs pas à pas.

La librairie Servo.h

Pour piloter vos servomoteurs, vous aurez besoin de la librairie servo.h qui fait partie des librairies de base de l’environnement Arduino. Parmi les fonctions proposées par la librairie servo.h, deux sont les plus utilisées :

  • attach(pin) : permet d’attacher le servomoteur au Pin d’asservissement
  • write(angle) : envoi le servo à l’angle spécifié

Ces quatre autres fonctions pourront être utiles pour gérer plus finement les servomoteurs

  • writeMicroseconds(us) : permet d’ajuster les positions limites si votre servomoteur n’est pas standard.
  • read(pin) : permet de lire l’angle sur lequel est actuellement positionné le servo
  • attached(pin) : permet de savoir sur un servomoteur est attaché au Pin spécifié
  • detach(pin) : pour détacher votre servomoteur du Pin spécifié.

La librairie servo.h supporte jusqu’à 12 servomoteurs. Sachez toutefois que l’utilisation de servos entraîne des limitations sur votre Arduino. En effet, sur les cartes autres que la Mega, il n’est plus possible d’écrite avec l’instruction analogWrite() sur les broches 9 et 10 (même s’il n’y a aucun servo de branché dessus). Si votre projet nécessite plus de 12 servos, il faudra passer à l’Arduino Mega qui permet d’en piloter jusqu’à 48. Sur la Mega, à partir du 13ème servo, les impulsions PWM seront désactivées sur les broches 11 et 13.

Utiliser un servomoteur de positionnement angulaire sur un Arduino

Les servomoteurs de positionnement angulaire permettent de positionner (ou déplacer) précisément un objet dans une plage de 0 à 180° (le plus courant). Le branchement est presque toujours le même et se fera à l’aide de 3 fils dont voici les principales couleurs que vous pourrez rencontrer :

  • Rouge : alimentation +5V.
  • Noir ou marron : commun à relier au Pin GND de l’Arduino
  • Orange, jaune ou blanc : signal de positionnement envoyé par l’Arduino.

Attention, les servomoteurs sont gourmands en énergie. Si vous en avez besoin de plusieurs pour votre projet, l’alimentation du port USB peut ne pas être suffisant, vous devrez ajouter une alimentation externe.

brancher un servomoteur arduino uno

Programme de test va-et-vient

J’ai traduit et ajouté quelques variables de configuration les programme de test proposé par la fondation Arduino. Il permet de tester rapidement votre servo en faisant balayant une plage angulaire dans un sens puis dans l’autre.

/* 
 Programme de test pour servomoteur de positionnement angulaire 
 Traduction en français, ajout de variables
 Code original de BARRAGAN <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include <Servo.h>

Servo myservo;  // création de l'objet myservo 

int pin_servo = 6;		 // Pin sur lequel est branché le servo
int pos = 0;			 // variable permettant de conserver la position du servo
int angle_initial = 0; 	 //angle initial
int angle_final = 180;   //angle final
int increment = 1;       //incrément entre chaque position
bool angle_actuel = false;//Envoi sur le port série la position courante du servomoteur

void setup() {
  Serial.begin(9600);                       
  while(!Serial){;} 
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  
}

void loop() {
  for (pos = angle_initial; pos <= angle_final; pos += increment) { // Déplace le servo de 0 à 180 degréespar pas de 1 degrée 
    myservo.write(pos);              // Demande au servo de se déplacer à cette position angulaire
    delay(30);                       // Attend 30ms entre chaque changement de position
    if (angle_actuel) {
    	Serial.println(myservo.read());
    }
  }
  for (pos = angle_final; pos >= angle_initial; pos -= increment) { // Fait le chemin inverse
    myservo.write(pos);              
    delay(30);   
    if (angle_actuel) {
    	Serial.println(myservo.read());
    }
  }
}

Voici également un petit programme de test pour déplacer votre servo à une position donnée.

/* 
 Programme de test pour servomoteur de positionnement angulaire 
 Traduction en français, ajout de variables
 Code original de BARRAGAN <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include <Servo.h>

Servo myservo;  		 // création de l'objet myservo 

int pin_servo = 6;		 // Pin sur lequel est branché le servo
int position = 40; 	 	 // Position souhaitée

void setup() {
  myservo.attach(pin_servo);  // attache le servo au pin spécifié sur l'objet myservo
  myservo.write(position);
}

void loop() {}

Piloter un servomoteur à l’aide d’un potentiomètre

Par terminer cet article, voici un petit montage et son programme pour piloter la position d’un servomoteur à l’aide d’un potentiomètre. Pour réaliser ce montage vous aurez besoin :

Tout le matériel nécessaire est disponible dans le Starter Kit Arduino.

Il suffit d’ajouter le potentiomètre au montage précédent en suivant le schéma de câblage suivant.

piloter un servomoteur avec un potentiometre sur un arduino

Si vous voulez connaître la position de votre servo à chaque variation du potentiomètre, passez la variable « angle_actuel » à True puis ouvrez le moniteur du port série.

/*
 Controler la position d'un servomoteur à l'aide d'un potentiomètre
 Traduction en français, ajout de variables de configuration
 Code original de BARRAGAN <http://barraganstudio.com>
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob
 
 www.projetsdiy.fr - 19/02/2016
 public domain

*/

#include <Servo.h>

Servo myservo;  	// création de l'objet myservo 

int potpin = 0;  	// Entrée analogique sur lequel est connecté le potentiomètre
int val;			// Variable contenant la valeur courante du potentiomètre 
int servo_pin = 6;	// Pin auquel le servo est relié
bool angle_actuel = false;// Envoi sur le port série la position courante du servomoteur


void setup() {
  Serial.begin(9600);   	// Ouvre le port série                   
  while(!Serial){;} 	
  myservo.attach(servo_pin);// attache le servo au pin spécifié sur l'objet myservo
}

void loop() {
  val = analogRead(potpin);            // Lit la valeur actuelle du potentiomètre (valeur comprise entre 0 et 1023)
  val = map(val, 0, 1023, 0, 180);     // Mise à l'échelle pour renvoyer la position entre 0 et 180°
  myservo.write(val);                  // Déplace le servo à la position spécifiée
                             
  if (angle_actuel) {
  	  Serial.print("Angle demande : ");
  	  Serial.print(val);
      Serial.print(" | Position reelle : ");
      Serial.println(myservo.read());
      delay(200);						// Attend 200ms en mode debug
  } else {
  	delay(15);							// Attend 15ms
  }
}