2 steppers motors controllé par 2 potentiomètres 10k avec AccelStepper [Résolu]

Bonjour,
Il est assez compliqué d’expliquer ce que je voudrais d’autant plus que je suis débutant ^^ donc si vous ne comprenez pas mes explications dites le moi.
Pour faire simple il y a deux programmes :

  • Une boucle qui fait bouger les deux steppers en même temps dans un mouvement continu (de 200 à 0 ; 0 à 200 ; etc)
  • Une autre boucle qui bouger les deux steppers séparément par le contrôle de deux potentiomètres 10k (A0 pour le stepper1 (4,5,6,7) et A1 pour le stepper2 (8,9,10,11)

Pour passer d’un programme à l’autre j’utilise un bouton connecté sur le port digital 2.

Voici le matériel que j’utilise :

  • Une carte arduino
  • Deux Steppers motors unipolaires avec contrôleurs ULN2003
  • Deux potentiomètres 10k linéaires
  • Un bouton

Le code :

/*
  Stepper Motor Demonstration 2
  Stepper-Demo2.ino
  Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver
  Uses Accelstepper Library
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/
 
// Include the AccelStepper Library
#include <AccelStepper.h>
 
// Define Constants
 
// Define step constants
#define FULLSTEP 4
 
// Define Motor Pins (2 Motors used)
 
#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4
                        
                        
#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4
 
// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

const int  buttonPin = 2;    // the pin that the pushbutton is attached to
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button

int val = 0;
int val2 = 0;
int previous = 0;
int previous2 = 0;
int long newval = 0; 
int long newval2 = 0;

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  
  stepper1.setMaxSpeed(1000);  // Set speed fast enough to follow pot rotation
  stepper1.setAcceleration(1000);  //  High Acceleration to follow pot rotation  
  stepper1.moveTo(0); 
  
  stepper2.setMaxSpeed(1000);  // Set speed fast enough to follow pot rotation
  stepper2.setAcceleration(1000);  //  High Acceleration to follow pot rotation  
  stepper2.moveTo(0); 
}

void loop() {
  buttonState = digitalRead(buttonPin); // read the pushbutton input pin:

  val = analogRead(A0);  //  Read Potentiometer current value
  val2 = analogRead(A1);  //  Read Potentiometer current value
  
  
  if (buttonState != lastButtonState) {      // compare the buttonState to its previous state
    
    if (buttonState == HIGH) {
            if ((val > previous+6) || (val < previous-6)) {  // Check that a move of the pot is at least > or < than 6
        newval = map(val, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper1.runToNewPosition(newval);  // Move stepper to new position
        previous = val;  // save current value into variable previous
      }
      
      if ((val2 > previous2+6) || (val2 < previous2-6)) {  // Check that a move of the pot is at least > or < than 6
        newval2 = map(val2, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper2.runToNewPosition(newval2);  // Move stepper to new position
        previous2 = val2;  // save current value into variable previous
      }
  
      stepper1.run();
      stepper2.run();       // if the state has changed, increment the counter
    }
    else {
      stepper1.moveTo(200); 
      stepper2.moveTo(-200); 
      
      //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();
    }
    
  delay(50);     // Delay a little bit to avoid bouncing
  }

  lastButtonState = buttonState;     // save the current state as the last state, for next time through the loop
}

Les tutoriels que j’ai utilisé :

Mon problème ce situe probablement dans le loop avec

stepper1.moveTo(200); 
      stepper2.moveTo(-200);

C’est la seul piste que j’ai ^^.

Vous n’avez pas décrit comment se matérialise votre problème - que fait le programme versus ce que vous espériez qu’il fasse ?

Est-ce que votre bouton est momentané ou c’est un interrupteur permanent ?

Bonjour, merci pour votre réponse.
Le programme au début passe au mode "mouvement répété" (je vais l'appeler "control1" se sera plus simple) puis quelques millisecondes après il passe directement à l'autre mode "contrôle avec les potentiomètres" ("control2"). Après lorsque j'appuis sur le bouton l'ULN2003 du stepper1 (uniquement lui) allume les leds A et D puis quand je réappuie les leds B et C s'allume tandis que les leds A et D s'éteignent. Je pense qu'il va falloir que je fasse une vidéo ^^.

Ce que je voudrais c'est que le passage de control1 à control2 se fasse uniquement avec le bouton momentané, c'est tout.

Bonjour,
J’ai essayé une autre manière d’utiliser le bouton momentané avec un counter :

/*
  Stepper Motor Demonstration 2
  Stepper-Demo2.ino
  Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver
  Uses Accelstepper Library
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/
 
// Include the AccelStepper Library
#include <AccelStepper.h>
 
// Define Constants
 
// Define step constants
#define FULLSTEP 4
 
// Define Motor Pins (2 Motors used)
 
#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4
                        
                        
#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4
 
// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

const int buttonPin = 3;    // the pin that the pushbutton is attached to
int counter = 1;         // current state of the button
int buttonState = 0;

int val = 0;
int val2 = 0;
int previous = 0;
int previous2 = 0;
int long newval = 0; 
int long newval2 = 0;

void setup() {
  Serial.begin(9600);
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT_PULLUP);
  
  stepper1.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper1.setAcceleration(2000);  //  High Acceleration to follow pot rotation
  
  stepper2.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper2.setAcceleration(2000);  //  High Acceleration to follow pot rotation

  
      stepper1.moveTo(200); 
      stepper2.moveTo(-200); 
}

void loop() {

  val = analogRead(A0);  //  Read Potentiometer current value
  val2 = analogRead(A1);  //  Read Potentiometer current value
    
 buttonState = digitalRead(buttonPin);
 if(buttonState == HIGH)
 {
   counter + 1;
   //Reset count if over max mode number
   if(counter == 4)
   {
     counter = 1;
   }
 }
  else {}
  Serial.println(buttonState);
  Serial.println(counter);

  if(counter == 1) {
      
      //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();
  }

  else if (counter == 2) {
        stepper1.moveTo(0); 
        stepper2.moveTo(0); 
      if ((val > previous+6) || (val < previous-6)) {  // Check that a move of the pot is at least > or < than 6
        newval = map(val, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper1.runToNewPosition(newval);  // Move stepper to new position
        previous = val;  // save current value into variable previous
      }
      
      if ((val2 > previous2+6) || (val2 < previous2-6)) {  // Check that a move of the pot is at least > or < than 6
        newval2 = map(val2, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper2.runToNewPosition(newval2);  // Move stepper to new position
        previous2 = val2;  // save current value into variable previous
      }
  
      stepper1.run();
      stepper2.run();       // if the state has changed, increment the counter
  }
}

Malheureusement le counter reste sur 1 même quand j’appuie sur le bouton d’après le println alors qu’il devrait augmenter de +1 à chaque fois que j’appuie sur le bouton. Merci d’avance !

Ecrit comme cela, ça ne fait pas augmenter le compteur...counter + 1;On peut écrire de différentes façons:

counter++;
counter += 1;
counter = counter  + 1;

et faire  else {}ne sert à rien, autant ne pas le mettre...

comment est câblé le bouton ? comment pensez vous gérez les rebonds ? --> faites fonctionner votre bouton, ensuite vous ajouterez le moteur

sinon Pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau

Merci pour votre réponse. Effectivement il fallait changer et mettre counter++; à la place. Désormais je peux à changer de mode mais je rencontre un nouveau problème :

stepper1.moveTo(200);
stepper2.moveTo(-200);

varient en fonction de la position des potentiomètres (plus la valeur des potentiomètres augmente plus le moveTo augmente dans le control1 d’après ce que je constate).
Sinon le bouton est câblé comme le schéma de ce tutoriel (https://www.arduino.cc/en/Tutorial/StateChangeDetection).
Du coup pour les rebonds j’ai mis un delay(200);.

Voici le code maintenant :

/*
  Stepper Motor Demonstration 2
  Stepper-Demo2.ino
  Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver
  Uses Accelstepper Library
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/
 
// Include the AccelStepper Library
#include <AccelStepper.h>
 
// Define Constants
 
// Define step constants
#define FULLSTEP 4
 
// Define Motor Pins (2 Motors used)
 
#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4
                        
                        
#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4
 
// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

const int buttonPin = 3;    // the pin that the pushbutton is attached to
int counter = 1;         // current state of the button
int buttonState = 0;

int val = 0;
int val2 = 0;
int previous = 0;
int previous2 = 0;
int long newval = 0; 
int long newval2 = 0;

void setup() {
  Serial.begin(9600);
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT_PULLUP);
  
  stepper1.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper1.setAcceleration(2000);  //  High Acceleration to follow pot rotation
  stepper1.moveTo(200); 
  
  stepper2.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper2.setAcceleration(2000);  //  High Acceleration to follow pot rotation
  stepper2.moveTo(-200); 
}

void loop() {

  val = analogRead(A0);  //  Read Potentiometer current value
  val2 = analogRead(A1);  //  Read Potentiometer current value
    
 buttonState = digitalRead(buttonPin);
 if(buttonState == HIGH)
 {
   counter++;
   //Reset count if over max mode number
   if(counter == 3)
   {
     counter = 1;
   }
   delay(200);
 }
  Serial.println(counter);

  if(counter == 1) {
      
      //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();
  }

  else if (counter == 2) {
      if ((val > previous+6) || (val < previous-6)) {  // Check that a move of the pot is at least > or < than 6
        newval = map(val, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper1.runToNewPosition(newval);  // Move stepper to new position
        previous = val;  // save current value into variable previous
      }
      
      if ((val2 > previous2+6) || (val2 < previous2-6)) {  // Check that a move of the pot is at least > or < than 6
        newval2 = map(val2, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper2.runToNewPosition(newval2);  // Move stepper to new position
        previous2 = val2;  // save current value into variable previous
      }
  
      stepper1.run();
      stepper2.run();       // if the state has changed, increment the counter
  }
}

Du coup je pense qu’il faudrait réinitialiser

stepper1.runToNewPosition(newval);
stepper2.runToNewPosition(newval2);

au changement de mode est-ce bien cela ?

ré-expliquez exactement ce que vous souhaitez obtenir comme comportement

Ce que je souhaiterais c'est de pouvoir à la fois contrôler les deux steppers avec deux potentiomètres puis dans un autre mode que les steppers fassent un mouvement droite/gauche (de cette façon Stepper Motors with Arduino - Controlling Bipolar & Unipolar stepper motors - YouTube (à 27min 22sec) sans l’accélération/décélération).
Ce changement de mode s'effectue avec un bouton momentané.
Je ne sais pas comment je pourrais détailler plus que cela à part en faisant une vidéo.

appelons le mode "droite/gauche" le mode "balayage" et l'autre mode "contrôle direct"

Est-ce que l'appui sur le bouton (et relâche ?) doit faire basculer d'un mode à l'autre, ou le mode direct ne fonctionne que tant que vous tenez le bouton appuyé?

En mode direct, Que doit commander le potentiomètre ? quel doit être le mouvement (ou la "position" ?) du moteur pas à pas en fonction de la valeur du potentiomètre ?

Pour changer de mode j'appuie sur le bouton sans maintenir pour passer de 1 à 2 ou de 2 à 1 (1: "balayage" et 2: "contrôle direct").
Les potentiomètres servent à calibrer à la main des deux steppers car ceux-ci n'ont pas de position initiale donc les potentiomètres servent par un mouvement horaire ou anti-horaire (comme sur cette vidéo How to Control a Stepper Motor with an Arduino using a Potentiometer? - Tutorial - YouTube à 6min 15sec) à remettre les steppers à la position initiale que j'ai décidé et qu'ensuite le balayage se fasse correctement à la bonne position.

Côté contrôle des modes par le bouton c'est bon ^^.

Bon même si le programme ne fonctionne pas à la perfection il me permet tout de même de faire ce que je voulais à ce stade donc vraiment, merci beaucoup pour votre aide ! Vous pouvez le passer en résolu ^^. Voici le sketch final si quelqu’un en aurais besoin :

/*
  Stepper Motor Demonstration 2
  Stepper-Demo2.ino
  Demonstrates Two 28BYJ-48 Unipolar Steppers with ULN2003 Driver
  Uses Accelstepper Library
 
  DroneBot Workshop 2018
  https://dronebotworkshop.com
*/
 
// Include the AccelStepper Library
#include <AccelStepper.h>
 
// Define Constants
 
// Define step constants
#define FULLSTEP 4
 
// Define Motor Pins (2 Motors used)
 
#define motorPin1  8     // Blue   - 28BYJ48 pin 1
#define motorPin2  9     // Pink   - 28BYJ48 pin 2
#define motorPin3  10    // Yellow - 28BYJ48 pin 3
#define motorPin4  11    // Orange - 28BYJ48 pin 4
                        
                        
#define motorPin5  4     // Blue   - 28BYJ48 pin 1
#define motorPin6  5     // Pink   - 28BYJ48 pin 2
#define motorPin7  6     // Yellow - 28BYJ48 pin 3
#define motorPin8  7     // Orange - 28BYJ48 pin 4
 
// Define two motor objects
// The sequence 1-3-2-4 is required for proper sequencing of 28BYJ48
AccelStepper stepper1(FULLSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2(FULLSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

const int buttonPin = 3;    // the pin that the pushbutton is attached to
int counter = 1;         // current state of the button
int buttonState = 0;

int val = 0;
int val2 = 0;
int previous = 0;
int previous2 = 0;
int long newval = 0; 
int long newval2 = 0;

void setup() {
  Serial.begin(9600);
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT_PULLUP);
  
  stepper1.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper1.setAcceleration(2000);  //  High Acceleration to follow pot rotation
  stepper1.moveTo(200); 
  
  stepper2.setMaxSpeed(2000);  // Set speed fast enough to follow pot rotation
  stepper2.setAcceleration(2000);  //  High Acceleration to follow pot rotation
  stepper2.moveTo(-200); 
}

void loop() {

  val = analogRead(A0);  //  Read Potentiometer current value
  val2 = analogRead(A1);  //  Read Potentiometer current value
    
 buttonState = digitalRead(buttonPin);
 if(buttonState == HIGH)
 {
   counter++;
   //Reset count if over max mode number
   if(counter == 3)
   {
     counter = 1;
   }
   delay(200);
 }
  Serial.println(counter);

  if(counter == 1) {
      //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();
  }

  else if (counter == 2) {
      if ((val > previous+6) || (val < previous-6)) {  // Check that a move of the pot is at least > or < than 6
        newval = map(val, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper1.runToNewPosition(newval);  // Move stepper to new position
        previous = val;  // save current value into variable previous
      }
      
      if ((val2 > previous2+6) || (val2 < previous2-6)) {  // Check that a move of the pot is at least > or < than 6
        newval2 = map(val2, 0, 1023, 0, 1600);  // Map value (1600 = 1 stepper shaft rotation)
        stepper2.runToNewPosition(newval2);  // Move stepper to new position
        previous2 = val2;  // save current value into variable previous
      }
  
      stepper1.run();
      stepper2.run();       // if the state has changed, increment the counter
  }
}

Vous pouvez le passer en résolu ^^.

c'est à vous de le faire en éditant votre premier post et en changeant le titre pour rajouter [Résolu]