Skyduino:~#
Articles
arduino, programmation, tutoriel

[Tutoriel IRL] Les différents types de moteur et la motor shield d’adafruit

Bonjour à tous !

Aujourd’hui un tutoriel plutôt technique sur les moteurs.

Les moteurs électriques permettent de faire tourner, de déplacer ou encore d’interagir avec divers éléments de la vie réel.
Je ne pense pas avoir à vous expliquer le but du moteurs électrique hein 😉

Il existe trois grand type de moteurs électriques :
– les moteurs à courant continu (moteurs DC),
– les servomoteurs,
– les moteurs pas à pas.
(Je ne parlerai pas des moteurs AC, moteurs de machines outils, …)

Les moteurs à courant continu (moteurs DC):

Avantages :
– pas chére,
– facile à utiliser (2 fils),
– travaille avec une tension continu,
– peuvent atteindre des vitesses de rotation trés élevé.

Inconvénients :
– peu de couple (car vitesse élevé, pour + de couple => moto-réducteur),
– contrôle de la vitesse uniquement (pas de possibilité de contrôle de la position de l’axe),
– relativement gourmand en courant,
– les balais (ou charbons) finissent par s’user.

L’aspect extérieur :

Le moteur à courant continu est très simple à utiliser, câblé dans un sens il tournera dans un sens, câblant dans le sens contraire il tournera dans le sens contraire.
Du faite qu’il est alimenté par un tension continu on peut faire varié sa vitesse par PWM (ou manuellement avec une alimentation variable).

Comment sa marche ?

Un moteur DC est constitué de 3 parties :
– le corps (stator),
– l’axe (rotor),
– les balais.


A l’intérieur du corps ce trouve deux gros aimants appelé « aimants permanents », qui vont crée un champs magnétique à l’intérieur du corps.


L’axe est constitué d’une bobine entouré par une âme en fer doux et surmonté d’un système de contacts sur lesquelles viendront frotter les balais.
Les contacts sont câblé de manière à ce que entre chaque « sections » les deux bobines soit intervertis, de cette manière le champs magnétique s’inversera entre chaque passage d’un contact à un autre.


L’axe est placé dans le corps, entre les deux aimants permanents.

Comment le moteur tourne t’il ?

Temps t=0 – la bobine est alimenté en + / -, un champs magnétique ce crée, celui ci rentre en conflit avec le champs magnétique des aimants permanents qui force l’axe à faire 1/2 tours (rappel de magnétisme : les pôles opposés s’attirent, les pôles identiques ce repoussent).
Temps t=1 – la bobine a fait 1/2 de tours, les contacts se sont inversé, la bobine se retrouve alimenté en – / +, un champs magnétique inverse à celui précédent ce crée, les aimants repousse l’axe qui avance encore d’un 1/2 tours.
Temps t=2=0, les contacts se sont encore inversé, la bobine se retrouve alimenté en + / -, …

Gros plan sur les balais :

La durée de vie des balais aussi appelé « charbons » est relativement courte, tout dépend de la vitesse à laquelle tourne le moteur, si vous avez une perceuse électrique vous avez déjà du en faire l’expérience.

Cas particulier, les moteurs « brushless » :
Les moteurs « brushless » fonctionnent sur le même principe que les moteurs classique à ceci prés qu’ils ne possèdent pas de balais.
La bobine est fixe et ce sont les aimants permanents qui tourne.


(Note sur la photo : ce n’est pas un « vrai » moteur DC « brushless » mais plutôt un mini moteurs pas à pas)

Les servomoteurs :

Avantages :
– relativement précis,
– facilement contrôlable que ce soit via un micro-contrôleur ou via un circuit analogique,
– couple important (tout est relatif hein ;))
– asservissement de la position de l’axe (le servo tentera de rester toujours au même angle),
– dimension standardisé.

Inconvénients :
– un couple et une précision dépendant directement de la qualité de fabrication (« vrai » servo VS servo d’ebay),
– plus ou moins chère,
– vitesse de rotation assez lente.

