Librairie moteur pas à pas

Bonjour,

Je dois piloter plusieurs moteurs pas à pas. Je ne pilote pas le nombre de tour (step) mais je veux juste piloter la vitesse et la durée (ce sont des pompes avec moteurs pas à pas).

J'ai testé plusieurs librairies mais aucune ne convient parfaitement. - Stepper.h J'arrive bien à piloter la vitesse des moteurs mais tous les moteurs tournent à la vitesse la plus faible déclarrée : si mon moteur A tourne à 50 rpm et que je demande au moteur B de tourner à 100 rpm, les deux tournent à 50 rpm... Je ne vois pas ni dans la librairie ni dans mon code ce qui pourrait poser ce problème.

myStepperA.setSpeed(800);
myStepperB.setSpeed(400);

void loop() {
  myStepperA.step(1);
  myStepperB.step(1);
}
  • AccelStepper.h Je n'arrive pas à piloter correctement les vitesses. Je dois arriver à une vitesse maxi d'à peine la moitié de ce que j'arrive à faire avec stepper.h
    PompeStepA.setMaxSpeed(800);
    PompeStepA.setSpeed(300);
    PompeStepA.runSpeed();

Pour un tel scénario, quel est selon vous la librairie la plus pertinente ? Pilotage de plusieurs pompes pas à pas en pilotant la vitesse de chaque pompe indépendamment.

Merci

Bonjour

Il devrait être possible de faire ça avec Stepper.h en pilotant les moteurs pas à pas grâce à myStepperA.step(1);et un comptage du temps. Je n’ai jamais testé perso, donc je n’ai pas l’assurance que ça fonctionne et il y a peut-être d’autres solutions…

Si tu connais le nombre de pas pour faire un tour, et la consigne de vitesse (en tours par minute), on peut calculer le nombre de pas nécessaire par seconde :

int PasParTour = 250;  // <-- mis au hasard
int ConsigneRpmMoteur1 = 50;
int ParParSec = ConsigneRpmMoteur1 * PasParTour / 60;

ce qui ferait 208 pas par secondes dans mon cas applicatif. Donc 1 pas toutes les 4.8 ms.

unsigned long MillisParPas = 60000UL / ConsigneRpmMoteur1 / PasParTour;

Il te suffit de faire un test sur le temps qui passe et à chaque fois que le temps dépasse MillisParPas tu fais avancer le moteur d’un pas :

if (millis()-chronoMoteur1 >= MillisParPas) {
   chronoMoteur1 = millis();
   myStepperA.step(1); 
   }

Je ne sais pas si ça sera très précis : il faudra peut-être utiliser la fonction micros() au lieu de millis :

unsigned long MicrosParPas = 60000000UL / ConsigneRpmMoteur1 / PasParTour;

et

if (micros()-chronoMoteur1 >= MicrosParPas) {
   chronoMoteur1 = micros();
   myStepperA.step(1); 
   }

Et tu fais ça aussi pour l’autre moteur. Est-ce clair ?

Bonjour,

Merci pour ta réponse très précise qui vient de me faire comprendre mon erreur…

La fonction .step() (myStepperA.step(1):wink: est bloquante.

Quand je lance
myStepperA.step(1);
myStepperB.step(1);

Le moteur le plus lent ralentit l’autre.

Je vais donc utiliser ta technique de temporisation pour respecter le différentiel de vitesse.
Je viens de tester une solution plus basique mais qui fonctionne :

myStepperA.step(2);
myStepperB.step(1);

Merci beaucoup !

Kiristo:
Bonjour,

Je dois piloter plusieurs moteurs pas à pas.
Je ne pilote pas le nombre de tour (step) mais je veux juste piloter la vitesse et la durée (ce sont des pompes avec moteurs pas à pas).

J’ai testé plusieurs librairies mais aucune ne convient parfaitement.

  • Stepper.h
    J’arrive bien à piloter la vitesse des moteurs mais tous les moteurs tournent à la vitesse la plus faible déclarrée : si mon moteur A tourne à 50 rpm et que je demande au moteur B de tourner à 100 rpm, les deux tournent à 50 rpm… Je ne vois pas ni dans la librairie ni dans mon code ce qui pourrait poser ce problème.
myStepperA.setSpeed(800);

myStepperB.setSpeed(400);

void loop() {
  myStepperA.step(1);
  myStepperB.step(1);
}




- AccelStepper.h
Je n'arrive pas à piloter correctement les vitesses. Je dois arriver à une vitesse maxi d'à peine la moitié de ce que j'arrive à faire avec stepper.h


PompeStepA.setMaxSpeed(800);
    PompeStepA.setSpeed(300);
    PompeStepA.runSpeed();




Pour un tel scénario, quel est selon vous la librairie la plus pertinente ?
Pilotage de plusieurs pompes pas à pas en pilotant la vitesse de chaque pompe indépendamment.

Merci