moteur pas à pas ne fait pas une marche arrière mais marche avant que faire ?

Bonjour (bonsoir)
je suis en train de réaliser ma première invention une motorisation pour une monture astro
en ce pendant j'ai une ou deux problèmes
1 les moteurs ne font pas de marche arrière quand j'appuis sur le bouton correspondant
et 2 le moteur nommé Stepper 3 dans le code ne tourne pas mais il fonctionne car il vibre
pourriez-vous m'aider ???
Je suis sur un Arduino due et les moteurs pas à pas c'est les keyestudio avec leurs drivers
à mon avis il y a plus d'erreur dans mon code mais un autre problème
je vous remets mon code au cas où

#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 27, 28, 29);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 38, 39, 40, 41);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 50, 51, 52, 53);

MultiStepper steppers;

const int bouton1 = 2; //marche avant rapide axe AD
const int bouton2 = 3; //marche arrière rapide axe AD
const int bouton3 = 4; //marche avant rapide axe DEC
const int bouton4 = 5; //marche arrière rapide axe DEC
const int bouton5 = 6; //marche avant moteur de MAP
const int bouton6 = 7; //marche arrière moteur de MAP

void setup() {
  Serial.begin(9600);

  pinMode (bouton1, INPUT_PULLUP);
  pinMode (bouton2, INPUT_PULLUP);
  pinMode (bouton3, INPUT_PULLUP);
  pinMode (bouton4, INPUT_PULLUP);
  pinMode (bouton5, INPUT_PULLUP);
  pinMode (bouton6, INPUT_PULLUP);

  stepper1.setMaxSpeed(360);
  stepper2.setMaxSpeed(180);
  stepper3.setMaxSpeed(360);

  stepper1.setSpeed(14.4);
  stepper2.setSpeed(0);
  stepper3.setSpeed(0);

  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);
  steppers.addStepper(stepper3);
}
void loop() {

  Serial.print(bouton1); Serial.print(" -> "); Serial.println(digitalRead(bouton1));
  Serial.print(bouton2); Serial.print(" -> "); Serial.println(digitalRead(bouton2));
  
  if (digitalRead(bouton1) == LOW) {
    stepper1.setSpeed(360);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton2) == LOW) {
    stepper1.setSpeed(-360);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper1.setSpeed(14.4);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  Serial.print("stepper1: ");Serial.println(stepper1.speed());
  stepper1.runSpeed();

  if (digitalRead(bouton3) == LOW) {
    stepper2.setSpeed(180);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton4) == LOW) {
    stepper2.setSpeed(-180);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper2.setSpeed(0);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  stepper2.runSpeed();

  if (digitalRead(bouton5) == LOW) {
    stepper3.setSpeed(360);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton6) == LOW) {
    stepper3.setSpeed(-360);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper3.setSpeed(0);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  stepper3.runSpeed();
}

merci d'avance
cdt

le moteur nommé Stepper 3 dans le code ne tourne pas mais il fonctionne car il vibre

Quand un pas à pas vibre, c'est la plupart du temps une inversion de phases. Il y en a 4 (in1 à in4). Essaie
AccelStepper stepper3(AccelStepper::FULL4WIRE, 50, 52, 51, 53);

Je pense que vileroi a raison, il faut inverser deux phases.
Idem pour le moteur 1 qui ne veut pas faire de marche arrière
Essaies
AccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 28, 27, 29);

Pour savoir si un moteur est bien branché quand on croit qu'il l'est, il suffit de lui donner un ordre d'avancer avec 1 pas par seconde. On voit si son avance est régulière ou pas. Le problème ici est que c'est un 28BYJ-48 et qu'on ne voit pas le moteur. Il faut donc faire des essais.

L'autre possibilité est que la vitesse demandée est trop grande, du coup il ne suit plus et vibre. Dans ce cas aussi réduire la vitesse est un bon moyen de savoir. Sur plusieurs moteurs identiques, deux peuvent accepter une vitesse de 360, et un de 200 par exemple.

Il me paraît impensable de faire un programme compliqué avec 3 moteurs, si il y a un problème de câblage ou autre. Avant de se lancer avec 3 moteurs, le plus sage est de faire un programme qui fait tourner que le premier moteur, genre

#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 27, 28, 29);

void setup()
{  
  stepper1.setMaxSpeed(RPM /60.0 * MOTOR_STEPS * MICROSTEPS);
  stepper1.setAcceleration(1000000);
}

void loop()
{    
  stepper1.runToNewPosition(MOTOR_STEPS * MICROSTEPS);
  stepper1.runToNewPosition(0);
}

Il me semble que ce code fonctionne, mais je ne le garanti pas, je n'aime pas ccelStepper

Si un des trois moteurs ne tourne pas dans les deux sens, ce n'est pas la peine d'aller plus loin. Quand on construit quelque chose, il vaut mieux s'assurer que les briques de départ soit saines, plutôt que de faire un maison complète et s’apercevoir qu'il faut refaire les fondations.

