Utilisation d’un moteur pas-à-pas

Aujourd’hui, suite à de nombreuses questions à propos de l’utilisation des drivers pas-à-pas, nous allons réaliser une mise en pratique d’un driver de Pololu avec un moteur pas à pas.

Pour la réalisation nous aurons besoin de :

Materiel

Soudure des connecteurs et réglage du courant

Il faut dans un premier temps souder les deux connecteurs sur le driver pour l’utiliser avec la plaque de connexion rapide. Soudez les deux connecteurs de telle sorte que le potentiomètre de réglage reste accessible lorsque le driver sera inséré sur la plaque de connexion rapide.

Il est nécessaire de régler le courant en fonction de votre moteur pas-à-pas, ici pour notre moteur il faut régler le courant sur 0,7 A (on règle généralement le courant à 70% du courant de bobine –  ici 1A). Chaque driver possède son propre système de réglage du courant, vous devez vous reporter à la fiche technique pour faire ce réglage. Certains drivers se configurent à l’aide de dip-switches, d’autres avec un potentiomètre (comme ici), etc.

Il faut alimenter le driver à partir de la carte Arduino pour procéder au réglage du courant :

  • VCC de l’Arduino sur VDD du driver
  • GND de l’Arduino sur le GND du driver

Vous devez utiliser un multimètre pour régler le courant à l’aide du potentiomètre de réglage, la formule de conversion est la suivante :

Vref = 8 x Imax x Rcs [avec Rcs = 0,068 Ω (formule disponible dans la fiche technique du driver)]
Vref: 0,3808 V

Vous devez mesurer la tension sur le potentiomètre à 0,38 V environ pour obtenir un courant de 0,7 A (la masse du multimètre étant reliée sur le GND de la carte Arduino). Vous pouvez mettre directement la pointe de touche sur le tournevis pour faciliter le réglage.

reglage courant
reglage tournevis

Brochage des différents éléments

Vous devez réaliser le montage suivant pour tester le fonctionnement du moteur, il s’agit du montage minimal pour faire fonctionner le moteur.

La broche DIR (direction) est raccordée sur l’entrée D4 de la carte Arduino et la broche STEP (cadencement) sur la broche D5.
La broche DIR permet de choisir la direction et le moteur avant d’un  »pas » à chaque impulsion sur la broche STEP.

montage ok debut

Programmation Arduino

Nous allons réaliser un programme Arduino très simple pour faire tourner le moteur d’un tour dans un sens puis dans l’autre sens.

int tempo=1; // Cette valeur détermine la vitesse du moteur, 1 = rapide, 100 = lent

void setup() {
    pinMode(4, OUTPUT); // On initialise les broches D4 et D5 en sorties
    pinMode(5, OUTPUT);
}

void loop() {
    delay(1000);

    digitalWrite(4, HIGH); // On met la broche DIR à l'état haut
    for (int i=0; i <= 200; i++){
        digitalWrite(5, LOW);
        delay(tempo); // On envoie 200 impulsions pour faire tourner le moteur de 200 pas dans un sens
        digitalWrite(5, HIGH); // La valeur de tempo determine le temps entre 2 impulsions en ms
        delay(tempo);
    }

    delay(1000);

    digitalWrite(4, LOW); // On met la broche DIR à l'état bas pour changer de sens
    for (int i=0; i <= 200; i++){
        digitalWrite(5, LOW);
        delay(tempo); // On envoie 200 impulsions pour faire tourner le moteur dans l'autre sens
        digitalWrite(5, HIGH); // La valeur de tempo determine le temps entre 2 impulsions en ms
        delay(tempo);
    }

}

Vous pouvez vous référer à cet article pour installer et utiliser le logiciel Arduino si nécessaire.

Après avoir téléversé le programme et mis en marche l’alimentation du moteur, il devrait tourner dans un sens sur 1 tour et dans l’autre sens.

Ajout d’un bouton-pousssoir et d’un potentiomètre de réglage

Il est généralement nécessaire de contrôler le moteur pas-à-pas en vitesse et marche/arrêt selon l’application, l’exemple suivant permet d’ajouter ces deux fonctions.
Nous utiliserons les éléments suivants pour faciliter le raccordement :

 

Nous allons raccorder le potentiomètre sur l’entrée A0 et le bouton-poussoir sur l’entrée D6.

1] Vous devez échanger la broche noire avec la broche rouge sur le module bouton-poussoir pour correspondre avec le Shield bornier.

