if et else avec Accelstepper

Bonjour , je voudrai faire tourner un moteur nema 17 avec la bibliothèque Accelstepper avec l'aide de 2 bouton poussoir pour la marche avant et arrière .
Dans un premier temps, je rencontre des difficultés avec la marche avant . L'emploie du else m'est refusé lors de la vérification .
Qui serai me dire pourquoi parce que je sais déjà pas comment faire avec la marche arrière si cela ne marche pas en marche avant .

#include <AccelStepper.h>


int switchStateAPV=0;    // BP marche avant   (5022 pas , speed 3000,accelération 500)

int switchStateRPV=0;   //  BP marche arriere  (2888 pas , speed 2000,accelération 250) 



// Define a stepper and the pins it will use
   AccelStepper stepper (1,8,4) ;

void setup() {

pinMode(13,INPUT);                //  entrée 13  Button poussoir marche avant  
pinMode(12,INPUT);                //  entrée 12  Button poussoir marche arriere 


  }

void loop() {
  
  switchStateAPV  =   digitalRead(13); 
  switchStateRPV  =   digitalRead(12); 
    
  if (switchStateAPV==HIGH)               // appuis sur bouton marche avant

{  stepper.setMaxSpeed(3000 ) ;
    stepper.setAcceleration(500 ) ;
    stepper.moveTo  (5022 )  ; 
    stepper.run();  }                                // mise en route moteur stepper sur maximum 5022 pas

}          
 
  else (switchStateAPV==LOW) 

    { stepper.stop(); }

Bonjour,

Formates correctement ton code (avec ctrl T) et tu verras que tu as un crochet fermant en trop.

et   else (switchStateAPV==LOW) ce n'est pas bon

revoir la structure if-else

if (condition) {
  // on exécute cela si la condition est vérifiée
  instruction1;
  instruction2;
  instruction3;
  ...
} else {
  // on exécute cela si la condition n'est pas vérifiée
  instruction1;
  instruction2;
  instruction3;
  ...
}
int switchStateAPV = 0; // marche avant( 5022 pas, speed 3000,acceleration 500 )
int switchStateRPV = 0; // marche arriere( 2888 pas, speed 2000,acceleration 250 )

AccelStepper stepper (1, 8, 4);

void setup() {

  pinMode(13, INPUT);
  pinMode(12, INPUT);
}

void loop() {

  switchStateAPV = digitalRead(13);
  switchStateRPV = digitalRead(12);

  if (switchStateAPV == HIGH)  // appuis marche avant
  { stepper.setMaxSpeed(3000);
    stepper.setAcceleration(500);
    stepper.moveTo (5022);
    stepper.run();
  }

  else if (switchStateRPV == HIGH) // appuis marche arriere
  { stepper.setMaxSpeed(2000);
    stepper.setAcceleration(250);
    stepper.moveTo (-2888);
    stepper.run();
  }
  else
  {
    stepper.stop();
  }
}

relire le post #1 pour le formatage du code.. là c'est illisible sur mon smartphone

et si je lâche le BP en marche avant en cour d'étape , je n'ai pas la marche arrière

quel comportement attendez vous ? si vous lâchez le bouton vous appelez stop et plus run... (y compris pendant les rebonds du bouton d'ailleurs)

Je pense avoir compris ce que veut dire crtl T . Je l'ai modifier sur mon dernier post .

Pour la marche arrière ça fonctionne pas .
Si j'appuis sur le BP en marche avant , mon moteur tourne correctement . Si je le lâche et appuis une seconde fois il continue son cycle comme prévu.
Mais si je decide en cour de route de faire marche arrière , il y va pas !!!!
Je comprends pas ce qui se passe .

Si je le lâche et appuis une seconde fois il continue son cycle comme prévu.
Mais si je decide en cour de route de faire marche arrière , il y va pas !!!!

ça veut dire quoi "en cours de route"? vous lâchez le bouton marche avant et appuyez sur l'autre?
comment sont câblés les boutons? (sinon faudra lire un peu comment marchent stepper.moveTo() et run() )

Pour le câblage du bouton , j'ai pris exemple sur le livre des projet Arduino . J'alimente mon BP en 5v et en ressort pour alimenter une entrée de la carte UNO en même temps qu'une résistance de 10 K qui est raccordé en sortie au - de la carte . Rien de bien spécial il me semble .

Pour le fonctionnement , je veux simplement appuyer sur les BP de marche avant ou arrière à tous moment selon une lecture visuelle . ( le moteur entraîne un chariot mobile en fait) .

Le tout sans dépasser un nombre de pas dans un sens ou un autre parce que je n'ai pas de fin de course et buté mécanique pour arrêter le chariot.
Le but est d'avoir deux marches avant et deux marche arrière qui ne sont pas identique en vitesse et en accélération .

Je vais relire move to . Peut être c'est pas la bonne solution .

Pour le bouton le plus simple c'est de partir de la pin et d'aller vers GND au travers du bouton et de configurer la pin en INPUT_PULLUP, comme ça vous n'avez pas besoin d'avoir une résistance en plus

(mais ça inverse le sens de lecture, le bouton sera HIGH au repos et LOW quand appuyé)

FLY007:
Le tout sans dépasser un nombre de pas dans un sens ou un autre parce que je n'ai pas de fin de course et buté mécanique pour arrêter le chariot

un stepper fait un nombre de pas dans une certaine direction, donc à chaque fois vous redéfinissez ce nombre de pas à effectuer. Si vous voulez compter un nombre de pas max, il faut essayer de vous souvenir où vous êtes....

c'est que le site Accelstepper est maigre en explication .Pour pas dire qu'il y en a pas .

un stepper ne sait pas où il se trouve. il ne sait faire que des pas dans un sens ou l'autre

la librairie vous permet de configurer l'accélération, la vitesse et ensuite demander de faire un certains nombre de pas dans un sens.

la méthode run(), à appeler souvent, va faire un pas quand il faut dans la bonne direction.
le "quand il faut" ça veut dire que la libraire regarde si c'est le moment de faire ce pas (en fonction de la vitesse et accélération) et aussi du nombre de pas que vous aviez précédemment demandé d'effectuer.

il y a d'autres méthodes que vous pouvez regarder comme distanceToGo() qui vous dira combien il reste de pas à effectuer par rapport à la dernière demande.

ici un des soucis que vous avez c'est qu'à chaque fois que vous rentrez dans le if, vous redéfinissez le nombre de pas à effectuer, donc vous repoussez à chaque fois les limites.

il faudrait définir la position initiale du chariot pour savoir combien de pas vous pouvez faire dans un sens ou ou dans l'autre ou installer des capteurs de fin de course.

Sinon c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Ah oui , vous connaissez bien . Je vais lire et relire . merci pour les infos , j'ai de quoi faire .....