vileroi:
Quand un pas à pas vibre, c'est la plupart du temps une inversion de phases. Il y en a 4 (in1 à in4). Essaie
AccelStepper stepper3(AccelStepper::FULL4WIRE, 50, 52, 51, 53);

bonjour rien ne change

vileroi:
Pour savoir si un moteur est bien branché quand on croit qu'il l'est, il suffit de lui donner un ordre d'avancer avec 1 pas par seconde. On voit si son avance est régulière ou pas. Le problème ici est que c'est un 28BYJ-48 et qu'on ne voit pas le moteur. Il faut donc faire des essais.

L'autre possibilité est que la vitesse demandée est trop grande, du coup il ne suit plus et vibre. Dans ce cas aussi réduire la vitesse est un bon moyen de savoir. Sur plusieurs moteurs identiques, deux peuvent accepter une vitesse de 360, et un de 200 par exemple.

Il me paraît impensable de faire un programme compliqué avec 3 moteurs, si il y a un problème de câblage ou autre. Avant de se lancer avec 3 moteurs, le plus sage est de faire un programme qui fait tourner que le premier moteur, genre

#include <AccelStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 27, 28, 29);

void setup()
{  
 stepper1.setMaxSpeed(RPM /60.0 * MOTOR_STEPS * MICROSTEPS);
 stepper1.setAcceleration(1000000);
}

void loop()
{    
 stepper1.runToNewPosition(MOTOR_STEPS * MICROSTEPS);
 stepper1.runToNewPosition(0);
}




Il me semble que ce code fonctionne, mais je ne le garanti pas, je n'aime pas ccelStepper


Si un des trois moteurs ne tourne pas dans les deux sens, ce n'est pas la peine d'aller plus loin. Quand on construit quelque chose, il vaut mieux s'assurer que les briques de départ soit saines, plutôt que de faire un maison complète et s’apercevoir qu'il faut refaire les fondations.

là le logiciel accepte pas micro_steps et RPM
mais le moteur doit faire les 360 car le Stepper 1 les fait bien
merci
cdt

là le logiciel accepte pas micro_steps et RPM

C'est les constantes du moteur a remplacer par les bonnes valeurs pour ne pas faire de ventilateur. Cela doit être approximativement:

#define MOTOR_STEPS 2048 // nombre de pas par tour du moteur
#define MICROSTEPS 1 // pas de micropas avec ce type de moteur
#define RPM 2 // avec 2 tours par minutes, on ne dépasse pas la vitesse maxi

AccelStepper stepper3(AccelStepper::FULL4WIRE, 50, 52, 51, 53);
bonjour rien ne change

Possible, il y aune autre combinaison que j'ai oublié:

AccelStepper stepper3(AccelStepper::FULL4WIRE, 51, 52, 50, 53);

Sinon il est possible qu'il y ait une connexion qui soit absente (un fil coupé).

Toujours rien pour le Stepper 3 j'ai modifié ton code pour le Stepper 1 et 2 là ça fonctionne
j'ai aussi mis un autre moteur le Stepper 2 sur le driver du Stepper 3 et il n'a pas tourné non plus puis, je l'ai remis sur le driver du Stepper 2 là il tournait de nouveau
donc pour moi c'est le driver qui est pourri
et il y toujours aucun des moteurs qui fait marche arrière
et il n’y a pas de fil coupé non plus
merci encore
cdt

Pour le Stepper 3 c'est bon j'ai changé les broches de connexion au moteur
il reste donc à savoir pourquoi les moteurs ne font pas de marche arrière
merci à vous
et en attendant vos réponses pour le problème de marche arrière
cordialement

Je viens de faire l'essai avec le moteur connecté comme suit
IN1 -> 26
IN2 -> 27
IN3 -> 28
IN4 -> 29
et stepper1 défini comme suit:

AccelAccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 28, 27, 29);

Et ça fonctionne correctement. Pas de problème pour la marche arrière.

Alors qu'avec la définition initiale de stepper1, effectivement la marche arrière ne fonctionne pas

kamill:
Je viens de faire l'essai avec le moteur connecté comme suit
IN1 -> 26
IN2 -> 27
IN3 -> 28
IN4 -> 29
et stepper1 défini comme suit:

AccelAccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 28, 27, 29);

Et ça fonctionne correctement. Pas de problème pour la marche arrière.

Alors qu'avec la définition initiale de stepper1, effectivement la marche arrière ne fonctionne pas

donc dans le code je mets in 1, in 2, in 3, in 4,
ou 26 27 28 29
???
merci de ta réponse
cdt

Tu connectes physiquement les pins dans l'ordre et tu déclares 26,28,27,29

ça fonctionne toujours pas donc toujours pas de marche arrière :confused:

mon nouveau code est
merci encore
cdt

