Contrôler un mini servo avec Arduino

Avec mon pote Idleman, on a pour projet de réaliser un robot (mais chut j’en dis pas plus pour le moment), et qui dit robot dit moteur, articulation, etc…

N’ayant jamais piloter de servo moteurs, j’ai décidé d’acheter sur la baie des mini servo de 9g.

mini servo

 

Fonctionnement d’un servo moteur

Tout d’abord, il faut s’avoir qu’un servo permet d’effecter des déplacements en translation ou en rotation. De nombreux objets du quotidien utilisent des servo moteurs: voitures télécommandées, drône, électroménager, …

Les différents types de servos se distingue par 3 caractéristiques:

  • leur vitesse de rotation par seconde
  • leur course en degré
  • leur couple exprimé en kg.cm

Le fonctionnement d’un servo est relativement simple. Il suffit d’envoyer une impulsion dont la durée est comprise entre 0,5ms et 2,5ms au servo. Cette impulsion déterminera la position du guide du servo. Ainsi la valeur de 1,5ms donne au servomoteur la position centrale.

Ces impulsion doivent être envoyée de manière périodique, généralement toutes les 50ms.

Il n’y a rien de compliquer pour brancher un servo. Les servos ont généralement 3 fils:

  • un rouge: qui doit être branché au 5V (ou 12V suivant votre servo)
  • un noir : qui doit être branché à la masse
  • un orange (ou autre couleur) : qui  est le fil de tension de commande 0-5V

C’est donc via le fil orange que les commandes seront passées à votre servo. Ce fil devra obligatoire être relié à votre Arduino sur un pin PWN.

Voyons maintenant comment connecter un mini servo à notre Arduino.

Connecter un servo sur un Arduino

Voici le montage que j’ai réalisé pour tester mon mini servo:

arduino mini servo

 

Il suffit ensuite de charger le sketch suivant dans votre Arduino. Ce script utilise la librairie Servo nativement disponible dans l’outil de développement de votre Arduino.

// Sweep
// by BARRAGAN <http://barraganstudio.com> 
// This example code is in the public domain.
 
#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}

Ce sketch est issu des exemples fournis avec Arduino. Il permet de faire tourner votre servo de 0 à 180 degré.

J’espère que cela vous aidera.

