Problème pour faire tourner 2 moteurs nema17 avec NRF24L01+

Bonjour , après avoir lu des dizaines d’articles , et vu des dizaines de vidéos je n’ai toujours pas trouvé la réponse à mon problème (qui n’est pas si simple qu’il en a l’air)

je cherche a contrôler 2 moteurs pas à pas nema17 (moteur d’imprimante 3d) en utilisant les contrôleurs A4988 a l’aide d’un Arduino qui recevra les données du joystick d’un autre Arduino.

Les 2 Arduino communiqueront grâce à 2 modules NRF24L01 (avec antenne externe pour plus de portée).

L’Arduino émetteur avec le joystick sera aussi équipé d’un écran LCD I2C et de boutons qui permettront d’exécuter des fonctions comme un test de connexion wifi (qui indiquera si la connexion est bonne ou pas. Voila le montage en image :

Mais un problème à la fois , pour commencer je dois faire tourner les deux moteurs indépendamments à des vitesses différentes , plus le joystick est écarté du centre , plus le moteur tourne vite .

J’utilise la librairy AccelStepper pour contrôler les moteurs.

Lorsque je fais tourner 1 moteur tout fonctionne bien , mais quand j’actionne le second , le premier ralenti. Je crois que cela est du à un léger changement de fréquence (car les A4988 fonctionnent avec une fréquence et non un signal PWM) du à un ’’rallongement du code’’ , rajouté par les boucles if je pense.
voici mon code :

#include <AccelStepper.h>

int potV ; //variable joystique Verticale
int potH ; //variable joystique Horizontal
int potHH;
int potVV;

int t1 = 0;//variable d'activation

// The X Stepper pins
#define STEPPER1_DIR_PIN 2
#define STEPPER1_STEP_PIN 3
// The Y stepper pins
#define STEPPER2_DIR_PIN 5
#define STEPPER2_STEP_PIN 6


AccelStepper stepper1(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);
AccelStepper stepper2(AccelStepper::DRIVER, STEPPER2_STEP_PIN, STEPPER2_DIR_PIN);

void setup() {
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  
  // Paramétrage du premier moteur avec setMaxSpeed
  stepper1.setMaxSpeed(8000.0);
  // Paramétrage du second moteur avec setMaxSpeed
  stepper2.setMaxSpeed(8000.0);
}


void loop() {  
  potV = analogRead(A0);
  potH = analogRead(A1);
  
  potH = map(potH, 0, 1023, -500, 500);//changement des valeur min/max pour plus de faciliter

  if(potH < -100){
    potHH = map(potH, -100, -500, 0, 2500);
    stepper1.setSpeed(potHH);
    stepper1.move(-1);
    t1 = 0;
  }
  
  
    if(potH > 100){
    potHH = map(potH, 0, 500, 0, -2500);
    stepper1.setSpeed(potHH);
    stepper1.move(1);
    t1 = 0;
  }
//=======================================================

potV = map(potV, 0, 1023, -500, 500);

    if(potV < -100){
    potVV = map(potV, 0, -500, 0, 2500);
    stepper2.setSpeed(potVV);
    stepper2.move(1);
    t1 = 0;
  }

    if(potV > 100){
    potVV = map(potV, 0, 500, 0, -2500);
    stepper2.setSpeed(potVV);
    stepper2.move(1);
    t1 = 0;
  }

  if (t1 == 0){
    stepper1.run();
    stepper2.run();
  }
  t1 = 1;
  
}

Voyez vous une solution , j’avais pensé utiliser des ne555 eux même contrôlés par l’Arduino mais je n’ai pas trouvé de moyen simple de les contrôler. Bref , je bloque. Merci d’avance pour vos réponses potentielles.

la doc de la bibliothèque dit

il semble que vous montiez jusqu'à ±2500 (et max speed à 8000...)

essayez de regarder le comportement avec des valeurs plus faibles.

(je suppose que vous avez la puissance nécessaire pour l'alimentation des moteurs)

PS:

le modules NRF24L01 n'est pas un module WiFi, c'est un protocole particulier qui passe sur une radio.

merci de votre réponse, je viens d'essayer mais cela ne fait que changer la vitesse du moteur, et le problème ne survient que lorsque je fait tournée les 2 moteurs en même temps , il doit y avoir un problème de timing ou quelque chose du genre.

normalement non... avez vous essayé un code tout bête qui fait augmenter petit à petit la vitesse des moteurs?

oui , le problème survient lorsque je change l'état du deuxième moteur (on/off) , peut importe la vitesse ou le sens.

le problème survient d'ailleurs aussi si la boucle if ne contient rien.

Comment les moteurs sont alimentés ?

les moteurs sont alimentés par une alimentation séparé qui leurs envois ~12v ~1A chacun

Et les moteurs ont besoin de combien?

environ 1A , s'il il y a moins il ont juste moi de force

Bonsoir lilian2230

Je ne pense pas que ce soi utile, bien au contraire.
Tu doit laisser les fonctions de la bibliothèque décider quoi faire.

PS: essaies l'exemple MultiStepper de la bibliothèque

Cordialement
jpbbricole

Ça me plait! C'est trop rare.

Ça aussi c'est rare pour un premier post! Bravo!

D'accord, la doc recommande d'appeler les fonctions run le plus souvent possible, et elles peuvent être appelées même si les moteurs sont arrivés à destination. Du coup il faut virer tout ce qui concerne t1.
Mais je ne pense pas que le problème vienne de là.

Avec les essais que j'ai réalisé, il me semble que pour des vitesses très faibles, la vitesse demandée est la vitesse obtenue. Pour un moteur, jusqu'à 1000 pas/s c'est à peu près vrai et j'ai pu aller jusqu'à 4000 pas/s (en demandant 1000000 pas/s).
Avec deux moteurs, la limite doit se trouver à moitié soit, aux alentours de 500 pas/s dans la partie linéaire, et 1000 pas/s au maximum.

Je suppose que si un moteur tourne à 1000 pas tout seul, le fait d'en mettre deux va faire passer le premier à 500 pas/tr, la bibliothèque n'ayant plus assez de temps pour faire le calcul pour les deux.

Dans les exemples qui sont donnés la vitesse maximale ne dépasse jamais 300 pas/s et quand il y a 3 moteurs, les vitesses sont 300 300 et 200...

Avec des vitesses plus faibles, cela doit fonctionner. Mais plus faible, c'est pas plus de 500 pas/s.

Je ne suis pas sûr de l'avoir essayée, mais il me semble que cette fonction est faite pour que deux moteurs démarrent et s'arrêtent en même temps. Ce qui n'est pas le cas ici. Si un moteur fait 100 pas à 50pas/s et le deuxième 200 pas à 100pas/s, il devraient arriver ensembles. Si multistepper existe c'est peut être parce que ce n'est pas le cas.

On peut avoir un lien vers le moteur utilisé ainsi que les drivers ?

Bonjour,
on suppose que la résistance ajustable du courant sur les modules de puissance moteur a été réglée correctement ? sinon ça peut décrocher.

"quand j’actionne le second , le premier ralenti". En général, par manque de courant, le moteur s'arrête et vibre. Si il tourne et ralentit, c'est qu'il conserve les pas, et que l’alimentation est suffisante. Mais

permet des fois de vérifier qu'il n'y a pas d'erreur.

  • avez vous réglé le potentiomètre de limitation de courant ?
  • quelle est la longueur des fils connectés sur le driver A4988 ? sont-ils adaptés pour un courant de 1A?

les moteur utilisé : amazon moteur nema17

les driver : driver A4988

je n'est pas réglé la vis de courant max , je vais le faire et réessayer (j'avez limitée le courant de sortie de l'alim)

les specs disent 3.6V / 1.5A

Le A4988 régule la tension , je vient de mesurée environ 2 à 3V en sortie

j'ai retirée le if (t1 == 0) , les moteurs ce sont mis à faire un pas à chaque passage sur cette ligne
donc j'ai remis le " if " de manière différente mais cela na rien changé au problème de départ :

  if (t1 == 1){
    stepper2.move(0);
    stepper1.move(0);
  }
  stepper1.run();
  stepper2.run();