inversion polarité

2] Raccordez le potentiomètre et le bouton poussoir.

3] Faîtes un pont entre le VCC de gauche et le VCC de droite pour alimenter la partie droite du Shield.

Vous devez ensuite téléverser le programme Arduino suivant :

int tempo=1;
int tourne=0;
int vitesse=1;

void setup() {
    pinMode(6, INPUT);
    pinMode(4, OUTPUT); // Broches 4 et 5 en sorties et broche 6 en entrée
    pinMode(5, OUTPUT);
    digitalWrite(4, HIGH);  // On choisit un sens de rotation
}

void loop() {
    int capteur = digitalRead(6); // On lit la valeur du bouton-poussoir
    vitesse = analogRead(A0); // On lit la valeur du potentiomètre
    tempo = map(vitesse, 0, 1023, 1, 100); // On convertit la valeur du potentiomètre en vitesse

    if (capteur == HIGH) {
        tourne = !tourne;           // On permute entre marche/arrêt lorsque l'on appuie sur le bouton-poussoir 
        delay (500);
    }

    if (tourne == HIGH) {
        digitalWrite(5, LOW);
        delay(tempo);                  //On fait tourner le moteur avec la vitesse suivant le potentiomètre
        digitalWrite(5, HIGH);
        delay(tempo);
     }

}

Adaptation à votre projet

Ce tutoriel est valable avec la plupart des cartes de commande et des moteurs pas-à-pas. Il faut choisir le driver en fonction du moteur, on travaille généralement à 70% du courant.

Exemple d’autres drivers :

 

Exemple d’autres moteurs :

Le brochage est à adapter en fonction du moteur et du driver, toutes les informations de raccordement sont disponibles dans les onglets fiches techniques.

Le programme Arduino inclus dans ce tutoriel est très simple et peut facilement être adapté à votre utilisation, des nombreuses librairies plus complexes sont disponibles si nécessaire.

