LOCODUINO

La bibliothèque Servo

.
Par : Dominique, Guillaume, Jean-Luc

DIFFICULTÉ :

La Bibliothèque Servo fait partie des bibliothèques livrées avec l’IDE Arduino et ne nécessite donc pas d’installation séparée. Elle facilite l’écriture de programmes pour commander un ou plusieurs servomoteurs.

Nous allons donc voir les différentes commandes de cette bibliothèque. Nous n’allons pas ici mettre en pratique ces commandes pour, par exemple, commander une aiguille. Ce sera le sujet d’autres articles.

Figure 1 : un exemple de raccordement d’un servo-moteur sur un UNO

Rappel sur l’alimentation et le nombre de servos possibles par carte

Un Arduino peut alimenter un seul servomoteur [1]. Dans le cas de plusieurs, il faudra les alimenter avec une source extérieure de 5V.
Parfois on trouve des servos peu consommateurs de courant. Mais il n’est tout de même pas recommandé d’en alimenter plusieurs sur le 5V de la carte.

Rajoutons aussi qu’un servo-moteur tourne entre 0 et 180° et non dans un mouvement continu, les moteurs continus sont faits pour cela.

La bibliothèque Servo prend en charge jusqu’à 12 moteurs sur la plupart des cartes Arduino et 48 sur l’Arduino Mega. Sur les cartes autres que les Mega, l’utilisation de la bibliothèque désactive analogWrite () (PWM) sur les broches 9 et 10, qu’il y ait un servo ou non sur ces broches.

Installation et importation

Cette bibliothèque fait donc partie intégrante d’Arduino, elle est installée de base. Il suffit juste de l’importer dans le programme avec la ligne en début de programme :

#include <Servo.h>

Les différents codes et fonctions

Déclarer la variable servo
Il faut ensuite pouvoir manipuler le servo-moteur. Il faut pour cela créer une variable de type Servo. On dit aussi instancier une variable. Le type Servo est un peu spécial, on entre là sur le terrain du C++ étudié dans la série d’article sur le Monde des Objets. Servo est une classe et créer une variable de ce type donne un objet. En plus de contenir une valeur comme une variable de type nombre entier, un objet possède des fonctions qui agissent sur lui. Dans le monde de l’objet on appelle communément ces fonctions des méthodes. Nous n’avons pas besoin d’en connaître plus pour utiliser un objet de type Servo. Voici comment on crée une variable, que nous appelons monServo de type Servo.

Servo monServo;

Il sera nécessaire pour chaque servo-moteur commandé par l’Arduino de créer une variable. Si nous avions 3 servo-moteurs, il y aurait 3 objets servo.
La déclaration se fait lors de la déclaration des autres variables.

Attacher l’objet servo à la broche
Cette partie de code se place dans la fonction setup puisqu’on a besoin de l’attacher qu’une seule fois.
Nous allons utiliser la méthode .attach pour l’objet monServo pour attacher la broche reliée au servo-moteur à l’objet monServo.

monServo.attach(2);

Cette méthode accepte comme paramètres :

  • évidemment la broche reliée au servo, dans l’exemple la broche 2
  • en 2ème paramètre l’angle minimum en microsecondes, par défaut il est à 544 (microsecondes)
  • en 3ème paramètre l’angle maximum en microsecondes, par défaut il est à 2400 (microsecondes)

Avant de continuer l’explication, précisons que l’Arduino commande un servo-moteur à l’aide d’impulsions. La durée de ces impulsions détermine l’angle d’arrivée. La datasheet de chaque servo-moteur expose les durées qui le concernent afin que l’Arduino connaisse parfaitement comment il fonctionne.
Dans le cas où nous ne spécifions pas de 2ème et 3ème paramètre comme dans l’exemple, les angles seront ceux par défaut.

Cette méthode .attach() met l’angle du servo à 90°. Afin de spécifier un angle autre que 90°, il nous faut utiliser la méthode .write ou .writeMicroseconds juste avant .attach(), nous allons voir ces deux méthodes.

Bouger le servo
Deux méthodes sont à notre disposition. A part pour fixer la position initiale dans le setup avant la méthode .attach(), ces méthodes seront utilisées principalement dans la fonction loop.

.write(angle en degrés)

