Home Tutoriels / Articles Arduino : Tutoriel pour cabler et commander un moteur pas à pas 4 poles
 
Arduino : Tutoriel pour cabler et commander un moteur pas à pas 4 poles PDF Imprimer Envoyer
Note des utilisateurs: / 58
MauvaisTrès bien 
Mercredi, 09 Février 2011 09:26

Aillant récemment obtenu un module Arduino Uno, je me suis essayé à quelques bidouillages...

Module Arduino Uno

 

 

 

 

 

 

 

 

 

 

Voici donc comment j'ai procédé pour câbler et commander un moteur pas à pas 4 pôles, issu tout droit d'un vieux lecteur de CD-ROM :

Moteur pas à pas d'un lecteur CD

 

La document technique de ce genre de moteur est disponible ici :

http://robocup.idi.ntnu.no/wiki/images/c/c6/PL15S020.pdf

 

 

 

 

 

 

 

 

 

 

Pour réaliser ce montage il faudra aussi ce procurer un circuit intégré 754410 (QUADRUPLE HALF-H DRIVER) afin de donner un peu de puissance au moteur pas à pas.

 

CI 754410

 

La documentation du CI est ici :

http://www.makingthings.com/resources/datasheets/SN754410NE_slrs007b.pdf

 

On peut le trouver chez n'importe quel magasin d'électronique pour quelques euros.

 

 

Câblage du CI 754410 sur le module Arduino

 

Pour connecter le CI au module Arduino, nous devons utiliser 4 E/S au choix (nommée ci-après A, B, C et D), l'alimentation 5V, la masse (GND) et l'alimentation en puissance issue du module Arduino (Vin).

 

Voici le cablage :

Cacblage CI 754410 pour Moteur PP - Commande A, B, C et D sont a relier au 4 E/S choisies sur le module Arduino

- Moteur A1, A3, B1 et B3 sont les quatre pôles du moteur (Voir ci-après)

 

 

 

 

 

 

 

 

 

 

Câblage du moteur

Cablage d'un moteur Pas à Pas de Lecteur CD

 

 

Le dessin n'est pas très lisible, vous pouvez zoomer un peu.

Ca donne ceci :

     A3

           B3

     A1

           B1

 

 

En démontant plusieurs lecteur CD je suis tomber sur certains modèles légèrement différents, le câblage est le même, A1/A3 coté axe et B1/B2 de l'autre.

 

 

Pilotage du CI 754410, effets sur l'alimentation du Moteur

 