11 Commentaires
  • Léandre
    Publié à 19:20h, 18 janvier

    Pouvez-vous m’aidez, ca ne fonctionne pas, mon moteur ne tourne pas sur les tests 1 et 2, il fonctionne en temps normal comme l’arduino.

  • Yohann
    Publié à 16:18h, 06 février

    Bonjour, je ne comprends pas votre question, pouvez vous me faire un mail sur sav@gotronic.fr pour comprendre votre problème ? Merci, bonne journée.

  • Yohann
    Publié à 13:17h, 06 juin

    Bonjour, vous utilisez le même moteur que dans l’exemple ? Votre moteur vibre ou pas du tout ? Le câblage du moteur peut être différent suivant le modèle. Bonne journée.

  • fred
    Publié à 13:52h, 31 juillet

    Bonjour, comment avez-vous déterminez que 1 ms = 1 pas ?
    « delay(tempo); // On envoie 200 impulsions pour faire tourner le moteur de 200 pas dans un sens »
    Bonne journée !

  • Yohann
    Publié à 10:02h, 12 août

    Bonjour, le 1ms correspond au délais entre deux pas, plus le delay est long, plus le moteur va lentement. Je reste à votre disposition par mail si vous le souhaitez à l’adresse sav@gotronic.fr. Merci, bonne journée.

  • Philippe Corvazier
    Publié à 19:34h, 15 mars

    Je suis désolé, mais ce que vous proposez dans ce blogue ne peut pas fonctionner, et effectivement ne fonctionne pas. J’ai identifié plusieurs problèmes
    Constat : le moteur ne semble pas alimenté et tourne librement à la main.
    L’arduino uno fonctionne bien, on peut voir les tensions varier sur les sorties D4 et D5 de Arduino, et je le
    trace avec le moniteur de L’IDE Arduino.
    Si on alimente une bobine du moteur sous 3 volts il est parfaitement bloqué, donc il fonctionne

    Matériel utilisé : celui du blog
    Moteur : 14HS 11-1004S
    Driver : A4988 2128
    Cause 1 : Le driver livré n’est pas repéré, il peut être n’importe quoi, je ne peux pas vérifier, pas de référence sur le circuit.
    Cause 2 : Le driver prévu fonctionne avec une alimentation moteur de 8 à 35 Volts. Le moteur lui est limité à une alimentation de 3.5 volts. J’ai essayé à 5 volts, idem. Je n’ai pas essayé plus. Vous ne parlez jamais de la tension d’alimentation du moteur. Ce driver ne convient pas au moteur.
    Cause 3 : Le pompon . Sur la photo du montage et sur la vidéo ou le moteur fonctionne, il y a inversion du câblage des infos Steep et Dir. Le fil jaune est raccordé sur Dir et D5, le fil vert est raccordé sur Steep et D4, alors que tous les schémas et la programmation indique l’inverse, soit Dir sur D4 et Steep sur D5.
    Cherchez l’erreur.
    Quelle est la vérité ?
    Ma commande : Réf Facture 2019/33766 du 04/03/20

    Pas très content, Philippe.

  • cassoret patrick
    Publié à 10:02h, 11 mai

    bonjour et merci de vos explication
    j’ai voulu faire et adapter votre source mais j’ai un problème au repos mon moteur fait des petit pas et impossible de comprendre pourquoi, en fin de compte je veux adapter un bouton pour déclencher un cycle mais pas évident

    Le but c’est de l’adapter a mon programme en cour en bas qui marche pour le vrais débutant que je suis, si vous pouvez juste me donner une idée , je vous remercie et bravo pour votre site.
    Cordialement.
    Patrick

    //#include
    //#include
    //
    #include // bibliotheque chargée pour moteur pas à pas

    int tempo = 1; // convertion vitesse
    int tourne = 0; // BP permutation Marche/Arret
    int vitesse = 1; // Potentiometre 100K

    #define pinPot A0 // Pot de 100k
    #define pinBp 6 // BP Marche/Arret –> cncV3 –> A4988 DIR Y 16 –> Abort
    #define pinStepZ 4 // Signal de PAS –> cncV3 –> A4988 Z 15
    #define pinDirZ 7 // Direction –> cncV3 –> A4988 Z 16
    #define pinEn 8 //En commun sur CNC V3 pour activer les 2 drivers A4988 Z et X
    //Enable: Logique Inversée, permet d’activer ou désactivé le moteur.
    //Etat Haut=High=Moteur actif… et axe bloqué entre les pas.
    //Etat bas=Low=Axe totalement libre

    void setup() {
    pinMode(pinBp , INPUT); // Pb ard6
    pinMode(pinStepZ, OUTPUT); // Signal de PAS –> cncV3 –> A4988 Z 15
    pinMode(pinDirZ , OUTPUT); // Direction –> cncV3 –> A4988 z 16
    pinMode( pinEn , OUTPUT ); // definition broche En (activation drivers) ard8
    digitalWrite(pinDirZ, HIGH); // On choisit un sens de rotation de Z
    }

    void loop() {
    int capteur = digitalRead(pinBp); // On lit la valeur du bouton-poussoir
    vitesse = analogRead(A0); // On lit la valeur du potentiomètre
    tempo = map(vitesse, 0, 1023, 1, 100); // On convertit la valeur du potentiomètre en vitesse

    if (capteur == HIGH){
    tourne = !tourne; // On permute entre marche/arrêt lorsque l’on appuie sur le bouton-poussoir
    delay (500); // T contact voir anti rebond et fitre
    }

    if (tourne == HIGH) {
    digitalWrite(pinStepZ, LOW);
    delay(tempo); //On fait tourner le moteur avec la vitesse suivant le potentiomètre
    digitalWrite(pinStepZ, HIGH);
    delay(tempo);

    //digitalWrite( pinEn , HIGH ); // déblocage driver moteur Z,X,
    }

    }

    mon programme ou je veux pouvoir démarrer juste quand je veux et non des que l’Arduino et sous tentions
    //#include
    // #include
    //
    #include // bibliotheque chargée pour moteur pas à pas
    //
    //
    // Projet de Patrick CASSORET 06/05/2020
    // Controleur arduino UNO R3
    // 2 moteurs pas-à-pas nema17 – 1.7A – 200 tours 1.8° d’angle
    // carte CNC V3
    // 2 pilotes A4988 gestion moteur
    // MODE Single Step pour mode 200 pas 2 phaze pour couple MAX jumper 3X LOW
    // definition des sorties connections moteurs
    //
    // seul les broche 2 et 3 peuvent detecter une interuption!!

    #define pinBp 6 // bouton poussoir Marche/Arret
    #define pinSonde 3 // Sonde de d’inisialisation point de depart haut

    #define pinLed 13 // Led visuelle marche/arret
    #define pinEn 8 //En commun sur CNC V3 pour activer les 2 drivers A4988 Z et X
    //Enable: Logique Inversée, permet d’activer ou désactivé le moteur.
    //Etat Haut=High=Moteur actif… et axe bloqué entre les pas.
    //Etat bas=Low=Axe totalement libre
    #define pinStepZ 4 // Signal de PAS –> cncV3 –> A4988 Z 15
    #define pinDirZ 7 // Direction –> cncV3 –> A4988 Z 16
    #define pinStepX 2 // Signal de PAS –> cncV3 –> A4988 X 15
    #define pinDirX 5 // Direction –> cncV3 –> A4988 X 16

    // OK MAIS REGLER PROBLEME PIN BOUTON (stop)

    void setup() // preparation
    {

    Serial.begin(9600);
    Serial.println(« Test A4988 »);

    pinMode( pinBp , INPUT ); // bouton poussoir Marche/Arret
    pinMode( pinSonde , INPUT ); // Sonde de d’inisialisation point de depart haut
    pinMode( pinLed , OUTPUT ); // Led visuelle marche
    pinMode( pinEn , OUTPUT ); // definition broche En (activation drivers)
    pinMode( pinStepZ , OUTPUT ); // definition driver Z
    pinMode( pinDirZ , OUTPUT ); // definition driver Z
    pinMode( pinStepX , OUTPUT ); // definition driver X
    pinMode( pinDirX , OUTPUT ); // definition driver X

    }
    // OK

    void loop()
    {

    int i = 0;
    digitalWrite( pinStepZ , LOW); // Initialisation de la broche step Z
    digitalWrite( pinStepX , LOW); // Initialisation de la broche step X

    // 1er boucle du programme moteur Z
    digitalWrite( pinDirZ , HIGH); // Direction descente
    for( i=0; i < 250; i++)
    { // Descente du moteur Z
    Serial.println( i );
    digitalWrite( pinStepZ , HIGH );
    delay( 1 );
    digitalWrite( pinStepZ , LOW );
    delay( 1 );
    }
    digitalWrite( pinDirZ , LOW); // Direction monte
    for( i=0; i < 200; i++)
    { // Monte du moteur Z
    Serial.println( i );
    digitalWrite( pinStepZ , HIGH );
    //delay( 1 );
    digitalWrite( pinStepZ , LOW );
    //delay( 1 );
    }
    digitalWrite( pinDirZ , HIGH); // Direction decente
    for( i=0; i < 600; i++)
    { // Descente du moteur Z
    Serial.println( i );
    digitalWrite( pinStepZ , HIGH );
    //delay( 1 );
    digitalWrite( pinStepZ , LOW );
    //delay( 1 );
    }
    digitalWrite( pinDirZ , LOW); // Direction monte
    for( i=0; i < 250; i++)
    { // Monte du moteur Z
    Serial.println( i );
    digitalWrite( pinStepZ , HIGH );
    // delay( 1 );
    digitalWrite( pinStepZ , LOW );
    //delay( 1 );
    }

    Serial.println("Axe bloqués + attendre 2 sec"); // bloquer Z X
    delay( 2000 );

    Serial.println("Deblocage axe"); // debloquage Z X
    digitalWrite( pinEn , HIGH ); // déblocage driver moteur Z,X,
    // fin boucle if Stop suite
    Serial.println("Fin de programme"); // Fin et blocage du programme
    while( true ); // pendant que(c'est vrai)
    }

  • Yohann
    Publié à 13:36h, 12 mai

    Merci pour votre commentaire, le plus simple est de me contacter par mail à l’adresse sav@gotronic.fr. Le programme de base présent dans le blog fonctionne bien ? Merci, bonne journée.

  • ONS
    Publié à 02:15h, 06 juillet

    bonsoir! je veux commandé un moteur pas à pas unipolaire par une carte arduino, driver uln2003a , et un optocoupleur . j’ai cherché dans google les programmation arduino du moteur pas à pas et la programmation de l’optocoupleur mais je n’ai pas réussi à les lier les deux ensemble . Peux tu m’aider SVP et merci d’avance

  • Yohann
    Publié à 10:57h, 06 juillet

    Bonjour, merci pour votre commentaire, merci de me contacter par mail à l’adresse sav@gotronic.fr pour les demandes spécifiques. Je vais regarder en fonction de votre moteur et de votre driver. Merci.

  • ONS
    Publié à 21:00h, 07 juillet

    D’accord ! je vais t’envoyer un email tout de suite et merci beaucoup !

Laisser un commentaire