monServo.write(60);
Cette commande fait bouger le servo à un angle de 60°, changer l’angle fera bouger le servo-moteur à l’angle choisi.

.writeMicroseconds(angles en microsecondes)
Cette méthode fait la même chose que la précédente mais l’angle est mis en microsecondes.
Comme il y a beaucoup plus de paliers que la méthode précédente, cela permet entre autre une meilleure précision dans l’angle mais aussi nous le verrons dans un autre article un meilleur mouvement.

monServo.writeMicroseconds(1472);
mettra donc le servo à un angle de 90°

Comment le calculer ?
Dans l’hypothèse où les paramètres optionnels de la méthode .attach() n’ont pas été spécifiés, 544 µs est un angle de 0° et 2400 un de 180°. Prenons la moyenne, et nous avons 1472 qui est un angle de 90°.

Autres méthodes mais peu usitées

.read()
Comme la traduction le précise, cette méthode donne comme résultat l’angle du servo en degrés

int degres = monServo.read();

Il n’y a pas de paramètres à mettre notamment la broche, n’oublions pas que l’objet monServo a cette information depuis que la méthode .attach a été utilisée.

.attached()
Cette méthode renvoie true si la broche est rattachée à l’objet et false sinon.

.detach()
au contraire de la 1ère méthode vue, elle permet de détacher le servo de l’objet servo défini.

Maintenant que la bibliothèque Servo a été présentée, le mieux, pour l’utiliser rapidement est de regarder des exemples, comme ceux de l’IDE Arduino, ou, plus près de notre passion ferroviaire, l’article Les différents types de mouvements d’un servomoteur.

