Faire fonctionner 2 moteurs pas à pas pour qu'ils descendent en même temps

Bonjour,

Je viens de débuter dans la programmation avec Arduino, je suis en train de réaliser un projet pour animer une griffe censée rayer une plaque en alu recouverte d'un revêtement.
L'idée était donc de faire descendre la griffe à l'aide de deux moteurs sur l'axe z, la déplacer ensuite horizontalement (axe y) à l'aide d'un troisième moteur jusqu'à la détection de la plaque par conduction, afin d'effectuer la coupure et d'ensuite remonter la griffe. Les moteurs utilisés sont des moteurs pas à pas NEMA 17 contrôlés par des drivers TB6600.
Mon problème est lors du fonctionnement simultané des 2 moteurs latéraux lors de la descente de la griffe. J'ai bien câblé et codé les deux moteurs, mais un seul moteur ne fonctionne sur les deux.
Si quelqu'un pouvait m'apporter une aide, cela me permettrait de finaliser mon projet.
Vous trouverez ci-joint mon code. Même s'il me semble correct, n'hésitez surtout pas à me corriger pour la moindre erreur. Étant donné que j'ai supprimé certains passages du code ne concernant pas les moteurs, je suis à votre disposition pour toute éventuelle question à propos du code !
Je vous remercie d'avance.

// Déclaration des objets et constantes
const int Start = 22;  // Broche du bouton de démarrage
const int ENAY = 31;
const int DIRY = 32;
const int PULY = 33;
const int ENAZ1 = 38;
const int DIRZ1 = 39;
const int PULZ1 = 40;
const int ENAZ2 = 41;
const int DIRZ2 = 42;
const int PULZ2 = 43;
const int conduction = 53; // Détection conduction
void setup() {
  // Initialisation des broches
  pinMode(Start, INPUT_PULLUP);
  pinMode(ENAY, OUTPUT);
  pinMode(DIRY, OUTPUT);
  pinMode(PULY, OUTPUT);
  pinMode(ENAZ1, OUTPUT);
  pinMode(DIRZ1, OUTPUT);
  pinMode(PULZ1, OUTPUT);
  pinMode(ENAZ2, OUTPUT);
  pinMode(DIRZ2, OUTPUT);
  pinMode(PULZ2, OUTPUT);
  pinMode(conduction, INPUT_PULLUP);

  // Initialisation du moniteur série
  Serial.begin(9600);
  // Configuration initiale des broches
  digitalWrite(ENAY, HIGH);
  digitalWrite(ENAZ1, HIGH);
  digitalWrite(ENAZ2, HIGH);
}
void loop() {
  // Déplacement initial du servo moteur
  delay(1000);
  // Si le bouton Start est pressé
    if (digitalRead(Start) == LOW) {
    
      // Cycle de déplacement des moteurs
      delay(1000);
      AvanceMoteurZ();
      // AvanceMoteurY(1, 5000);
      delay(1000);

      AvanceMoteurZ();
      // AvanceMoteurY(1, 5000);
    }

 }
// Fonction pour faire avancer le moteur sur l'axe Y
void AvanceMoteurY(int direction, int nombrePas) {
  digitalWrite(ENAY, HIGH);
  digitalWrite(DIRY, direction > 0 ? HIGH : LOW);
  for (int i = 0; i < nombrePas; i++) {
    digitalWrite(PULY, HIGH);
    delayMicroseconds(500); // Ajustement de la vitesse
    digitalWrite(PULY, LOW);
    delayMicroseconds(500);
  }
  delay(1000);
}
// Fonction pour faire avancer le moteur sur l'axe Z
void AvanceMoteurZ() {
  digitalWrite(ENAZ1, HIGH);
  digitalWrite(ENAZ2, HIGH);
  digitalWrite(DIRZ1, LOW);
  digitalWrite(DIRZ2, LOW);
  // Boucle pour faire avancer le moteur jusqu'à l'activation de la conduction
  while (digitalRead(conduction) == HIGH) {
    digitalWrite(PULZ1, HIGH);
    digitalWrite(PULZ2, HIGH);
    delayMicroseconds(1750);
    digitalWrite(PULZ1, LOW);
    digitalWrite(PULZ2, LOW);
    delayMicroseconds(1750);
  }
  digitalWrite(ENAZ1, LOW);
  digitalWrite(ENAZ2, LOW);
  delay(1000);
}

Bonjour,

Est ce que vous avez tester séparément chacun des deux moteurs ?

Vous pourriez essayer d'inverser l'ordre des commandes dans la fonction AvanceMoteurZ() afin de mettre digitalWrite(PULZ2, HIGH); avant digitalWrite(PULZ1, HIGH);

En les testant séparément, le moteur Z2 tourne correctement, tandis que le moteur Z1 fait du bruit et vibre sans pour autant tourner.
Et lorsque j'inverse l'ordre des commandes dans la fonction, le moteur Z2 fonctionne, mais Z1 ne fonctionne toujours pas.

Alors il est possible qu'il soit défectueux, ou que se soit le driver de commande.

Pouvez vous essayer Z1 sur le driver (et avec le code qui fonctionne) de Z2 ?

Bonjour eyuemb

Comme les 2 moteurs fonctionnent exactement la même chose (au niveau du programme), pourquoi pas n'en commander qu'un et de les mettre en parallèle au niveau du câblage?

Dans la génération des impulsions, il n'est pas nécessaire de faite du 50/50 (1750/1750), pour le driver, la longueur de l'impulsion STEP, n'a pas grande importance, 10 microsecondes suffit (10/3490), il s'occupe du reste.

Un dernier petit truc :wink:, si tu as plusieurs moteurs pas à pas, le mieux est de recourir à une bibliothèque comme AccelStepper, elle simplifie la gestion de ces moteurs.

Cordialement
jpbbricole.

Bonjour, je vous remercie pour votre réponse. Le problème venait finalement du driver auquel était relié le moteur Z1. En revanche, je compte bien me documenter en ce qui concerne la bibliothèque AccelStepper afin de me simplifier la tâche.
Je vous souhaite une bonne soirée.

En effet, le problème venait du driver, qui était correctement alimenté seulement une fois sur deux.
Je vous souhaite une bonne soirée et un grand merci pour votre réponse.

De rien, content d'avoir pu vous aider.