Piloter un servomoteur avec un Arduino et la librairie servo.h

Piloter un servomoteur avec un Arduino et la librairie servo.h 2

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 (by example ceux qui ont été récupérés) sont l’objet d’un article dédié, ils sont authentifiés par la même librairie que les moteurs ne sont pas.

Pour pilote 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:

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

Ces quatre autres fonctions seront utiles pour gérer plus finement les servomoteurs

  • writeMicroseconds (us): permet d’ajuster les positions si votre servomoteur n’est pas standard.
  • read (pin): permet de lire l’angle sur lequel est actuellement positionné le servo
  • join (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 a pris en charge jusqu’à 12 servomoteurs. Sachez toutefois que l’utilisation de serveurs entraîne la limitation de votre Arduino. En effet, sur les cartes autres que la Mega, il n’est plus que possible d’écrire avec l’instruction analogWrite () sur les broches 9 et 10 (même si ce n’est aucun servo de branché dessus). Si votre projet a besoin de 12 servos, il va passer à l’Arduino Méga qui permet d’en piloter jusqu’à 48. Sur le Mega, à partir du 13ème servo, les impulsions PWM seront désactivées sur les broches 11 et 13.

Les servomoteurs de positionnement angulaire permettent de déplacer un objet dans une plage de 0 à 180 °. Le branchement est presque toujours le même et se fera à l’aide de 3 fils dont voici les principales couleurs

  • Rouge: alimentation + 5V.
  • Noir ou marron: Communiquez au Pin GND de l’Arduino
  • Orange, yellow or white: signal de positionnement envoyé par l’Arduino.

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

brancher un servomoteur arduino uno

Programme de test va-et-vient

J’ai traduit et ajouté quelques variables de configuration le programme de test proposé par la fondation Arduino. Vous pouvez tester rapidement votre servo en 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 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include 

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 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include 

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() {}

Pour terminer cet article, voici un petit montage et son programme pour le pilote d'un servomoteur à l'aide d'un potentiomètre. Pour réaliser ce montage vous aurez besoin du matériel suivant

Dernière mise à jour le: 15 août 2019 22 h 44 min

Tout le matériel est disponible dans le kit de démarrage Arduino officiel.

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

piloter un servomoteur avec un potentiomètre 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 
 et Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Knob
 
 www.projetsdiy.fr - 19/02/2016
 public domain
*/

#include 

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
  }
}
  • Programmeur les cartes ESP32 avec l’AIDE Arduino sur macOS, Windows 10, Linux ARM (MàJ). Cadre ESP-IDF
  • Débuter avec l’Arduino et Node-RED. Enregistrer et afficher les mesures en JSON depuis le port série
  • Débuter avec les objets connectés DIY (2). Communiquer, programmer, stocker, visualiser, fabriquer des circuits
  • Comparaison HC-SR04 (ultrasons), Sharp GP2Y0A02YK0F (IR), VL53L0X (Laser), quelle solution choisir pour une mesure de distance avec Arduino ou Raspberry Pi
  • Test et étalonnage du capteur de proximité A02YK0, clone asiatique du Sharp GP2Y0A02YK0F
  • Capteur INA219, mesurer la puissance d'un panneau solaire ou d'une batterie avec un Arduino ou ESP8266

Nous serions ravis de connaître votre avis

      Laisser un commentaire