18 Avr 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 :
- Une carte Arduino Uno
- Un driver pour moteur pas-à-pas A4988 2128
- Un moteur pas-à-pas bipolaire
- Une plaque de prototypage
- Un shield à borniers pour faciliter le raccordement
- Un lot de jumpers mâles-mâles
- Une alimentation de votre choix (ici une alimentation de laboratoire)
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.
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.
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.
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 :
- un module bouton-poussoir
- un module potentiomètre
Nous allons raccorder le potentiomètre sur l’entrée A0 et le bouton-poussoir sur l’entrée D6.
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 :
- driver 1182 jusqu’à 1A
- driver DRI0043 jusqu’à 3,5A
- driver DM860 jusqu’à 6A
Exemple d’autres moteurs :
- moteur S20STH30-0604A – 0,6 A – 180 g.cm – taille réduite
- moteur 35STH36-1004B – 1 A – 1,5 kg.cm – Nema 14
- moteur 23HS30-2804S – 2,8 A – 18,9 kg.cm – Nema 23
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.
Léandre
Publié à 19:20h, 18 janvierPouvez-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évrierBonjour, 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 juinBonjour, 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 juilletBonjour, 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ûtBonjour, 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 marsJe 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 maibonjour 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 maiMerci 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 juilletbonsoir! 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 juilletBonjour, 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 juilletD’accord ! je vais t’envoyer un email tout de suite et merci beaucoup !