faire tourner deux moteurs 25BYJ-48 en même temps

Bonjour,

dans le but de créer une maquette de convoyeur de bagage, j’ai besoin de faire tourner deux moteurs pas à pas en même temps sur une seule carte uno R3

malheureusement le programme que j’ai modifié me permet de faire tourner les moteurs que chacun leur tour.

les drivers sont des ULN2003

pouvez vous m’aider svp ?

 //**************************************************************
   //Commande de moteur pas-à-pas unipolaire 4 fils
   //tiptopboards.com 05/12/2013
   // Driver ULN2003 et moteur réducté au 1:64
   //
   //**************************************************************
   //Inclure la librairie stepper.h
    #include <Stepper.h>
    #define STEPS 100
    
     //Créer une instance de la classe stepper
     //Le moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino (et sur GND, +V)
     Stepper small_stepper(STEPS, 8, 10, 9, 11);     // Sens horaire
     Stepper small_stepper1(STEPS, 4, 6, 5, 7);     // Sens horaire
   
    
     //Stepper small_stepper(STEPS, 11, 10, 9, 8);  // Sens anti-horaire en inversant 8 et 11 (si on préfère)
     int  Steps2Take = 0;  //Nombre de pas de rotation demandé au moteur
     long temps =0;          //Durée de rotation pour un tour
     //************************************************************
     // Pour un moteur de ce type : http://tiptopboards.com/151-moteur-pas-%C3%A0-pas-r%C3%A9duct%C3%A9-de-5v-4-fils-driver-.html
     // 64 pas par tour, 4 phases, angle de 5.625° selon les spécifications du moteur
     // Démultiplication 1:64 pour ce moteur réducté mécaniquement
     //   360° / 5.625° * 64 = 4096 angles avec la démultiplication
     //   360° / 5.625° * 64  * 4 bobines / 2 bipolaire = 2048 step / tour
    

   void setup()
    {               
     Serial.begin(9600);     // 9600 bps
     Serial.println("Test de moteur pas a pas"); 
     }

   void loop()
     {
     Serial.println("Moteur en marche "); 
     //Faire tourner le moteur
     small_stepper.setSpeed(290); //Vitesse de 300 (max) réduire ce chiffre pour un mouvement plus lent
     small_stepper1.setSpeed(290); //Vitesse de 300 (max) réduire ce chiffre pour un mouvement plus lent
   
     //100 permet d'éavoir un couple élevé >300 le moteur vibre sans tourner
    
     Steps2Take  = 2048;  // Une rotation complète avec 2048 pas (1 tour environ 4.5sec)
     //Pour tourner à l'envers de 6 fois 1/30eme de tour, simplement multiplier Steps2Take par 6/30 et mettre un moins pour inverser le sens
     // Exemple  Steps2Take  = -6*2048/30;
     temps = millis();
     small_stepper.step(Steps2Take);  //Ca tourne
     small_stepper1.step(Steps2Take);  //Ca tourne
     temps =  millis()- temps ;  //Chronomètre un rour complet  6.236 sec par tour à vitesse 200
     Serial.println(temps);      //Affiche le temps (en ms) pour un tour complet
     
    }

Salut,

Pas possible avec stepper.h

Accelstepper par contre : https://github.com/adafruit/AccelStepper

merci bcp !

je viens de récupérer ce code par contre je n’ai pas besoin des accélérations, je souhaite juste que les moteurs tournent indéfiniment

j’ai retiré cette partie

//Change direction at the limits
  if (stepper1.distanceToGo() == 0) 
    stepper1.moveTo(-stepper1.currentPosition());
    if (stepper2.distanceToGo() == 0) 
    stepper2.moveTo(-stepper2.currentPosition());

mais les moteurs tournent une seule fois puis s’arrêtent…
pourtant je suis dans une boucle c’est censé recommencer ?

/* YourDuinoStarter Example: 2 Stepper Motors
 - WHAT IT DOES: Runs 2 28BYJ-48 stepper motors with AccelStepper Library
 - Motors accelerate and decelerate simultaneously in opposite rotations
 - SEE the comments after "//" on each line below
 -  Derived from example code by Mike McCauley
 -  modified by Celem for single stepper
 -  modified by lowres for two steppers 
 NOTE: This may not run 2 motors from USB. 
       May need separate +5 Supply for motors
 - CONNECTIONS: See Pin definitions below

 - V1.01 11/30/2013
   Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <AccelStepper.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define FULLSTEP 4
#define HALFSTEP 8
// motor pins
#define motorPin1  4     // Blue   - 28BYJ48 pin 1
#define motorPin2  5     // Pink   - 28BYJ48 pin 2
#define motorPin3  6     // Yellow - 28BYJ48 pin 3
#define motorPin4  7     // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
                        
#define motorPin5  8     // Blue   - 28BYJ48 pin 1
#define motorPin6  9     // Pink   - 28BYJ48 pin 2
#define motorPin7  10    // Yellow - 28BYJ48 pin 3
#define motorPin8  11    // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
/*-----( Declare objects )-----*/
// NOTE: The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