L'idée d'utiliser le CI 754410 est venue en construisant Ardubot (Plus d'information sur Ardubot). Ce module utilise le 754410 pour piloter les deux moteur en puissance, c'est à dire avec un courant venant de la batterie et non du signale logique (+5V TTL) qui en ai quasi dépourvu.

 

Comme il est possible de faire tourner chacun des deux moteurs dans un sens différents, il est possible de mettre - ou + entre les broches 3 et 6 du CI et de même pour les broches 14 et 11.

 

Voici le tableau des positions du moteur en fonction de son alimentation :

 

Sequence du Moteur pas à pas

 

 

Librairie de pilotage de l'ensemble 754410/Moteur pour Arduino

 

Une fois câblé, voici le petit bout de programme pour piloter le moteur :

Fichier Principal :

#include "CMoteurPP.h"

CMoteurPP Moteur1(9,8,7,6);

void setup()
{
  Serial.begin(115200);
  Serial.println("Demarrage...");
}

void loop()
{
  //on avance de 100 pas
  Moteur1.move(100);
  Moteur1.move(0); //Arreter l'alimentation
  delay(1000);
 
  //on recule de 100 pas
  Moteur1.move(-100);
  Moteur1.move(0); //Arreter l'alimentation
  delay(1000);
}

Le fichier CMoteurPP.h :

#include "WProgram.h"
#include "stdio.h"
#include "stdlib.h"

#ifndef _MoteurPP_H
#define _MoteurPP_H

enum T_POLE {
  POSITIF,
  NEGATIF
};

typedef T_POLE POLE;

class CMoteurPP
{
 private :
   int p1;
   int p2;
   int p3;
   int p4;
 protected :
 
 public :
   unsigned int step;
 
   void write(unsigned int step);
   CMoteurPP(int p1, int p2, int p3, int p4);
   ~CMoteurPP();
   void move(int step);
   void avance();
   void recule();
   void stop();
};

#endif

Et le fichier CPP qui va avec :

#include "CMoteurPP.h"

/**
* Constructeur
* P1 => A1
* P2 => A3
* P3 => B1
* P4 => B3
*/
CMoteurPP::CMoteurPP(int p1, int p2, int p3, int p4)
{
  this->p1 = p1;
  this->p2 = p2;
  this->p3 = p3;
  this->p4 = p4;
  this->step = 0;
  pinMode(this->p1, OUTPUT);
  pinMode(this->p2, OUTPUT);
  pinMode(this->p3, OUTPUT);
  pinMode(this->p4, OUTPUT);
}

/**
* Destructeur
*/
CMoteurPP::~CMoteurPP()
{
  this->write(0);
}

/**
 * Ecrit un pas sur les E/S
 * Si step est égale à 0, on arrete d'alimenter les bibines
*/
void CMoteurPP::write(unsigned int nstep)
{
  if (nstep == 1)
  {
    digitalWrite(this->p1, LOW);
    digitalWrite(this->p2, HIGH);
    digitalWrite(this->p3, HIGH);
    digitalWrite(this->p4, LOW);
  }
  else if (nstep == 2)
  {
    digitalWrite(this->p1, LOW);
    digitalWrite(this->p2, HIGH);
    digitalWrite(this->p3, LOW);
    digitalWrite(this->p4, HIGH);    
  }
  else if (nstep == 3)
  {
    digitalWrite(this->p1, HIGH);
    digitalWrite(this->p2, LOW);
    digitalWrite(this->p3, LOW);
    digitalWrite(this->p4, HIGH);
  }
  else if (nstep == 4)
  {
    digitalWrite(this->p1, HIGH);
    digitalWrite(this->p2, LOW);
    digitalWrite(this->p3, HIGH);
    digitalWrite(this->p4, LOW);
  }
  else
  {
    //stop
    digitalWrite(this->p1, LOW);
    digitalWrite(this->p2, LOW);
    digitalWrite(this->p3, LOW);
    digitalWrite(this->p4, LOW);
  }
}

/**
* Effectue NbStep pas sur le moteur
* Si NbStep est négatif, le moteur tourne dans l'autre sens
* Si NbStep est égale à 0, on arrete d'alimenter le moteur
*/
void CMoteurPP::move(int NbStep)
{
   if (NbStep == 0)
   {
       this->write(0); //Arreter d'alimenter le moteur
       return;
   }
   for(int i = 0; i  0)
     {
        this->step++;
        this->write((this->step%4)+1);
     }
     else
     {
        this->step--;
        this->write((this->step%4)+1);
     }
   }
}

void CMoteurPP::avance()
{
   this->step++;
   this->write((this->step%4)+1);
}

void CMoteurPP::recule()
{
   this->step--;
   this->write((this->step%4)+1);
}

void CMoteurPP::stop()
{
   this->write(0);
}

Voilà, après déploiement sur le module Arduino, le moteur devrait tourner de 100 pas dans un sens, puis de 100 pas dans l'autre.

Attention, une fois que le moteur a été actionné, même a l'arrêt, les enroulements restent sous tension. Pour les libérer, demandez un déplacement de 0.

Ce montage a été testé avec une batterie de 6 Volt et 9 Volt.

Mise à jour le Mardi, 19 Avril 2011 08:17
 

Commentaires  

 
0 #1 Matruck 16-02-2012 21:08
ton tuto est exactement ce que je cherchais mais la partie des branchements n'est pas très claire, du moins pour moi qui est novice dans le domaine. Pourrais tu mettre des images ou une video sur youtube qui expliqueraient les branchements du SN754410 sur la carte et du moteur ?
merci d'avance. tu peux me répondre a l'adresse:
Citer | Signaler à l’administrateur
 
 
0 #2 vincent 17-02-2012 07:48
Bonjour,