[1En réalité cela dépend de la consommation des servomoteurs. En pratique il est possible d’alimenter plusieurs micro-servomoteurs mais dans le cas général, un seul servomoteur est une limite qui convient pour tous les types de servos courants en modelisme

24 Messages

  • Bibliothèque Servo 28 janvier 2016 02:52, par Dominique DELEAZ

    Bonjour,
    merci pour cet article, qui soulève 2 questions de ma part :

    • vous indiquez que "Un Arduino peut alimenter un seul servo-moteur" : est-ce que cela veut dire "un seul servo à la fois ?" car j’ai branché 5 servos sur une carte arduino (Mega), ils ne fonctionnent jamais simultanément, et cela marche très bien ;
    • je voudrais utiliser avec une carte Arduino Mega à la fois la bibliothèque Servo et la bibliothèqe CmdrArduino pour générer un signal DCC et les deux biblothèques entrent en conflit à propos de la broche 9 (et 10 je pense) : est-ce qu’il est possible de modifier (simplement) une des deux biblothèques pour résoudre cela ?

    Merci d’avance

    Dominique Déléaz

    Répondre

    • Bibliothèque Servo 28 janvier 2016 07:55, par Dominique

      Merci pour vos questions :

      Quand il est écrit "Un Arduino peut alimenter un seul servo-moteur", cela concerne l’alimentation 5V seulement. Un servo consomme beaucoup d’énergie (de courant) et le 5V de l’Arduino n’est pas suffisamment généreux pour alimenter plus qu’un seul servo. Au delà, il faut utiliser une alimentation 5V externe.

      En réalité, la plupart des Arduino, avec la bibliothèque Servo, peuvent "piloter"jusque’à 12 servos simultanément (48 sur un Mega).

      Pour CmdrArduino, il est indiqué, dans cet article : seule la broche 9 (Uno, Nano) ou 11 (Mega) est utilisée pour générer le signal DCC, mais l’autre broche (10/328 ou 12/2560) étant connectée au Timer 1, est inutilisable pour autre chose. La bibliothèque ne peut pas être modifiée pour éviter cela.

      S’il existe un moyen de libérer la broche inutile, je ne le connais pas encore, mais quelqu’un d’autre a peut-être une solution ...

      Donc, à suivre ...

      Répondre

      • Bibliothèque Servo 28 janvier 2016 13:05, par Dominique DELEAZ

        Merci bcp pour votre réponse.

        donc :

        • pour les servos, je continue à en piloter plusieurs par carte sans souci...
        • et en attendant une solution pour cette histoire de broche, je continue à piloter les servos avec une carte (méga) et à générer les commandes DCC avec une autre (uno), les deux étant reliées en série tout simplement et la méga envoyant à la uno les éléments pour les commandes DCC à générer. Cela marche très bien, c’était juste histoire d’économiser une carte.

        Bien cordialement

        Dominique (aussi !)

        Répondre

  • Bibliothèque Servo 28 janvier 2016 19:25, par dominique

    Pour tout juste 5 € de plus c’est une sage précaution. D’autant que le DCC et le PWM utilisent des timers et des interruptions, ce qui peut entraîner quelques disfonctionnements, notamment si vous utilisez une nouvelle version de la bibliothèque DCC (que je n’ai pas encore testée).

    Dominique

    Répondre

  • Super 3 avril 2016 19:13, par Gerard

    Excellent article, merci.

    Répondre

  • La bibliothèque Servo 3 janvier 2018 18:42, par Dominique

    Il ne faut pas oublier attach() quand même ! Mais sans ton code on ne peut rien dire et seulement si c’est un projet de modélisme ferroviaire ce dont je doute.
    J’efface cette question ?

    Répondre

  • Bonjour, voici mon problème :
    j’ai un servo de 270 degrés mais lorsque j’utilise la bibliothèque servo.h de arduino, mon servo ne réagi que sur 180 degrés au lieu de 270(je m’y attendais un peu), mais ce n’est pas tellement ça qui nuis à mon projet, c’est plutôt le fait qu’il ne revienne pas à sa place d’origine avec le même code, comme si son zéro digital bougeait à chaque fois que je l’éteins et le rallume. Je voulais donc savoir si il y avait une bibliothèque spéciale pour contrôler les servos de 270 degrés ou alors si il y avait une astuce pour paramétrer cette bibliothèque servo.h qui me plait beaucoup lorsque j’utilise des servos de 180.
    Merci pour votre aide

    Répondre

  • La bibliothèque Servoplus 7 juin 2019 22:56, par DUMONT ERIC

    Bonjour,
    j’ai un petit soucis avec un programme qui utilise cette
    bibliothèque.
    en effet lors de la compilation il me retourne un message d’erreur que je ne comprends pas,
    en fait je ne comprends pas vraiment tout car je suis débutant en programmation !
    voici le code :

    #include <Servo.h>
    #include <ServoPlus.h>
    
    boolean __ardublockDigitalRead(int pinNumber)
    {
      pinMode(pinNumber, INPUT);
      return digitalRead(pinNumber);
    }
    
    
    ServoPlus monServoPlus2;
    
    void setup()
    {
      pinMode( 12 , OUTPUT);
      pinMode( 9 , OUTPUT);
      monServoPlus2.brancher(2,15,175);
    
    }
    
    void loop()
    {
      if (( __ardublockDigitalRead(A0) || __ardublockDigitalRead(A2) ))
      {
        digitalWrite(12 , HIGH);
        delay( 500 );
        digitalWrite(9 , HIGH);
        delay( 5000 );
        monServoPlus2.modeAsync = false;
        monServoPlus2.ecrireAngle(120,20);
        digitalWrite(9 , LOW);
        delay( 500 );
      }
      if (( __ardublockDigitalRead(A1) || __ardublockDigitalRead(A3) ))
      {
        digitalWrite(12 , LOW);
        delay( 500 );
        monServoPlus2.modeAsync = false;
        monServoPlus2.ecrireAngle(20,20);
        digitalWrite(9 , LOW);
      }
    }

    et voici le message d’erreur :

    passage_a_niveau2.ino.ino: In function 'void loop()':
    
    passage_a_niveau2.ino:29:19: error: 'class ServoPlus' has no member named 'modeAsync'
    
         monServoPlus2.modeAsync = false;
    
                       ^
    
    passage_a_niveau2.ino:38:19: error: 'class ServoPlus' has no member named 'modeAsync'
    
         monServoPlus2.modeAsync = false;
    
                       ^
    
    
    Non utilisé : E:\Arduino\Arduino\libraries\Servo
    exit status 1
    'class ServoPlus' has no member named 'modeAsync'

    Merci pour vos lumières et aide
    cordialement
    Eric

    Répondre

    • La bibliothèque Servoplus 7 juin 2019 23:09, par Jean-Luc

      Bonsoir.

      Le problème ne vient pas de la bibliothèque Servo mais de votre classe ServoPlus. Le message d’erreur est clair : vous tentez d’accéder à la donnée membre modeAsync qui n’existe pas dans la classe ServoPlus.

      Répondre

  • La bibliothèque Servo 7 juin 2019 23:17, par DUMONT ERIC

    merci pour votre aide, mais comment créer cette donnée ?

    Répondre

    • La bibliothèque Servo 7 juin 2019 23:20, par Jean-Luc

      Il ne suffit pas de la créer. Avant tout qu’est ce que ServoPlus. L’avez-vous créée ? Téléchargée quelque part ?

      Répondre

  • La bibliothèque Servo 7 juin 2019 23:35, par DUMONT ERIC

    Oui en fait cette bibliothèque sert pour gérer certains paramètres des servomoteurs (l’angle et la vitesse du mouvement), en fait c’est un servomoteur qu’on trouve sous ardublock et j’ai téléchargé la librairie à : http://duinoedu.com
    attention je précise bien que je ne suis pas l’auteur de ce code, je l’ai vu sous forme de tuto sur le net et j’essaye de le comprendre pour apprendre

    Répondre

  • La bibliothèque Servo 8 juin 2019 08:51, par DUMONT ERIC

    Je vous remercie, je vais essayer cela
    sinon connaissez vous les modules "flying fish" ?

    Répondre

  • La bibliothèque Servo 8 juin 2019 09:16, par DUMONT ERIC

    voici un lien ou on le voit

    Voir en ligne : module

    Répondre

  • La bibliothèque Servo 8 juin 2019 12:52, par msport

    le lien renvoie sur :
    IR Infrared 2 - 30cm Obstacle Detaction Sensor Module FC-51
    je suis prêt à commenter ces modules, mais il vaudrait mieux s’inscrire et ouvrir un fil dans composants sur le forum. Ici, on est hors sujet.

    Répondre

  • La bibliothèque Servo 6 mai 2022 17:15, par Auzereau Alain

    J ai réalisé une dcc et cde infra rouge.
    Je voudrais piloter 24 aiguilles par des servos sg90 (angle et vitesse ) avec des boutons poussoir pour un tco manuel (retour des positions par contacts butées servos et leds ,ou sotie arduino ?
    Pouvez vous me guider à réaliser mon projet.
    J ai aussi réalise les (moteurs d’aiguilles)servos avec 2 contact fin de couse,
    1 pour le coeur d aiguille , l’autre pour la signalisation.
    Encore meri à l’ équipe qui m’a motivé dans la construction de mon réseau.
    Alain

    Répondre

  • La bibliothèque Servo 13 décembre 2022 12:49, par Arthur N

    Bonjour,
    J’ai un projet ingénieur qui consiste à créer et faire fonctionner une avion radiocommandé.
    J’ai un problème car je souhaite contrôler 4 servos à l’aide de joystick mais ces derniers fonctionnent les uns après les autres hors je dois les faire fonctionner simultanément pour pouvoir contrôler mon avion.

    Pourriez vous m’aider en m’indiquant comment résoudre ce problème.

    Merci beaucoup :)

    Répondre

    • La bibliothèque Servo 13 décembre 2022 13:00, par msport

      Bonjour,
      je crains qu’il n’y ait pas beaucoup de pilotes dans l’avion pour vous répondre.
      Ici, il n’y a que des conducteurs de trains.
      De toute manière, pour de l’aide c’est sur le forum, comme indiqué par ailleurs.
      Cordialement

      Répondre

    • La bibliothèque Servo 25 mars 2023 12:04, par knsflelectro

      bonjour, il serait plus judicieux de montrer à quoi ressemble ton code.
      sinon je pense que le problème peut provenir de ton programme. essaye de commander les moteur simultanement et non un après l’autre

      exemple :

      servo1 = servo.write(angle1)
      servo2 = servo.write(angle2)
      servo2 = servo.write(angle3)
      servo3 = servo.write(angle4)
      delay(15) ;

      Répondre

Réagissez à « La bibliothèque Servo »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Bibliothèques »

Les derniers articles

Les articles les plus lus