L’aspect extérieur :

Un servomoteur est constitué d’un corps (ici de taille standard) comportant des fixations sur les cotés et d’un axe sur lequel est vissé un système de fixation (ici rond mais il en existe en étoile, …).

Le câblage :

Un servomoteur comporte toujours 3 fils, un fil de masse (GND), un fil d’alimentation (+5V ou +6V) et un fil de signal.
Les servomoteurs se contrôle via un signal PPM (Pulse Position Modulation), ce type de signal est souvent confondu avec de la PWM (Pulse Width Modulation), les différences entres les deux sont faibles et l’on tolèrent couramment de dire qu’un servomoteur se contrôle en PWM (même si pour le puristes … bref).

L’axe du servomoteur :

Il existe sur le commerce deux type d’axe, les axes plastiques que l’on trouvent souvent sur les « petits » servomoteurs et les axes métal que l’on retrouvent sur les « gros » servomoteurs.

L’électronique de contrôle :


C’est elle qui dirige le servomoteurs et lui donne sa précision, une électronique de mauvaise qualité même avec un système d’engrenage et un moteur de qualité aura des résultats médiocre.
C’est sur ce point que vous devez porter votre attention, les lots d’engrenages des moteurs low-cost en provenance d’ebay sont souvent de même qualité que les « vrai » servomoteurs (enfin pour les axes plastiques) cependant l’électronique qui se trouve derrière est souvent bâclé et de très mauvaise qualité, il n’est pas rare de voir un servomoteurs « ebay » prendre feu, se bloquer à 180° ou encore se casser.
Préférez toujours un servomoteurs « genuine » à un servomoteurs « ebay », il sont pas plus chére mais vous aurez la qualité.
(Astuces: les « vrai » servomoteurs futuba se reconnaisse facilement, les trous de fixations du corps sont « plein », si vous voyez un futuba avec des trous de fixations « ouvert » c’est que c’est un faux.)

Qu’est ce qui donne donne son couple à un servomoteurs ?
Les engrenages !
Il forment un moto-réducteur qui réduit considérablement la vitesse du moteur DC à l’intérieur du servomoteur, moins de vitesse = plus de couple.


(Note: Pensez à mettre de l’huile ou de la graisse pour aéromodélisme dans vos servo 😉 ils seront plus silencieux et il s’useront beaucoup moins)

Le cœur de la cuisine du servomoteurs, le moteur et le potentiomètre !

Comme je vous le disais plus haut, une des grandes force des servomoteurs c’est l’asservissement de l’axe, le servomoteur va faire tout son possible pour toujours garder le même angle, une fois que vous lui avez dis de ce placer à un angle n il y restera quoi qu’il arrive (sauf si vous lui mettait 10Kg à tirer bien sur …) !
Cela est possible via le potentiomètre (sur la droite de la photo) qui renvoi l’angle en temps réel de l’axe à l’électronique de contrôle qui gère le moteur DC.
(ps: il n’est pas possible de lire cette angle sans modifié le servomoteur ;)).
Il est possible de transformer un servomoteur « classique » en servomoteur à rotation continu en remplacent ce potentiomètre par un pont de résistances, mais cela doit être fait uniquement dans certaines conditions.

Les moteurs pas à pas :

Avantages :
– très précis,
– beaucoup de couple.

Inconvénients :
– demande une électronique de contrôle avec un pont en H,
– consomme pas mal,
– poids (moteurs lourd),
– pas d’asservissement (il n’est pas possible de savoir si le moteur pàp est bloqué).

Il existe deux types de moteurs pas à pas, les moteurs bipolaires et unipolaires.
Les moteurs bipolaires comporte 2 bobines, les moteurs unipolaires 4 (+ un commun).

Aspect extérieur (moteur pàp NEMA) :

Ici c’est un moteur bipolaire, facilement reconnaissable de par sa forme et son câblage à 4 fils.

L’intérieur :

Le moteur est costaud, avec un capot sur l’arriérée solidement fixé avec 4 visses, on peut apercevoir le roulement à bille arrière de l’axe.


Le moteurs pàp est constitué d’un axe cranté maintenu par deux roulement à billes, le tout placé dans le corps constitué des deux bobines (ici facilement reconnaissable par leur couleurs) donc les « machoirs » en fer doux sont elles même cranté.
Ces « crans » représentent les pas du moteur pas à pas, ici il y en à 200.

Pour l’explication théorique de fonctionnement du moteur google sera votre amis 😉
Non pas qu’il est compliqué de contrôler un moteur pàp (4 séquences par pas) mais je ne vais pas réinventer la roue, des explications bien plus clair que celle que j’aurai pu faire sont dispo sur le web (avec même des animations ^^ ça fait plus riche).

Partie II – contrôler tous ce petit monde avec une carte arduino ! (ne cherchez pas la partie I, il n’y en a pas :))


La motor shield d’adafruit (dont j’avais fait le test ici) permet de contrôler tout ces types de moteurs de manière trés simple.

Tout d’abord je vous conseille d’ouvrir ces deux liens dans un nouvelle onglet, je vais m’en servir comme base :
http://www.ladyada.net/make/mshield/
http://www.ladyada.net/make/mshield/use.html
(Pour être franc je vais juste vous les traduires en français …)

Pensez aussi à télécharger et à installer la librairie AFMotor : https://github.com/adafruit/Adafruit-Motor-Shield-library

Une fois que vous aurez monté votre « motor shield » (qui je le rappel est vendu en kit) vous pourrez commencer à faire mumuse avec des moteurs mais avant ça quelques petites info.

La « motor shield » comporte un bornier d’alimentation externe et un jumper de sélection, à moins de travailler avec des servomoteurs tout petits (S3003, …) je vous conseille d’enlever ce cavalier et de brancher un source de tension 9v externe sur le bornier.
Dans le cas contraire le fusible de votre arduino va « shunter », pouvant au mieux causer un bug du port usb, au pire l’endommager.

Contrôle d’un servomoteur

Reportez vous à mon tutoriel arduino sur le sujet et à la page suivante :
http://www.arduino.cc/en/Reference/Servo

Contrôle d’un moteur DC

Pour contrôler un moteur DC il faut utiliser un objet AF_DCMotor, celui ci prend deux arguments, le port sur lequel est câblé le moteur (de 1 à 4) et la fréquence de PWM à utiliser (MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, ou MOTOR12_1KHZ, /!\ des fréquences basse comme 1 ou 2KHz sont audibles, de plus les moteurs 3 & 4 ne peuvent tourner que à 1KHz).
La vitesse se contrôle via setSpeed(x) avec x une valeur entre 0 et 255 (0 -> arrêt complet, 255 -> vitesse max).
Le sens de rotation est quand à lui controlé via run(m) avec m pouvant prendre les valeurs FORWARD (sens horaire), BACKWARD (sens anti-horaire) ou RELEASE (arrêt du moteur).

#include <AFMotor.h> // Inclusion de la librairie AFMotor

AF_DCMotor motor(2, MOTOR12_64KHZ); // Déclaration d'un moteur DC sur le port 2, avec une fréquence de PWM de 64KHz

void setup() {
  Serial.begin(9600);           // Configuration du port série (pour le debug)
  Serial.println("Motor test!"); // Petit message de bienvenue
  
  motor.setSpeed(200);     // vitesse à 200 (78% de la vitesse max)
}

void loop() {
  Serial.print("tick");
  
  motor.run(FORWARD);      // sens horaire
  delay(1000);

  Serial.print("tock");
  motor.run(BACKWARD);     // sens anti-horaire
  delay(1000);
  
  Serial.print("tack");
  motor.run(RELEASE);      // moteur arrêté
  delay(1000);
}

Contrôle d’un moteur pàp

Le controle d’un moteur pas à pas ce fait aussi simplement, il faut seulement déclarer un objet AF_Stepper avec comme argument le nombre de pas du moteur (souvent 48 ou 200, tout dépend du moteur -> datasheet) et le port sur lequel il est connecté (de 1 à 2).

La vitesse se contrôle via setSpeed(x) avec x le nombre de tours par minutes voulu.
Par défaut l’axe du moteur sera « figer », si vous tentez de le tourner à la main il résistera, pour le débloquer il faut appeler la fonction release().

Pour faire tourner l’axe la méthodes est différente, comme sur un moteur pàp on compte en nombre de pas il ne sera pas possible de faire un simple FORWARD ou BACKWARD comme avec un moteur DC.
La fonction step() prend donc 3 arguments, le nombre de pas à exécuter, la direction (FORWARD ou BACKWARD) et la précision du pas (SINGLE, DOUBLE, INTERLEAVE ou MICROSTEP.).
Kesako?
« Single » -> pas simple, déplacement normal de base, une seul bobine est activé à la fois,
« double » -> pas double, deux bobine sont activé en simultanément ce qui donne beaucoup plus de couple,
« interleave » précision d’un demi pas, couple relativement faible et une vitesse divisé par deux,
« Microstepping » très grande précision, utile pour faire des déplacement « lissé » sans accoups, vitesse très lente.
Il est bien sur possible de passer d’un mode à l’autre entre deux step() 😉

Remarque: la fonction step() est dite « bloquante », cela signifie que le code après step() ne sera exécuté qu’une fois le déplacement de n pas effectué.

#include <AFMotor.h> // Inclusion de la librairie AFMotor

AF_Stepper motor(48, 2);

void setup() {
  Serial.begin(9600);           // Configuration du port série (pour le debug)
  Serial.println("Stepper test!"); // Petit message de bienvenue

  motor.setSpeed(100);  // 100 pas par minutes

  motor.step(100, FORWARD, SINGLE); 
  motor.release(); // Libére l'axe après un déplacement
  delay(1000);
}

void loop() {
  motor.step(100, FORWARD, SINGLE);  // pas simple -> mode normal
  motor.step(100, BACKWARD, SINGLE); 

  motor.step(100, FORWARD, DOUBLE); // pas double -> + de couple (+ de conso électrique)
  motor.step(100, BACKWARD, DOUBLE);

  motor.step(100, FORWARD, INTERLEAVE); // demi pas -> + de précision (- de vitesse)
  motor.step(100, BACKWARD, INTERLEAVE); 

  motor.step(100, FORWARD, MICROSTEP); // micro pas -> plus de fluidité
  motor.step(100, BACKWARD, MICROSTEP); 
}

Remarque : Si vous voulez faire bouger deux moteurs en même temps il existe la libraire AccelStepper qui permet de faire des choses plus poussé mais qui est plus compliqué à utiliser.

Voila Voila !
A partir de maintenant vous savez tout sur les moteurs et la motor shield 🙂
Maintenant vous ne pourrez plus dire que vous ne savez pas comment contrôler un robots à 4 roues, une tourelles à servomoteurs et ou un machine CNC à moteur pàp ^^

Discussion

