Code pour 2 fin de courses

Bonjour à tous, je voudrais mettre 2 fin de courses (départ /arrivé).
A la place des lignes 29 et 38
Si fin de course fermé le moteur tourne dans le sens des aiguilles d’une montre
et inversement dans le sens contraire.
j’ai juste crée les 2 variables “fin de course”
Pouvez vous m’aider à faire le code ?
Merci merci pour votre aide.
Le but et de tendre ou détendre la toile d’une tonnelle en cas de pluie avec un seul BP.

#include <Stepper.h>

//pour un moteur de 200 pas par tour et brancher sur les broches 2, 3, 4, 5
Stepper moteur(200, 2, 3, 4, 5);

int bp=8; // BP broche 8 
int rot = 3600 ; // nombre de tour

//*********** fin de course ************************
boolean  fdcd=6; // fdcd = fin de course depart broche 6
boolean fdca=7; // fdca = fin de course arrive broche 7
// *************************************************

void setup(){

  pinMode (bp, INPUT_PULLUP);
 
      moteur.setSpeed(100); //200 tours par minute
    //(rappel : ici le moteur fait 200 pas par tour, on fera donc 6000 pas par minute) 

}

void loop(){

  // lire l'etat du bouton 
while(!digitalRead(bp)) // si bouton enfonce le programme demarre
    {     
  
    moteur.step(rot); // nombre de tour, soit 1 tour complet pour une valeur de 200
    delay(1500);
    
    //*************************
    }
    // lire l'etat du bouton 
while(!digitalRead(bp)) // si bouton enfonce le programme redemarre
    {  

      moteur.step(-rot); // nombre de tour, soit 1 tour complet pour une valeur de 200
    delay(1500);
    
    } 
  

}

Si je comprends bien, tu veux lancer le moteur avec le bouton poussoir et le faire s’arrêter automatiquement lorsque l’un des capteurs de fin de course se déclenche ?

Ensuite, lors d’un prochain appui sur le bouton, le moteur tourne dans l’autre sens jusqu’au déclenchement de l’autre fin de course ?

Si c’est ça, tu dois d’abord déclarer tes fins de course comme le bouton poussoir :

#include <Stepper.h>

//pour un moteur de 200 pas par tour et brancher sur les broches 2, 3, 4, 5
Stepper moteur(200, 2, 3, 4, 5);

const int bp = 8; // BP broche 8
const int rot = 3600 ; // nombre de tour

//*********** fin de course ************************
const int fdcd = 6; // fdcd = fin de course depart broche 6
const int fdca = 7; // fdca = fin de course arrive broche 7
// *************************************************

void setup() {

  pinMode (bp, INPUT_PULLUP);
  pinMode (fdcd, INPUT_PULLUP);
  pinMode (fdca, INPUT_PULLUP);

  moteur.setSpeed(100); //200 tours par minute
  //(rappel : ici le moteur fait 200 pas par tour, on fera donc 6000 pas par minute)

}

Ensuite, il te faut une variable qui va surveiller le sens de déplacement du moteur. Elle vaudra soit 1 soit -1 et elle sera changée par un appui sur le bp.
Il te restera à surveiller le bouton et les fins de course, et agir en conséquence. En pseudo code, ça donnerait :

  • Lire l’état du bouton poussoir et des fins de course
  • Si bouton poussoir enfoncé : changer de sens (sens = - sens), lancer le moteur avec le nombre de tours rot * sens
  • Si fin de course enfoncé : arrêter le moteur
    A coder et tester…

Bonjour, OUIiiii merci c'est exactement sa!
Cela va être compliqué pour moi (je suis totalement novice) mais je vais me lancé dans l'aventure, si tu peux m'aider

Pas de problème, je te laisse commencer...

Si tu débutes, il faut y aller pas à pas :

  • D'abord, apprends à lire l'état des boutons et capteurs : fais un sketch avec la lecture dans la loop et l'affichage des états sur la console
  • Ensuite, apprends à te servir des moteurs : ajoute à ce sketch la commande du moteur sur appui du BP
  • Enfin, il te restera à ajouter l'arrêt du moteur sur détection des capteurs.
    Pour afficher quelque chose dans la console, il faut regarder ceci et là aussi

Alors voila j’ai changé de code, le contrôleur moteur (L298N) bouillant après 3 secondes d’utilisation !, j’ai donc remplacé par un contrôleur (TB6600), le new code me va très bien et cela m’évite de mettre des fin de courses et le câblage, maintenant mettre un capteur de pluie ? :slight_smile:

 /* Example sketch to control a stepper motor with TB6600 stepper motor driver, AccelStepper library and Arduino: acceleration and deceleration. More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include <AccelStepper.h>

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
int bp=8; // BP broche 8 
int capteur=A0; // broche A0
int detection;

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // Définissez la vitesse et l'accélération maximales:
  stepper.setMaxSpeed(2000);
  stepper.setAcceleration(800);
  pinMode (bp, INPUT_PULLUP);
  pinMode(capteur,INPUT); 
}

void loop() {
  detection=digitalRead(capteur); 
  
 while(!digitalRead(bp)) // si bouton enfonce le moteur demarre sens horaire
 
  // Set the target position:
  stepper.moveTo(-41000);
  // Run to target position with set speed and acceleration/deceleration:
  stepper.runToPosition();

  delay(1000);
//**********************************************
while(!digitalRead(bp)) // si bouton enfonce le moteur demarre le sens anti horaire

  // Revient à zéro:
  stepper.moveTo(0);
  stepper.runToPosition();

  delay(1000);
 }

Code avec le capteur de pluie, fonctionne nickel , sans BP

 // Motor nema 23 -  driver TB6600
// Include the AccelStepper library:
#include <AccelStepper.h>

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
//****** capteur de pluie ***********
int capteur=A0; // broche A0
int detection;
// ***********************************
// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  // Définissez la vitesse et l'accélération maximales:
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(1000);
  pinMode(capteur,INPUT); 
}

void loop() {
  detection=digitalRead(capteur); 
 
   while (detection==1) {    //si capteur humide moteur tourne sens anti horaire
    detection=digitalRead(capteur); 
    
  // Set the target position:
  stepper.moveTo(-41000);
  // Run to target position with set speed and acceleration/deceleration:
  stepper.runToPosition();

  delay(1000);}
//**********************************************
 while (detection==0) {       // si capteur sec moteur tourne sens horaire
   detection=digitalRead(capteur);
    
  // Revient à zéro:
  stepper.moveTo(0);
  stepper.runToPosition();

  delay(1000);
 }
 }

Bonjour Epicduino,

L'instruction 'runToPosition()' est une fonction bloquante.

Cela veut dire que tu n'auras pas la possibilité de détecter d'autres commandes durant tout le déplacement (bouton poussoir, switch, capteur autre...).

Donc lorsque tu lancerais l'ouverture ou la fermeture de la toile, l'action ne pourra plus être interrompue.

Bonjour Zlika, ok merci je prend note de l’instruction , j’ai tout branché sur batterie de voiture couplé à un panneau solaire, si vraiment il y aurai un souci durant la monté ou la descente je peux débrancher la pince de la batterie.