/*-----( Declare Variables )-----*/
//none

void setup()   /****** SETUP: RUNS ONCE ******/
{
  stepper1.setMaxSpeed(1000.0);
  stepper1.setAcceleration(50.0);
  stepper1.setSpeed(300);
  stepper1.moveTo(2048);  // 1 revolution 
  
  stepper2.setMaxSpeed(1000.0);
  stepper2.setAcceleration(50.0);
  stepper2.setSpeed(300);
  stepper2.moveTo(2048);  // 1 revolution 

}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{
  //Change direction at the limits
  if (stepper1.distanceToGo() == 0) 
    stepper1.moveTo(-stepper1.currentPosition());
    if (stepper2.distanceToGo() == 0) 
    stepper2.moveTo(-stepper2.currentPosition());
  
  stepper1.run();
  stepper2.run();

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//none
//*********( THE END )***********

Il faut boucler sur .run avec un while(distanceToGo()!=0)

n'étant pas du tout dans le domaine, pourrai tu éditer le code stp ?

merci d'avance

bin je l’ai écrit …

while(stepper1.run!=0 || stepper2.run!=0 ) {
  stepper1.run();
  stepper2.run();
}

voilà donc avec le code ci-dessous, les deux moteurs vont tourner indéfiniment et tout ça en même temps ?

/* YourDuinoStarter Example: 2 Stepper Motors
 - WHAT IT DOES: Runs 2 28BYJ-48 stepper motors with AccelStepper Library
 - Motors accelerate and decelerate simultaneously in opposite rotations
 - SEE the comments after "//" on each line below
 -  Derived from example code by Mike McCauley
 -  modified by Celem for single stepper
 -  modified by lowres for two steppers
 NOTE: This may not run 2 motors from USB.
       May need separate +5 Supply for motors
 - CONNECTIONS: See Pin definitions below

 - V1.01 11/30/2013
   Questions: terry@yourduino.com */

/*-----( Import needed libraries )-----*/
#include <AccelStepper.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define FULLSTEP 4
#define HALFSTEP 8
// motor pins
#define motorPin1  4     // Blue   - 28BYJ48 pin 1
#define motorPin2  5     // Pink   - 28BYJ48 pin 2
#define motorPin3  6     // Yellow - 28BYJ48 pin 3
#define motorPin4  7     // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
                       
#define motorPin5  8     // Blue   - 28BYJ48 pin 1
#define motorPin6  9     // Pink   - 28BYJ48 pin 2
#define motorPin7  10    // Yellow - 28BYJ48 pin 3
#define motorPin8  11    // Orange - 28BYJ48 pin 4
                        // Red    - 28BYJ48 pin 5 (VCC)
/*-----( Declare objects )-----*/
// NOTE: The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

/*-----( Declare Variables )-----*/
//none

void setup()   /****** SETUP: RUNS ONCE ******/
{
  stepper1.setMaxSpeed(1000.0);
  stepper1.setAcceleration(50.0);
  stepper1.setSpeed(300);
  stepper1.moveTo(2048);  // 1 revolution
 
  stepper2.setMaxSpeed(1000.0);
  stepper2.setAcceleration(50.0);
  stepper2.setSpeed(300);
  stepper2.moveTo(2048);  // 1 revolution

}//--(end setup )---


void loop()   /****** LOOP: RUNS CONSTANTLY ******/
{

while(stepper1.run!=0 || stepper2.run!=0 ) {
  stepper1.run();
  stepper2.run();
}

}//--(end main loop )---

/*-----( Declare User-written Functions )-----*/
//none
//*********( THE END )***********

Nan il faut configurer la position cible

il faut donner une condition if c'est ça ?

Bin c’est toi qui voit … Faudrait peut-être essayer de comprendre ce que tu fais parce que la à part te pondre le code je vois pas ce que je peux faire de plus :

currentPosition() = renvoi la position actuelle
moveTo() = défini la position cible
distanceToGo() = renvoi le nombre de pas restant avant d’atteindre la cible définie dans moveTo()
run() = suivant les paramètres défini auparavant (typiquement accélération et vitesse) fait faire un pas au moteur

bon écoute tant mieux si pour toi le code semble assez logique, c'est tout à ton honneur, respect robustesse.

Je débute, c'est pas faute d'aller rechercher les informations ailleurs, je me suis renseigné, peut être pas à la bonne porte...

Ce n'est pas du tout mon boulot, c'est un loisir, j'essaie simplement de rendre un service.

merci de ton aide en tout cas, je dispose de plusieurs cartes, je vais pas chercher midi à 14h , problème résolu.

Tu conduis un train, qui doit aller à une gare qui est à 100 km. Donc je dois aller à : ma position actuelle + 100 km. Ensuite je fais marcher le ma loco jusqu'à ce que je sois arriver, soit jusqu'à ce que ma distance à parcourir soit égale à zéro (= destination - position actuelle).

@ B@tto :

laisse tomber la loco et essaye avec une corde et un bout de laine :grin:

:grin: