probleme librairie accel stepper

test librairie accel stepper

bonjour a tous, j'essaye d'utiliser depuis un moment cette librairie, mais certaine fonction me pose des problemes.

j'ai fais donc un code tout bete, avec le bouton up, je lance le moteur (ça marche), avec le bouton down, je l arrete (ça marche pas)

l'idée est de tester plus tard, le lancement d'un moteur, et des qu'une entrée est active, le moteur s arrete

voici le code

#include <AccelStepper.h>
//#include <MultiStepper.h>
AccelStepper stepper1(1, 11, 12); // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5


#include <LiquidCrystal.h>

// Variables pour utiliser l'ecran
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Definir les pins utilisees par le LCD
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

/************************************************************************************************************/
// Fonction lire les boutons
/************************************************************************************************************/
int read_LCD_buttons()
{
  adc_key_in = analogRead(0); // Lire les valeurs du capteurs
  // Les valeurs renvoyees sont sensees etre: 0, 144, 329, 504, 741
  // Il y a une erreur possible de 50
if (adc_key_in > 1000) return btnNONE; // Nous découpons les valeurs possibles en zone pour chaque bouton
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 144) return btnUP;
if (adc_key_in < 329) return btnDOWN;
if (adc_key_in < 504) return btnLEFT;
if (adc_key_in < 741) return btnSELECT;
  return btnNONE; // On renvoie cela si l'on est au dessus de 850
}

int s1=0;
int v1=0;

// Variables du programme Adrien
// ENTREES


// SORTIES


int g1 = 0;

void printG1()
{
  char bufG1[10];
  lcd.setCursor(13, 0);
  sprintf(bufG1, "%d", g1);
  lcd.print(bufG1);
}

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2); // Demarrer la librairie ecran
  
  //pinmode

}

void loop() {
  // put your main code here, to run repeatedly:
  stepper1.setMaxSpeed(1500); //vitesse en hertz     
  stepper1.setAcceleration(1500); //pas/s²
  stepper1.moveTo(s1);
  stepper1.run();
int value= analogRead(A0);

  if (g1==0 and 144 < value and value < 329)  //btnUp
  {
        s1=stepper1.currentPosition()+50000;
        g1=10;
        printG1();
        
  }
  else if (g1==10 and stepper1.isRunning() )  //btnUp
  {
        g1=20;
        printG1();
  }
  else if (g1==20 and 329 <value and value < 504)  //btndown
  {
        stepper1.stop();
        g1=30;
        printG1();
  }
    else if (g1==30 and !stepper1.isRunning())  //btndown
  {
        g1=0;
        printG1();
  }
}

pour le test des boutons j ai fais au plus court et plus simple

en fait j ai l'impression qu'il faut switcher stepper1.run() par stepper1.stop() pour que l arret se fasse, c est pas super clair

j'ai fait l essai avec cette modif

le moteur s'arrete.... mais net, sans tenir compte de la decceleration

#include <AccelStepper.h>
//#include <MultiStepper.h>
AccelStepper stepper1(1, 11, 12); // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5


#include <LiquidCrystal.h>

// Variables pour utiliser l'ecran
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Definir les pins utilisees par le LCD
int lcd_key = 0;
int adc_key_in = 0;
int run=0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

/************************************************************************************************************/
// Fonction lire les boutons
/************************************************************************************************************/
int read_LCD_buttons()
{
  adc_key_in = analogRead(0); // Lire les valeurs du capteurs
  // Les valeurs renvoyees sont sensees etre: 0, 144, 329, 504, 741
  // Il y a une erreur possible de 50
if (adc_key_in > 1000) return btnNONE; // Nous découpons les valeurs possibles en zone pour chaque bouton
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 144) return btnUP;
if (adc_key_in < 329) return btnDOWN;
if (adc_key_in < 504) return btnLEFT;
if (adc_key_in < 741) return btnSELECT;
  return btnNONE; // On renvoie cela si l'on est au dessus de 850
}

int s1=0;
int v1=0;

// Variables du programme Adrien
// ENTREES


// SORTIES


int g1 = 0;

void printG1()
{
  char bufG1[10];
  lcd.setCursor(13, 0);
  sprintf(bufG1, "%d", g1);
  lcd.print(bufG1);
}

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2); // Demarrer la librairie ecran
  
  //pinmode

}

void loop() {
  // put your main code here, to run repeatedly:
  stepper1.setMaxSpeed(1500); //vitesse en hertz     
  stepper1.setAcceleration(1500); //pas/s²
  stepper1.moveTo(s1);

  if (run==1)
  {
  stepper1.run();
  }
  else if (run==0)
  {stepper1.stop();
  }
int value= analogRead(A0);

  if (g1==0 and 144 < value and value < 329)  //btnUp
  {
        run=1;
        s1=stepper1.currentPosition()+50000;
        g1=10;
        printG1();
        
  }
  else if (g1==10 and stepper1.isRunning() )  //btnUp
  {
        g1=20;
        printG1();
  }
  else if (g1==20 and 329 <value and value < 504)  //btndown
  {
        run=0;
        g1=30;
        printG1();
  }
    else if (g1==30 and !stepper1.isRunning())  //btndown
  {
        g1=0;
        printG1();
  }
}

bon ba j ai trouvé comment faire marcher cette librairie, c'est plustot compliqué mais tres utile, dans l'ere machines motorisés

mais ça n'a pas l'air d'interessé

Je pense que c'est très intéressant, au contraire.
La fonction .stop() est censée respecter la décélération. Par contre tu n'as aucune raison de mettre
stepper.setMaxSpeed(150);
stepper.setAcceleration(100);
Dans ta boucle principale, car l'argument de cette fonction est en virgule flottante et inclus un calcul de racine carré, c'est donc très couteux en cycle

void AccelStepper::setAcceleration
(
float
acceleration
)

Sets the acceleration/deceleration rate.
Parameters
[in]
acceleration
The desired acceleration in steps per second per second. Must be > 0.0. This is an expensive call since it requires a square root to be calculated. Dont call more ofthen than needed

References computeNewSpeed().
Referenced by AccelStepper().

Ici un programme qui stop le moteur le plus rapidement possible en respectant la décélération
http://www.airspayce.com/mikem/arduino/AccelStepper/Quickstop_8pde-example.html

// Quickstop.pde
// -- mode: C++ --
//
// Check stop handling.
// Calls stop() while the stepper is travelling at full speed, causing
// the stepper to stop as quickly as possible, within the constraints of the
// current acceleration.
//
// Copyright (C) 2012 Mike McCauley
// $Id: $

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5

void setup()
{
stepper.setMaxSpeed(1500);
stepper.setAcceleration(100);//(mettre une accélération très lente pour visualiser)
}

void loop()
{
stepper.moveTo(500);
while (stepper.currentPosition() != 300) // Full speed up to 300
stepper.run();
stepper.stop(); // Stop as fast as possible: sets new target
stepper.runToPosition();
// Now stopped after quickstop

// Now go backwards
stepper.moveTo(-500);
while (stepper.currentPosition() != 0) // Full speed basck to 0
stepper.run();
stepper.stop(); // Stop as fast as possible: sets new target
stepper.runToPosition();
// Now stopped after quickstop

}

bonjour , merci alors j ai refait le code en tenant compte de tes considerations

#include <AccelStepper.h>
#include <LiquidCrystal.h>

// Variables pour utiliser l'ecran
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Definir les pins utilisees par le LCD
int lcd_key = 0;
int adc_key_in = 0;

#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

/************************************************************************************************************/
// Fonction lire les boutons
/************************************************************************************************************/
int read_LCD_buttons()
{
  adc_key_in = analogRead(0); // Lire les valeurs du capteurs
  // Les valeurs renvoyees sont sensees etre: 0, 144, 329, 504, 741
  // Il y a une erreur possible de 50
if (adc_key_in > 1000) return btnNONE; // Nous découpons les valeurs possibles en zone pour chaque bouton
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 144) return btnUP;
if (adc_key_in < 329) return btnDOWN;
if (adc_key_in < 504) return btnLEFT;
if (adc_key_in < 741) return btnSELECT;
  return btnNONE; // On renvoie cela si l'on est au dessus de 850
}
int g1 = 0;
int g2 = 0;
int s0=0;
int s1=0;
int run=0;
int run1=0;
int timer=0;
int timer1=0;
int timermessage=0;
int timermessage1=0;

AccelStepper stepper(1, 12, 11); 
AccelStepper stepper1(1,53, 52);

// Variables du programme Adrien
// ENTREES


// SORTIES



void printG1()
{
  char bufG1[10];
  lcd.setCursor(0, 0);
  sprintf(bufG1, "g1=%d ", g1);
  lcd.print(bufG1);
}

void printG2()
{
  char bufG2[20];
  lcd.setCursor(0, 1);
  sprintf(bufG2, "g2=%d ", g2);
  lcd.print(bufG2);
}

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2); // Demarrer la librairie ecran
   //pinmode
  pinMode(13,INPUT); 
  pinMode(51,INPUT);   
     stepper.setAcceleration(2000); //pas/s²
    stepper.setMaxSpeed(2000); //vitesse en hertz  
    stepper1.setAcceleration(2000); //pas/s²
    stepper1.setMaxSpeed(2000); //vitesse en hertz 
}

void loop() {


  if (run==1)
  {
    stepper.moveTo(s0);
    stepper.run();
  }
  else
  { 
    stepper.run();
    stepper.stop();
    stepper.runToPosition();
  }


    if (run1==1)
  {
    stepper1.moveTo(s1);
    stepper1.run();
  }
  else
  {
    stepper1.run();
    stepper1.stop();
    stepper1.runToPosition();
  }

//timer message 1

int time=millis();
int time1=millis();
int inter=digitalRead(13);
int inter1=digitalRead(51);


if (g1 != 60)
    {
     timermessage= time + 3000;
    }
else if (g1==60 && time > timermessage)
       {
        timer=1;
       }
  else
       {
        timer=0;
       }

if (g2 != 60)
    {
     timermessage1= time1 + 3000;
    }
else if (g2==60 && time1 > timermessage1)
       {
        timer1=1;
       }
  else
       {
        timer1=0;
       }

//loop for stepper

if (g1==0 ) //start stepper
  {
        run=1;
        s0=stepper.currentPosition()+50000;
        g1=10;
        printG1();
        
  }
  else if (g1==10 and stepper.isRunning() ) //when stepper is running
  {
        g1=20;
        printG1();
  }
  else if (g1==20 and inter==LOW)  // when input is actived stop the stepper with decceleration
  {
        run=0;
        g1=30;
        printG1();
  }
  else if (g1==30 and !stepper.isRunning()) //when stepper is stopped reverse the stepper
  {
        run=1;
        s0=stepper.currentPosition()-50000;
        g1=40;
        printG1();
  }
  else if (g1==40 and stepper.isRunning()) //when stepper is running
  {
       g1=50;
       printG1();
  }
  else if (g1==50 and inter==HIGH) // when the input is not actived, stop the stepper with decceleration
  {
       run=0;
       g1=60;
       printG1();
  }
  else if (g1==60 and timer==1)  //when the timer is finish, we can restart the loop
 {    
       g1=0;
       printG1();
  }




// loop for stepper1
 if (g2==0 )
  {
        run1=1;
        s1=stepper1.currentPosition()+50000;
        g2=10;
        printG2();
        
  }
  else if (g2==10 and stepper1.isRunning() )  
  {
        g2=20;
        printG2();
  }
  else if (g2==20 and inter1==LOW)
  {
        run1=0;
        g2=30;
        printG2();
  }
  else if (g2==30 and !stepper1.isRunning())
  {
    run1=1;
    s1=stepper1.currentPosition()-50000;
    g2=40;
    printG2();
  }
    else if (g2==40 and stepper1.isRunning())
  {
    g2=50;
    printG2();
  }
    else if (g2==50 and inter1==HIGH)
  {
    run1=0;
    g2=60;
    printG2();
  }
    else if (g2==60 and timer1==1)
 {    
        g2=0;
        printG2();
  }

}

cela marche parfaitement pour 1 moteur, par contre si j en ai 2 en parralllele et independant les un des autres, j'ai des problemes d'interruption

exemple

le bouton entrée 13 sert au moteur stepper, le bouton entrée 51 sert au stepper1

les deux moteurs se lançe a peu pres au meme moment

si je reste cliquer sur 51, j ai stepper qui s interrompt qq secondes pendant que stepper1 s arrete en, deccelleration

et a l inverse si je clique 13, ba c est stepper1 qui s interrompt

cela est tres genant pour moi, car cela montrerais que je ne peux pas utiliser les arduino pour automatiser certaines machines ayant plusieurs moteurs pas a pas