33 réflexions sur “[Tutoriel IRL] Les différents types de moteur et la motor shield d’adafruit

  1. Pas encore de commentaires.

    Publié par Ricardo Jean | 4 février 2012, 4 h 34 min
  2. Il y a de plusieurs moteur, types moteur.

    Publié par Ricardo Jean | 4 février 2012, 4 h 35 min
  3. merci pour ce tuto super utile mais tu n’argumante pas assez…
    c’est quoi le « port séire » ?
    a quoi sert le « serial.print » ?
    et c’est tout ^^ merci de me répondre au plus vite, mais je ne suis pas pressé

    Publié par Matruck | 25 février 2012, 22 h 14 min
  4. Salut, tout d’abord super les explications, j’avais un peu de mal avec le tuto en anglais, mais peut-être pourras-tu me renseigner ? Je viens de commencer mes expérimentations sur ce shield mais lorsque je fais le prog d’exemple « Motor test » pour un moteur pap, avec un moteur en 48 pas, au lieu de faire les 100 pas prévus (soit normalement un peu plus de 2 tours) il n’en fait a peu prêt qu’un demi. Aurais-tu une petite idée pour résoudre mon problème ?
    D’avance merci de ta réponse.

    Publié par Natanaels | 15 septembre 2012, 19 h 33 min
    • >> avec un moteur en 48 pas, au lieu de faire les 100 pas prévus (soit normalement un peu plus de 2 tours) il n’en fait a peu prêt qu’un demi. Aurais-tu une petite idée pour résoudre mon problème ?

      Tu as bien configuré ton moteur en 48 pas avec AF_Stepper motor(48, 2); ?
      Si oui en faisant motor.step(48, FORWARD, SINGLE); tu doit avoir exactement un tour complet.

      Sinon je vois pas ce qui pourrait causer ce genre de bug désolé …

      Publié par skywodd | 16 septembre 2012, 12 h 49 min
  5. Yop ! Merci pour toutes ces infos, mais je me demandais avec le L293D on ne peut pas contrôler 2 moteur (dc) en même temps ? Et on ne peut pas changer la vitesse en plein milieu de loop ? (pour tourner) j’ai eu l’habitude d’utiliser la librarie pololu donc tout de suite c’est plus compliquer avec AFMmotor…

    Publié par timmyzophrene | 29 décembre 2013, 20 h 43 min
    • 2 moteurs DC ou 1 moteur pàp.
      Tu peut changer de sens et de vitesse, c’est le but du truc 😉

      Publié par skywodd | 3 janvier 2014, 13 h 41 min
      • Merci de la réponse j’ai reçu le module et construit mon robot :DDD plus qu’à trouver une nouvelle batterie correcte

        Publié par timmyzophrene | 3 janvier 2014, 14 h 32 min
  6. Salut,

    Comme je vois qu’en plus de faire de très bon tutos, tu n’hésites pas à revenir aider ceux qui auraient des questions, j’en profite pour te dire merci et poser la mienne :

    J’ai bien suivi à la lettre les instructions afin de piloter un moteur DC, mais lorsque je souhaite téléverser le code proposé j’obtiens ces erreurs :

    Moteur:3: error: ‘AF_DCMotor’ does not name a type
    Moteur.ino: In function ‘void setup()’:
    Moteur:9: error: ‘motor’ was not declared in this scope
    Moteur.ino: In function ‘void loop()’:
    Moteur:15: error: ‘motor’ was not declared in this scope
    Moteur:15: error: ‘FORWARD’ was not declared in this scope
    Moteur:19: error: ‘BACKWARD’ was not declared in this scope
    Moteur:23: error: ‘RELEASE’ was not declared in this scope

    Est-ce que tu pourrais m’aider s’il te plait ? 🙂

    Publié par NeOtuX | 26 février 2014, 18 h 23 min
    • Re,

      J’ai résolu en installant la librairie AFMotor ! 😉

      Par contre j’ai une nouvelle question : jusqu’à combien peut-on alimenter le Motorshield sans risque (tension, intensité) ?

      En fait je souhaite piloter deux moteurs aux alims radicalement différentes puisque l’un est tout petit est fonctionne normalement avec 3 piles de 1,5V, alors que l’autre est un moteur d’imprimante qui nécessite du 32V… Est-ce qu’une « grosse » alimentation pourrait faire fonctionner simultanément les deux moteurs ?

      Merci par avance pour ton aide. 🙂

      Publié par NeOtuX | 26 février 2014, 19 h 14 min
      • L’alimentation de la shield est commune pour tout les moteurs.
        Dans ton cas il faudra faire un choix, moteurs 6v ou 32v, mais pas les deux 😉

        Ps: attention de ne pas laisser le jumper pour relier le VCC de l’arduino et ton alim externe sinon ça fera boom.

        Publié par skywodd | 1 mars 2014, 16 h 59 min
  7. bonjour
    et merci pour cette excellente explication
    si j’ai un moteur ac est ce que je peut utiliser ce shield pour commande ce moteur ac???
    et merci d’avance

    Publié par kaw | 24 mars 2014, 8 h 56 min
  8. bonjour je cherche a piloter 2 moteur pàp et un moteur DC en même temps ce shield peut il convenir si on rajoute un l293d ? ou connaisser vous un autre shild pour sa ? merci !

    Publié par sebastien | 9 juillet 2014, 20 h 48 min
  9. merci de la reponse, mais j’ai finalement crée ma carte maison avec 3 l293d brancher a l’arduino !

    Publié par sebastien | 18 juillet 2014, 10 h 28 min
  10. Bonjour tout le monde et très bonne année!!
    Je voudrais savoir comment brancher le petit moteur qui fait tourner le cd dans l’ordinateur sur ma carte motorshield?
    Est-que l’on considère que c’est un moteur continu (j’ai testé plein de branchements et rien à marcher)
    Est-ce qu’on considère que c’est un mini pas à pas?
    Merci beaucoup d’avance pour votre réponse.
    Bonne journée

    Publié par carouch | 2 janvier 2015, 16 h 45 min
    • >> Je voudrais savoir comment brancher le petit moteur qui fait tourner le cd dans l’ordinateur sur ma carte motorshield?
      >> Est-que l’on considère que c’est un moteur continu (j’ai testé plein de branchements et rien à marcher)
      >> Est-ce qu’on considère que c’est un mini pas à pas?

      Ya combien de fils ? En général c’est de moteurs pas à pas bipolaire, ça ce contrôle d’une autre façon.

      Publié par Skywodd | 8 janvier 2015, 17 h 48 min
  11. Bonjour,
    C’est le moteur qui est sur la photo p1030783 ci-dessus.
    Donc apparemment 3 fils.
    Merci encore

    Publié par carouch | 9 janvier 2015, 11 h 55 min
  12. bonjour,
    j’ai un moteur PaP que je souhaite faire fonctionner pour accelerer un moteur thermique, vie la pompe à injection, j’ai une carte UNO et une motorshield, mais mon programme ne fonctionne pas comme je veux, ça tourne dans un sens ou dans l’autre avec le potentiometre, mais je voudrais que ça suive le déplacement du potar et non pas tourner en continue.
    merci

    Publié par raveneau | 16 juillet 2015, 15 h 21 min
  13. Monsieur bonjour,je viens de lire et visionner votre site et je desirerai savoir si vous connaissez un site ou trouver le porte charbon pour un moteur de perceuse sans fil moteur HRS550SL DC 14,4 V c’est ce qu’il y a de marquer sur le moteur;en effet sur cette piece plastique blanc les deux languettes porte charbon et les deux charbons sont HS donc il me faut remplacer toute la piece.En vous remerciant de votre reponse.Tres cordialement.

    J-L BERNARDI

    Publié par BERNARDI Jean-Luc | 17 septembre 2015, 16 h 36 min

Rétroliens/Pings

  1. Pingback: Séance 2 | Drawbot - 11 avril 2015

  2. Pingback: Robot-électronique | Pearltrees - 18 août 2015

  3. Pingback: Arduino | Pearltrees - 16 février 2016

  4. Pingback: Le dossier de la semaine : l'Internet des objets | Pearltrees - 6 mars 2016

  5. Pingback: Arduino | Pearltrees - 15 avril 2016

  6. Pingback: Robots | Pearltrees - 4 Mai 2018

Skyduino devient Carnet du Maker

Le site Carnet du Maker remplace désormais le blog Skyduino pour tout ce qui touche à l'Arduino, l'informatique et au DIY.