Gérer un moteur puissant pas à pas avec un driver TB6600

Portrait de brossden

J'ai eu besoin de piloter un moteur pas à pas avec un module Arduino et et j'ai eu pas mal de difficultés à faire tourner ce dit moteur à sa vitesse maximum pour 400 pas par tour.

En cherchant ici et là j'ai fini par écrire le code qui suit, je ne dis pas que c'est LA SOLUTION mais elle a le mérite de fonctionner chez moi. (Réalisation d'un imprimante 3D optique)

J'espère quelle rendra service à ceux qui ont rencontré ce genre de problème car la solution avec la fonction digitalWrite() et beaucoup trop lente ainsi que Delay() qui se limite à la milliseconde.

Si vous avez des questions n'hésitez pas ...

Code :

/*
Commande d'un moteur Pas à Pas à travers un Driver Moteur pas à pas TB6600.
Dans cette exemple le moteur fait 4000 pas dans un sens puis 4000 dans l'autre sens, et ainsi de suite avec une pause de 1 seconde.

Raccordez les sorties
A+,A-,B+ et B- ainsi que GND ET VCC de ce driver selon votre moteur pas à pas.
Raccordez les entrées :
Pull+   avec Port 13
Pull-   avec Gnd
Dir+    avec Port 12
Dir-    avec Gnd
Enable+ avec Port 11
Enable- avec Gnd
Mon moteur est un 42BYGHX609 pour moi les micro switch sont 010100 pour les SW 123456
Enable ne sera pas utilisé ici il permet de couper l'alimentation moteur pour entre autre éviter la surchauffe.
*/
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  int Pull =13;
  int Dir = 12;
  int Enable = 11;
  pinMode(Pull, OUTPUT);
  pinMode(Dir, OUTPUT);
  pinMode(Enable, OUTPUT);
}

void loop() {

  int compteur;
  int tmp = 150;
  for (compteur = 0 ; compteur < 4000; compteur++)
  {
    /* Création de crénaux en sortie PULL par deux XOR sucessifs du port 13 (BINB7)
       Cette fonction est beaucoup pls rapide que le digitalWrite(13,LOW)
       Le délais en microsecondes dépend du moteur essayer avec des valeurs de plus en plus petites jusqu'au maximum admit par vtre moteur
    */
    PORTB ^= _BV(PINB7);
    delayMicroseconds(tmp); //Commencer avec une valeur de 2000 pour tmp
    PORTB ^= _BV(PINB7);
    delayMicroseconds (tmp);
  }
    // inversement du sens de rotation par XOR du port 12 (PINB6)
   PORTB ^= _BV(PINB6);
    delay(1000);
  }

Portrait de gael

Bonsoir brossden,

Comme convenu voici comment je pilote mon moteur pas à pas :

J'utilise un EASY DRIVER A3967. Un Joystick programmé sur un axe. Quand j'actionne le joystick vers la gauche le moteur tourne dans un sens, et vers la droite, dans l'autre sens.

Mon moteur est un NOXTROX 42HS4013A4.

Voici le programme :

//permet de contrôler le moteur pas à pas avec un joystick dans les deux sens de rotations.
//contrôleur EASY DRIVER A3967
//moteur pas à pas de 12 Volts de type NEMA

#define step_pin 3 //connexion du pas easy driver sur la pin 3
#define dir_pin 2 //connexion de la direction easy driver sur la pin 2
#define MS1 5 //connexion moteur 1 easy driver sur la pin 5
#define MS2 4 //connexion moteur 2 easy driver sur la pin 4 
#define SLEEP 7 //connexion SLP easy driver sur la pin 7

#define X_pin A0 //connexion de l'axe x du stick analogique

int direction;
int steps=1025;

void setup(){

pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(SLEEP, OUTPUT);

digitalWrite(SLEEP,HIGH);
delay(5);

digitalWrite(MS1,LOW);
digitalWrite(MS2,LOW);
  
}

void loop(){

  while (analogRead(X_pin)>=0&&analogRead(X_pin)<=100){
    if (steps>0){
      digitalWrite(dir_pin, HIGH);
      digitalWrite(step_pin,HIGH);
      delay(1);
      digitalWrite(step_pin,LOW);
      delay(1);
      steps--;
    }
  }

  while (analogRead(X_pin)>900&&analogRead(X_pin)<=1024){
if (steps<8200){            //il faut jouer avec cette valeur pour déterminer le nombre de pas à révolutionner (nbr de tour sur un cycle)
        digitalWrite(dir_pin, LOW);
        digitalWrite(step_pin,HIGH);
  delay(1);
  digitalWrite(step_pin,LOW);
  delay(1);
  steps++  ;
    
    }
  }
}
 

Portrait de brossden

Sauf erreur de ma part je ne pense pas que ton moteur suive une rampe proportionnelle à position plus ou moins inclinée du Joystick ! Mais peut être n'est ce pas nécessaire pour ton application !

Bonne journée à tous !

Portrait de brossden

Salut Gael

Pour peut être t'aider à réaliser la proportionnalité sans ton mécanisme je te propose un petit programme qui j'en suis te donnera une piste pour réaliser ce projet !

Le système se compose de ton Joystick dont la sortie sera appliquée à A0 et tu pourras te rendre compte des mouvement sur le moniteur série (à 115200 Bauds !!)

Voilà donc une piste pour le moment !

int Analog = 511;
int Vitesse = 0;
int VitesseOld = 1;
String Sens = "Stop";

void setup() {
  Serial.begin(115200);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  digitalWrite(12, LOW);
  digitalWrite(11, HIGH);
}

void loop() {

  if (Vitesse != VitesseOld)  {
    Serial.print(" Vitesse à ");
    Serial.print(Vitesse);
    Serial.print(" % ");
    Serial.println(Sens);
    VitesseOld = Vitesse;
  }

  Analog = analogRead(0);
  delay(1);
  if (Analog > 521) {
    digitalWrite(11, HIGH);
    Vitesse =  (Analog - 521) / 5;
    Sens = "<---";
  }
  else if (Analog < 500) {
    digitalWrite(11, LOW);
    Vitesse = (500 - Analog) / 5;
    Sens = "--->";
  }
  else if ((Analog > 500) & (Analog < 521)) {
    digitalWrite(11, LOW);
    Vitesse = 0;
    Sens = " Stop";
  }
}

Bonne journée à tous

Le programme à télécharger :

Portrait de brossden

Gael

Je viens d'aller consulter les caractéristiques de tes deux composants drivers et moteur !

Il y a un problème ! ! !

Ton moteur a une consommation de 1.3 A et le driver et capable de fournir 0.75 A ....

Tant que tu ne mets pas ton moteur en charge cela peux fonctionner mais dès que tu solliciteras du couple sur de même moteur il va se passer des trucs !

pour environ 22 € tu peux avoir quelque chose de plus adapté à ton usage. exemple ici : Moteur pas à pas + driver

Portrait de gael

Exact!

J'avais remarqué ce soucis, d'ailleurs ca chauffe pas mal. Je retiens ta solution pour le projet réel. Je modifierai le programme en conséquence.

Merci beaucoup

Portrait de brossden

Pas de soucis, je suis entrain de pondre un programme proportionnel avec rampe d'accélération et de décélération. Je pense qu'en début de semaine prochaine se sera fait ce W.E je n'aurai pas les temps.

Bonne Journée à tous.