Lier 2 codes arduino les imbriquer pour faire fonctionner 2 pap

je voudrais imbriquer ces 2 codes pour fonctionner mes pap en meme temps

const int stepPin = 6; //rouge 
const int dirPin = 3; // blanc
const int enPin = 9; // jaune

void setup() {
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);
  
}

void loop() {
  digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
  for(int x = 0; x < !80; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(400); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(400); 
  }
  delay(2000); // One second delay
  digitalWrite(dirPin,HIGH); //Changes the direction of rotation
  for(int x = 0; x < 80; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(400);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(400);
  }
  delay(2000); 
onst int stepPin = 5;//blanc 
const int dirPin = 2;//gris 
const int enPin = 8;//mauve

void setup() {
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(enPin,OUTPUT);
  digitalWrite(enPin,LOW);
  
}

void loop() {
  digitalWrite(dirPin,HIGH); // Enables the motor to move in a particular direction
  for(int x = 0; x < 800; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(500); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(500); 
  }
  delay(1000); // One second delay
  digitalWrite(dirPin,LOW); //Changes the direction of rotation
  for(int x = 0; x < 800; x++) {
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(500);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
  }
  delay(1000); 
}<

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Merci d’éditer votre post pour rajouter les balises de de code, c’est quasiment illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l’icône </> dans la barre d’outils pour indiquer que c’est du code

(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Bonjour danyell1

Imbriquer ces 2 codes en l'état pour que les moteurs fonctionnent en même temps, me semble pas possible, il y a, entre autre, trop de delay().
La première étape est d'utiliser une bibliothèque comme AccelStepper qui, elle, s'occupe de générer les signaux pour les drivers des MPAP.
A partir de là, tu pourras faire tourner tes moteurs en même temps.

Des info sur AccelStepper

Cordialement
jpbbricole

bonjour
merci pour votre réponse en fait je dois refaire le code complétement avec AccelStepper
je contrôle les moteurs avec 1 driver TB6600 et 1 DM556 est ce que cela sera compatible
avec la bibliothèque AccelStepper?
mon besoin //
moteur 1 le faire avancer de 36° x 10 donc 1 tour
et a chaque incrémentation l'autre moteur doit effectuer une marche avant sur 3 tours(descente)
et une marche arrière équivalente (montée) sur une vis sans fin
je pose la question ici est ce que c'est réalisable?
merci d'avance pour vos réponses

oui

il n'y a toujours pas les balises de code dans votre premier post. Merci de faire le ménage.

Oui, avec l'option 1:
AccelStepper mystepper(1, pinStep, pinDirection);

Cordialement
jpbbricole

l'auteur de la bibliothèque recommande d'utiliser l'énumération AccelStepper::DRIVER au lieu du chiffre magique 1

Number of pins to interface to. Integer values are supported, but it is preferred to use the MotorInterfaceTypesymbolic names

AccelStepper mystepper(AccelStepper::DRIVER, pinStep, pinDirection);

1 Like

Par curiosité, en finalité qu'est ce que ça change que l'on mette 1 ou AccelStepper::DRIVER qui est le premier membre d'un enum donc qui vaut également 1?

Pourquoi ce terme de chiffre magique?

Cordialement
jpbbricole

le mot "nombre magique" ou "chiffre magique" est une expression communément employée en programmation pour définir une valeur un peu sortie de nulle part (par exemple la connaissance du code source) ou difficile à lire / comprendre / maintenir. On préfère les éviter quand on peut.

En gros l'idée c'est que si vous voyez ces déclarations

AccelStepper mystepper(AccelStepper::DRIVER, ...);
AccelStepper mystepper(AccelStepper::FULL2WIRE, ...);
AccelStepper mystepper(AccelStepper::FULL3WIRE, ...);

C'est plus simple à comprendre et maintenir que

AccelStepper mystepper(1, ...);
AccelStepper mystepper(2, ...);
AccelStepper mystepper(3, ...);

et si un jour l'auteur s'avisait de rajouter dans son enum un nouveau type d'interface au début de la liste, votre code continuerait à fonctionner avec l'énumérateur alors qu'il planterait si vous avez mis 1.

Ici comme l'auteur dit qu'on peut aussi utiliser 1 même si ce n'est pas la recommandation, il s'engage à ne pas modifier l'ordre de la liste.

comme expliqué au dessus dans le cas présent ça ne change rien, si ce n'est suivre la recommandation de l'auteur et améliorer la lisibilité. Si vous avez un autre type de moteur, ce sera plus simple de vous dire que c'est ce paramètre sans doute qu'il faut modifier.

D'un point de vue plus technique, en C++ la conversion d'un enum vers un entier numérique est OK mais pas l'inverse.

ici l'auteur de la bibliothèque a défini le constructeur ainsi

    AccelStepper(uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5, bool enable = true);

donc si on passe un entier, ça fonctionne.

Mais si l'auteur avait forcé l'usage de son énumération

    AccelStepper(MotorInterfaceType interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5, bool enable = true);

alors on n'aurait pas pu passer un chiffre.

➜ L'avantage de la seconde version c'est qu'on ne pourrait pas passer un type d'interface inconnu et donc on détecterait à la compilation que c'est une erreur. Ici le compilateur ne se plaindra pas si vous tapez

AccelStepper mystepper(11, pinStep, pinDirection);

1 Like

Bonjour J-M-L

Voilà qui a le mérite d'être clair !

Une belle journée.

Cordialement
jpbbricole

bonjour
quelqu'un pourrait il m'aider a transformer ce code et l'écrire avec la bibliothèque AccelStepper
j'avoue être perdu j'ai regarder cette bibliothèque ça n'a rien a voir avec ce que j'ai écris
merci d'avance !
au cas ou je peux donner quelques précisions supplémentaires sur ce projet

Bonjour danyell1

Si j'ai bien compris:
Moteur 1 (M1) avance de 36° puis stop
M2 descend de 3 tours
M2 monte de 3 tours
M1 avance de 36°
...
...
J'ai juste ?

Cordialement
jpbbricole

bonjour jpb
oui c'est exactement ça !

Bonjour danyell1

Essaies de t'inspirer de l'exemple de la bibliothèque AccelStepper, Blocking, en mettant des delay() entre les mouvements. Essaies le plus simple, le rôle du moteur 2.

Initialises AccelStepper ainsi:
AccelStepper stepper2(AccelStepper::DRIVER, pinStep, pinDirection);
et le moteur

    stepper2.setMaxSpeed(800.0);
    stepper2.setAcceleration(8000.0);

A+
Cordialement
jpbbricole

re jpb
cette bibliothèque est compliquée a comprendre je ne saisie pas tout
et de plus les exemples ne sont pas très explicites j'ai vraiment du mal mais je continue a chercher
merci

Bonsoir danyell1

Je comprends :wink:
Pour autant que tu ne veux faire que ce tu indiques ci-dessus, donc que tu ne veux pas faire fonctionner 2 MPAP ou plus en "même temps", je vais t'indiquer une bibliothèque plus simple.
Je vais faire quelques essais et te redirai.

A+
Cordialement
jpbbricole

ok merci !
dans l'attente de te lire

tu as bien compris ce que je voulais
Moteur 1 (M1) avance de 36° puis stop et attend que le moteur2 ai fait son cycle
M2 descend de 3 tours
M2 monte de 3 tours
M1 avance de 36°
donc effectivement les deux moteur ne tournent pas en même temps mais l'un
apprêt l'autre

...

non ce n'est pas vraiment compliqué pour ce que vous voulez faire puisque tout à l'air synchrone. Il faut juste lire un peu la doc et passer un peu de temps à faire des essais. c'est comme tout, quoi il faut travailler un peu :)

Donc l'objectif:

voici un exemple, c'est ~20 lignes de code avec un petit bouton pour lancer le mouvement

Le simulateur n'a pas les drivers TB6600 ni DM556 mais il s'agit juste de déclarer pap1 et pap2 sous la forme

AccelStepper pap1(AccelStepper::DRIVER, pinStep1, pinDirection1);
AccelStepper pap1(AccelStepper::DRIVER, pinStep2, pinDirection2);

et dans le setup() si vous avez des pins enable il faut rajouter

pap1.setEnablePin(pinEnable1);
pap2.setEnablePin(pinEnable2);

je vous laisse essayer:

le code pour référence

#include <AccelStepper.h>
AccelStepper pap1(AccelStepper::FULL4WIRE, 2, 3,  4,  5);
AccelStepper pap2(AccelStepper::FULL4WIRE, 8, 9, 10, 11);
const byte pinBouton = A0;

void setup() {
  pinMode(pinBouton, INPUT_PULLUP);
  pap1.setMaxSpeed(1000);
  pap1.setAcceleration(35);
  pap2.setMaxSpeed(3000);
  pap2.setAcceleration(100);
}

void loop() {
  if (digitalRead(pinBouton) == LOW) {              // bouton appuyé, on lance un cycle
    for (byte etape = 1; etape <= 10; etape++) {
      pap1.runToNewPosition(etape * 20l);           // le moteur d'exemple a 200 pas par tour donc on fait 1/10ème de tour en 20 pas
      pap2.runToNewPosition(3 * 200l);              // le moteur d'exemple a 200 pas par tour donc on fait 3 tours
      pap2.runToNewPosition(0);                     // on revient à 0°
    }
  }
}