#include <AccelStepper.h>
#include <MultiStepper.h>

AccelStepper stepper1(AccelStepper::FULL4WIRE, 27, 26, 29, 28);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 39, 38, 41, 40);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 45, 44, 47, 46);

MultiStepper steppers;

const int bouton1 = 2; //marche avant rapide axe AD
const int bouton2 = 3; //marche arrière rapide axe AD
const int bouton3 = 4; //marche avant rapide axe DEC
const int bouton4 = 5; //marche arrière rapide axe DEC
const int bouton5 = 6; //marche avant moteur de MAP
const int bouton6 = 7; //marche arrière moteur de MAP

void setup() {
  Serial.begin(9600);

  pinMode (bouton1, INPUT_PULLUP);
  pinMode (bouton2, INPUT_PULLUP);
  pinMode (bouton3, INPUT_PULLUP);
  pinMode (bouton4, INPUT_PULLUP);
  pinMode (bouton5, INPUT_PULLUP);
  pinMode (bouton6, INPUT_PULLUP);

  stepper1.setMaxSpeed(360);
  stepper2.setMaxSpeed(180);
  stepper3.setMaxSpeed(360);

  stepper1.setSpeed(14.4);
  stepper2.setSpeed(0);
  stepper3.setSpeed(0);

  steppers.addStepper(stepper1);
  steppers.addStepper(stepper2);
  steppers.addStepper(stepper3);
}
void loop() {

  Serial.print(bouton1); Serial.print(" -> "); Serial.println(digitalRead(bouton1));
  Serial.print(bouton2); Serial.print(" -> "); Serial.println(digitalRead(bouton2));
  
  if (digitalRead(bouton1) == LOW) {
    stepper1.setSpeed(360);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton2) == LOW) {
    stepper1.setSpeed(-360);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper1.setSpeed(14.4);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  Serial.print("stepper1: ");Serial.println(stepper1.speed());
  stepper1.runSpeed();

  if (digitalRead(bouton3) == LOW) {
    stepper2.setSpeed(180);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton4) == LOW) {
    stepper2.setSpeed(-180);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper2.setSpeed(0);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  stepper2.runSpeed();

  if (digitalRead(bouton5) == LOW) {
    stepper3.setSpeed(360);//si j'appuis sur le bouton le moteur AD accélère
  }
  else  if (digitalRead(bouton6) == LOW) {
    stepper3.setSpeed(-360);//si j'appuis sur le bouton le moteur AD recule
  }
  else {
    stepper3.setSpeed(0);//si je n'appuis pas sur le bouton le moteur AD continu la vitesse normale
  }
  stepper3.runSpeed();
}

Si un des trois moteurs ne tourne pas dans les deux sens, ce n'est pas la peine d'aller plus loin. Quand on construit quelque chose, il vaut mieux s'assurer que les briques de départ soit saines, plutôt que de faire un maison complète et s'apercevoir qu'il faut refaire les fondations.

Conseil: concentre toi sur un seul moteur. Si il ne tourne pas dans les deux sens, ce n'est pas avec un programme encore plus compliqué que cela va marcher.

vileroi:
Conseil: concentre toi sur un seul moteur. Si il ne tourne pas dans les deux sens, ce n'est pas avec un programme encore plus compliqué que cela va marcher.

Ok mais c'est bizarre que les moteurs ne tournent pas en marche arrière car avec cette expérience https://retroetgeek.com/arduino/arduino-comment-utiliser-un-moteur-pas-a-pas-uln2003a-et-28byj-48/http:// ils tournaient dans les deux sens :wink:

Je t'ai dit

AccelAccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 28, 27, 29);

Pourquoi tu fais autre chose?

Rien non plus j'ai une fois que modifié pour un moteur mais rien
cette partie de code est

AccelStepper stepper1(AccelStepper::FULL4WIRE, 26, 28, 27, 29);
AccelStepper stepper2(AccelStepper::FULL4WIRE, 39, 38, 41, 40);
AccelStepper stepper3(AccelStepper::FULL4WIRE, 45, 44, 47, 46);

c'est encore faux ou pas mon "colonel"
merci
cdt

C'est ok si l'interface est bien connectée comme ça
IN1 -> 26
IN2 -> 27
IN3 -> 28
IN4 -> 29

kamill:
C'est ok si l'interface est bien connectée comme ça
IN1 -> 26
IN2 -> 27
IN3 -> 28
IN4 -> 29

Oui c'est comme ça exactement
j'ai fait la même chose pour les autres moteurs rien non plus
cdt

Je n'ai plus d'idées. Chez moi ça fonctionne dans cette configuration.

kamill:
Je n'ai plus d'idées. Chez moi ça fonctionne dans cette configuration.

J'ai débranché et rebranché ça fonction pour un moteur enfin :sleeping:

je vais voir pour les autres

un très grand MERCI à vous tous

cdt