28 thoughts on “Contrôler un mini servo avec Arduino

  • February 6, 2014 at 11:01 pm
    Permalink

    Pas mal, ça marche bien ! Cependant je ne vois pas quoi en faire dans l’immédiat 😛

    Reply
    • February 10, 2014 at 8:31 am
      Permalink

      un bed autoleveling pour une imprimante 3D, un robot type omniwheel 🙂

      Reply
  • February 28, 2014 at 4:27 pm
    Permalink

    bonjour
    j’ai besoin d’aide
    DANS LE PROGRAMME ARDUINO.
    je voudrais faire fonctionner un servomoteur
    20° EN avant ET REVENIR A LA POSITION 0
    20° EN ARRIÈRE ET REVENIR A LA POSITION 0
    10 ° EN AVANT
    ET JE VOUDRAIS COMMANDER CES OPERATIONS AVEC 2 BOUTONS POUSSOIR
    qui pourrais m’envoyer ce programme car je galere.
    merci
    dominique

    Reply
    • March 3, 2014 at 10:07 am
      Permalink

      Pour le code concernant le declenchement sur les boutons, tu trouvera plein d exemples (cherche allumer led bouton). Sinon pour les degrés il te suffit d’adapter mon code 🙂

      Reply
  • April 14, 2014 at 11:09 pm
    Permalink

    bonjour;
    j’ai un PFA la dessue mon travail est de commander un cervo moteur via arduino afin qu’il ouvre et ferme un rido en mouvement comme une fenetre ou la porte d’un garage.
    cependant votre programme est trés interssant mais je dois changer les 180°
    ma question qu’es ce que je met a la place?
    aussi pour les capteur de fin de course il seront relié a l’arduino ou???
    merci d’avance

    Reply
    • April 15, 2014 at 11:38 am
      Permalink

      pour les capteurs de fin de course tu peux utiliser des switchs tout bête. Tu pourrais préciser ta question pour les 180 degré car je n’ai pas compris

      Reply
  • April 22, 2014 at 12:32 pm
    Permalink

    Bonjour j’ai besoin d’envoyer une information d’un capteur de proximité a l’arduino ensuite de l’arduino au mini servo moteur apres du mini servo moteur au capteur de force. Pour le language C de l’arduino au servo j’utilise votre code mais pour le capteur de proximité a l’arduino comment ? J’ai un prolème avec le codage de l’arduino

    Reply
    • April 22, 2014 at 4:49 pm
      Permalink

      Auriez vous une reference sur le capteur de force car je n’en ai jamais utilisé

      Reply
  • Pingback:Pilotage d'un moteur avec arduino et raspberry pi - les notes de thierry

  • December 11, 2014 at 11:36 am
    Permalink

    Bonjour j’aimerai le faire tourner a 360° c’est possible ?

    Reply
    • December 14, 2014 at 10:37 am
      Permalink

      Ca depends de ton servo, il y en a qui ne tourne que de quelques degrés

      Reply
  • Pingback:Anonymous

  • Pingback:Motoriser une fenêtre et commander son ouverture | Vahagn's Blog

  • May 15, 2015 at 10:44 am
    Permalink

    Bonjour, j’aimerais regler la vitesse de rotation de mon moteur mais je n’y arrive pas. Je voudrais qu’il soit lent mais qu’il revienne vite à la position initiale

    Reply
  • June 15, 2015 at 5:25 pm
    Permalink

    Dans le code, fait une boucle for avec un delay pour arriver a la position voulue lentement et pour revenir a la position initiale, fait simplement un Monservo.Write(0).

    Reply
  • February 4, 2016 at 1:57 pm
    Permalink

    Bonjour, je suis en premiere S SI et on a un projet à mener sur l’année, les TPE. Au cours de ce travail on a eu besoin de mettre en place un système de rotation programmable avec arduino. Je voudrais savoir si c’était possible de faire tourner un servmoteur sur 360 degrés mais en 22 fois. C’est a dire qu’il y aurait plusieurs crans de environ 16.3 degrés chacun et via un programme arduino le servomoteur tournerais que de ces degrés la.
    Est-ce posible? merci d’avance

    Reply
    • February 10, 2016 at 8:44 am
      Permalink

      Je n’ai jamais essayé. Je vais me renseigner avant de vous répondre.

      Reply
    • February 17, 2016 at 1:15 pm
      Permalink

      Je te conseille de faire des tests uniquement avec le capteur et une foi que tu auras assimilé le comportement du capteur, d’appeler les fonctions données dans mon article.

      Reply
  • February 17, 2016 at 4:12 pm
    Permalink

    bonjour j’ai essayer de modifier votre excellent code pour faire tourner mon servo dans le même sens mais cela ne fonctionne pas . Vous pouvez m’aider svp

    Reply
    • February 20, 2016 at 4:08 pm
      Permalink

      Comment cela dans le meme sens ? le code fournit fonctionne avec tous les servos mais tous les servos ne vont pas a 360 degré

      Reply
  • February 19, 2016 at 2:45 pm
    Permalink

    Bonjour, je suis actuellement sur un projet, et mon but et de commander une voiture RC via une application sur téléphone! Pour celà je supprime le récepteur hertziens et je le remplace par une carte Arduino. Je connais le branchement, cependant je ne connais pas de programme, aurais tu une idée à me proposer?
    Merci d’avance de ta réponse!

    Reply
  • February 20, 2016 at 4:37 pm
    Permalink

    Bonjour, j’aurai besoin d’aide pour la programmation de mon arduino pour mon projet de TPE, de première S SI. Je ne mis connais pas du tout en programmation mais mon servomoteur doit seulement faire un allée retour tout les 24h.
    Puis-je avoir de l’aide.
    Merci

    Reply
    • March 1, 2016 at 10:13 am
      Permalink

      Désolé mais je ne sais pas comment faire pour temporiser sur 24h. Peut être en utilisant la librairie timer

      Reply
  • February 24, 2016 at 12:17 am
    Permalink

    bonjour
    mon projet et de commander un bras manipulateur a 5 moteur a courant continu avec un contrôle de dégrée comment peut faire ca ?
    quelle est la meilleure méthodes pour changer le sens de rotation ?
    et quelle est la solution pour la contrôle de dégrée?

    merci

    Reply
  • December 24, 2017 at 2:33 pm
    Permalink

    bonjour je suis vraiment debutant dans le monde de l’arduino quand je televerse le code ça me met ça :

    Arduino : 1.8.5 (Windows 10), Carte : “Arduino/Genuino Uno”

    Le croquis utilise 2160 octets (6%) de l’espace de stockage de programmes. Le maximum est de 32256 octets.
    Les variables globales utilisent 52 octets (2%) de mémoire dynamique, ce qui laisse 1996 octets pour les variables locales. Le maximum est de 2048 octets.
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x43
    avrdude: stk500_recv(): programmer is not responding
    avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x43
    Problème de téléversement vers la carte. Voir http://www.arduino.cc/en/Guide/Troubleshooting#upload pour suggestions.

    Ce rapport pourrait être plus détaillé avec
    l’option “Afficher les résultats détaillés de la compilation”
    activée dans Fichier -> Préférences.

    Reply
  • April 6, 2018 at 3:08 pm
    Permalink

    bonjour je suis bloqué dans mon projet de terminal car je dois rajouter des capteurs de forces afin d’arrêter les servos. J’ai créé une variable qui me permet de mettre en pose mon servo mais je n’arrive pas a le bloquer a l’angle que je veux il se bloque a chaque foi a l’angle 0 et non au moment ou mon capteur de force détecte une certaine force.
    Merci
    Cdt loic

    Reply

Leave a Reply to jhd Cancel reply

Your email address will not be published. Required fields are marked *