J'ai rédigé ce tutoriel sur le vif, d’où le manque de clarté.

Cependant, il n'y a rien de compliqué : les broches 2, 15, 7 et 10 du SN754410 sont câblés respectivement sur les broches 9,8,7 et 6 d'arduino (Il est même préférable d'utiliser les sorties PWM, je m'en rends compte maintenant que je me relis, si tu changes, il faudra modifier la déclaration de l'objet moteur dans le fichier principal).

Pour le moteur, les broches 3,6 et 14,11 sont a brancher sur le moteur respectivement sur les fils A1, A3 et B1, B3.

Au pire , si tu te trompes (ou si j'ai fait une erreur dans ce tuto) le moteur se mettra a vibrer légèrement au lieu de tourner.
Citer | Signaler à l’administrateur
 
 
+1 #3 Mattmouthe 17-10-2012 12:02
Bonjour,
ton tuto est tout à fait ce que je cherchais!

Je voudrai faire un robot mobile avec deux moteurs (1 de chaque côté du robot). Mais je ne sais pas quel est le meilleur moteur à prendre: le moteur pas à pas ou un servomoteur.
Ce qui je pense me déciderai facilement serai de savoir si c'est possible de réduire la vitesse de rotation d'un des moteur pas à pas. En effet, pour tourner, je voudrai réduire la vitesse de rotation d'un côté.

Merci d'avance pour ta réponse
Mattmouthe
Citer | Signaler à l’administrateur
 
 
0 #4 vincent 17-10-2012 12:31
Bonjour,

Attention, ce tutoriel a été réalisé avec un moteur de lecteur CD, tu ne peux pas utiliser ce moteur pour ton robot.

Pour ce qui est du servomoteur, je pense que tu fais fausse route : il y a deux type de servomoteur, le premier garantit un angle (pas de rotation continu) et le deuxième garantit une vitesse (donc pas la possibilité d'obtenir une position d'arbre précise).

Il tes reste donc deux type de moteur possible :
- le moteur PàP
- le moteur CC + roues codeuses

Pour ce qui est de contrôler la vitesse de rotation d'un moteur PàP, c'est ton programme qui va le faire, en modulant le temps d'attente entre deux ordres.

Le plus dure sera de programmer de tel manière a ce que ton algo pilote les deux roues de manière distinct. Mais c'est une autre question.

Vincent
Citer | Signaler à l’administrateur
 
 
+1 #5 Bobyone 08-11-2012 18:33
j'ai un soucis : OUTPOUT was not declared int the scope, je ne suis pas un specialiste.. du coup j'ai un peu de mal a debuguer : il pointe l'erreur sur CMoteurPP.cpp sur
pinMode(this->p1, OUTPUT);

merci de tes conseils
Citer | Signaler à l’administrateur
 
 
0 #6 vincent 08-11-2012 19:34
Bonjour Bodyone,

Je pense que c'est un problème d'include.
Vérifie la ligne suivante le le fichier header CmoteurPP:

#include "WProgram.h"

Cordialement,
Citer | Signaler à l’administrateur
 
 
0 #7 Eleve.K 15-11-2012 07:55
Bonjour, j'aimerais piloté un moteur depis un ordinateur. Je compte faire un TPE de 1ereS, mon sujet est un ascenseur.
Il me faudrait deux moteur pas à pas, et de quoi le diriger electroniquemen t ou plutot qu'il ce déplace seul. Sans une intervention manuel juste en appuyant sur un bouton depuis un ordinateur par exemple. Si vous pouriez au moins me diriger vers des liens qui me seront utile ? merci coradialement Eleve.K
Citer | Signaler à l’administrateur
 
 
0 #8 vincent 15-11-2012 09:37
Bonjour,

La route est longue pour arrivé a ton objectif.

Je peux te proposer de te renseigner sur les sujets suivants dans un premier temps :
- Moteurs Pas à pas
- Arduino Motor Shield
- Arduino
- Développement C/C++
- Communication Série / RS232

Cordialement,
Vincent
Citer | Signaler à l’administrateur
 
 
0 #9 DUBOST 31-12-2012 21:43
Bonsoir,
Je souhaiterai réaliser le même genre de projet que vous mais, sans ordinateur sauf pour le chargement initial, pour 2 moteurs (1 droit et 1 gauche) et avec des moteurs "pompant" 5A.
Pour l'intensité puis-je utiliser votre programme en câblant les moteurs via un étage de puissance (drivers) au lieu de câbler directement les moteurs (les signaux étant envoyés aux divers et non aux moteurs) ?
Pour commander les 2 moteurs faut-il tout doubler ?
il y a 2 moteurs pour faire varier la direction d'un petit véhicule électrique, La variation de vitesse de le l'un des deux ou des 2 moteurs entraînant une variation de direction.
Le véhicule étant autonome, comment émettre un ordre de variation de vitesse à l'un des 2 moteurs. Puis-je ajouter un interface IR, ou BLUETOOTH ? Si oui ou le mettre et sur quel paramètre de l'ARDUINO UNO dois-je agir pour contrôler la trajectoire de mon véhicule ?
Merci pour votre réponse.
Cordialement
Citer | Signaler à l’administrateur
 
 
+1 #10 vincent 02-01-2013 08:54
Bonjour,

Citation en provenance du commentaire précédent de DUBOST:
Bonsoir,
Je souhaiterai réaliser le même genre de projet que vous mais, sans ordinateur sauf pour le chargement initial, pour 2 moteurs (1 droit et 1 gauche) et avec des moteurs "pompant" 5A. Pour l'intensité puis-je utiliser votre programme en câblant les moteurs via un étage de puissance (drivers) au lieu de câbler directement les moteurs (les signaux étant envoyés aux divers et non aux moteurs) ?


Oui, aucun problème pour réutiliser mon code.
Au sujet de "l'étage de puissance" c'est le CI 754410 qui réalise cette fonction dans mon projet. Pour 5A, il faudra utiliser autre chose (ou ajouter un deuxième étage de puissance).

Citation en provenance du commentaire précédent de DUBOST:
Pour commander les 2 moteurs faut-il tout doubler ?


Oui. Le CI ne pourra gérer qu'un seul moteur PP, mais deux moteurs à courant continu. Ensuite, il faut bien comprendre que l'utilisation que j'ai faite du CI 754410 et du moteur PP de CD-ROM n'est pas idéale. Ces composants ne sont, à l'origine, pas prévue pour fonctionner ensemble.

Citation en provenance du commentaire précédent de DUBOST:
il y a 2 moteurs pour faire varier la direction d'un petit véhicule électrique, La variation de vitesse de le l'un des deux ou des 2 moteurs entraînant une variation de direction.
Le véhicule étant autonome, comment émettre un ordre de variation de vitesse à l'un des 2 moteurs.


Il faudra modifier le code pour cela. Mais c'est réalisable.

Deux autres solutions sont possibles pour faire pivoter le véhicule : Arréte l'un des moteurs, ou inverser le sens d'un seul moteur par rapport à l'autre.

Ces deux dernières solutions sont moins couteuse d'un point de vue programmation surtout avec des moteur PàP.

Citation en provenance du commentaire précédent de DUBOST:
Puis-je ajouter un interface IR, ou BLUETOOTH ? Si oui ou le mettre et sur quel paramètre de l'ARDUINO UNO dois-je agir pour contrôler la trajectoire de mon véhicule ?


Pour cela, regardez du coté des "shield arduino".

Je pense que vous devriez vous renseigner sur "Ardubot", c'est une petite voiture qui réalise ce que vous attendez. C'est d'ailleurs à partir de ce petit véhicule que j'ai réalisé ce tutoriel et compris le fonctionnement du CI 754410. A noter que ce véhicule utilise deux moteurs CC et non PàP.

Cordialement,
Vincent
Citer | Signaler à l’administrateur
 

Ajouter un Commentaire


Code de sécurité
Rafraîchir

Contrat Creative Commons

Ces documents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 2.0 France.

Toute copie partielle ou totale de ce site doit mentionner http://vpicot.fr