Moteur PAP et fin de course

Bonjour à toutes et tous

J'ai fait un programme avec des morceau glané sur internet et dans les livres, mais je bloque pour finaliser mon projet, je suis novice dans la programmation

Un moteur PAP, 2 LEDs rouge et verte, 1 bouton poussoir, et 1 fin de course, j'en prévois 2, carte mega 2560

1er appuis le moteur tourne de 270 et la LED verte s'allume (ou la rouge)
2eme appui le moteur tourne de 270 en sens inverse, la LED rouge s'allume et la verte s'éteint
En cas de coupure de courant le moteur se réinitialise et dépasse les limites que j'ai fixés
je voudrais mettre les fin de course pour couper le courant en cas de reinitialisation

J'ai réussi à connecter le fin de course mais il ne fonctionne que lors de la mise sous tension pas en cours de mouvement

je voudrais qu'il stoppe le moteur quelque soit la position ou le sens

Merci à vous

// LES DECLARATIONS
int bouton = 8;                           // pin 8  bouton poussoir
int valeur_bouton = 0;                    // variable pour enregistrer l'état du bouton
int valeur_precedante_bouton = 0;         // variable pour enregistrer l'ancien état du bouton
int led_rouge = 13;                       // pin 13 led rouge
int led_verte = 12;                       // pin 12 led verte
int compteur = 0;                         // variable du compteur
int fin_de_course_1 = 42;                 // pin 42 contact fin de course



#include <Stepper.h>

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


boolean premiereFois = false;
boolean premiereFois2 = false;


void setup() {
  pinMode(led_rouge, OUTPUT);            // pin en sortie
  pinMode(led_verte, OUTPUT);            // pin en sortie
  pinMode(bouton, INPUT);                // pin en entrée
  pinMode(fin_de_course_1, INPUT);       // pin en entrée


  moteur.setSpeed(16); // Vitesse 30 tours par minute
}



void loop() {

  boolean etatfincourse_1 = digitalRead(fin_de_course_1);    //lecture du contact fin de course



  //UN APPUI SUR LE BOUTON ALLUME UN NOUVEL APPUI SUR LE BOUTON ETEINT
  valeur_bouton = digitalRead(bouton);                        // interrogation du bouton poussoir, la valeur précédante est elle différente de la valeur l'actuelle?


  if (valeur_precedante_bouton != valeur_bouton) {
    if (valeur_bouton == HIGH) {
      compteur++;                     // On incrémente le compteur (+1 à chaque appui)


    }
  }
  valeur_precedante_bouton = valeur_bouton;                    // sauvegarder la valeur actuelle du bouton


  if (etatfincourse_1 == HIGH)                                //si contact fermé

    if (compteur % 2 == 0)                                       // on incrémente la variable compteur à chaque boucle
      // le signe %indique diviser voir tableau page 264, le résultat est soit pair (0) ou impair (1)
      // traduction du code: SI(compteur pair (0) ecrire digitalWrite(led_rouge,HIGH)
    { // SINON il est donc de (1) et dans ce cas c'est l'instruction digitalWrite(led_rouge, LOW)
      digitalWrite(led_rouge, HIGH);

      if (!premiereFois) {
        moteur.step(270);                                        // angle de rotation
        premiereFois = true;                                     // stop le moteur après la première phase
        premiereFois2 = false;                                   // initialise pour la phase 2

      }
    }

    else
      digitalWrite(led_rouge, LOW);


  if (compteur % 2 == 1)                                       // le signe %indique diviser voir tableau page 264, le résultat est soit pair (0) ou impair (1)
    // traduction du code: SI(compteur impair (1) ecrire digitalWrite(led_verte,HIGH)
    // SINON il est donc de (0) et dans ce cas c'est l'instruction digitalWrite(led_verte, LOW)


  {
    digitalWrite(led_verte, HIGH);

    if (!premiereFois2) {
      moteur.step(-270);                                       // angle de rotation
      premiereFois2 = true;                                    // stop le moteur après la deuxième phase
      premiereFois = false;                                    // initialise pour la phase 1

    }
  }

  else
    digitalWrite(led_verte, LOW);

}

Bonjour à toutes et tous

J'ai fait un programme avec des morceau glané sur internet et dans les livres, mais je bloque pour finaliser mon projet, je suis novice dans la programmation

Un moteur PAP, 2 LEDs rouge et verte, 1 bouton poussoir, et 1 fin de course, j'en prévois 2, carte mega 2560

1er appuis le moteur tourne de 270 et la LED verte s'allume (ou la rouge)
2eme appui le moteur tourne de 270 en sens inverse, la LED rouge s'allume et la verte s'éteint
En cas de coupure de courant le moteur se réinitialise et dépasse les limites que j'ai fixés
je voudrais mettre les fin de course pour couper le courant en cas de reinitialisation

J'ai réussi à connecter le fin de course mais il ne fonctionne que lors de la mise sous tension pas en cours de mouvement

je voudrais qu'il stoppe le moteur quelque soit la position ou le sens

Merci à vous

// LES DECLARATIONS
int bouton = 8;                           // pin 8  bouton poussoir
int valeur_bouton = 0;                    // variable pour enregistrer l'état du bouton
int valeur_precedante_bouton = 0;         // variable pour enregistrer l'ancien état du bouton
int led_rouge = 13;                       // pin 13 led rouge
int led_verte = 12;                       // pin 12 led verte
int compteur = 0;                         // variable du compteur
int fin_de_course_1 = 42;                 // pin 42 contact fin de course



#include <Stepper.h>

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


boolean premiereFois = false;
boolean premiereFois2 = false;


void setup() {
  pinMode(led_rouge, OUTPUT);            // pin en sortie
  pinMode(led_verte, OUTPUT);            // pin en sortie
  pinMode(bouton, INPUT);                // pin en entrée
  pinMode(fin_de_course_1, INPUT);       // pin en entrée


  moteur.setSpeed(16); // Vitesse 30 tours par minute
}



void loop() {

  boolean etatfincourse_1 = digitalRead(fin_de_course_1);    //lecture du contact fin de course



  //UN APPUI SUR LE BOUTON ALLUME UN NOUVEL APPUI SUR LE BOUTON ETEINT
  valeur_bouton = digitalRead(bouton);                        // interrogation du bouton poussoir, la valeur précédante est elle différente de la valeur l'actuelle?


  if (valeur_precedante_bouton != valeur_bouton) {
    if (valeur_bouton == HIGH) {
      compteur++;                     // On incrémente le compteur (+1 à chaque appui)


    }
  }
  valeur_precedante_bouton = valeur_bouton;                    // sauvegarder la valeur actuelle du bouton


  if (etatfincourse_1 == HIGH)                                //si contact fermé

    if (compteur % 2 == 0)                                       // on incrémente la variable compteur à chaque boucle
      // le signe %indique diviser voir tableau page 264, le résultat est soit pair (0) ou impair (1)
      // traduction du code: SI(compteur pair (0) ecrire digitalWrite(led_rouge,HIGH)
    { // SINON il est donc de (1) et dans ce cas c'est l'instruction digitalWrite(led_rouge, LOW)
      digitalWrite(led_rouge, HIGH);

      if (!premiereFois) {
        moteur.step(270);                                        // angle de rotation
        premiereFois = true;                                     // stop le moteur après la première phase
        premiereFois2 = false;                                   // initialise pour la phase 2

      }
    }

    else
      digitalWrite(led_rouge, LOW);


  if (compteur % 2 == 1)                                       // le signe %indique diviser voir tableau page 264, le résultat est soit pair (0) ou impair (1)
    // traduction du code: SI(compteur impair (1) ecrire digitalWrite(led_verte,HIGH)
    // SINON il est donc de (0) et dans ce cas c'est l'instruction digitalWrite(led_verte, LOW)


  {
    digitalWrite(led_verte, HIGH);

    if (!premiereFois2) {
      moteur.step(-270);                                       // angle de rotation
      premiereFois2 = true;                                    // stop le moteur après la deuxième phase
      premiereFois = false;                                    // initialise pour la phase 1

    }
  }

  else
    digitalWrite(led_verte, LOW);

}

Joel21560:
J'ai réussi à connecter le fin de course mais il ne fonctionne que lors de la mise sous tension pas en cours de mouvement

Bonsoir;

Je ne comprend pas cette phrase, desolé.

Pour moi, un fin de course doit être activé mécaniquement pour fonctionner, donc que veut dire "fonctionne à la mise sous tension"?

Ton fin de course, tel que tu l'a câble, intervient sur une entrée du module arduino, et non directement sur la commande du moteur, donc il intervient, selon ton code de programme, au minimum uniquement quand tu lis l'entrée associée au fin de course.
Tant que tu ne la lis pas pour éventuellement arrêter le moteur, le fin de course peut largement être dépassé.

D'autre part, selon ton montage mécanique, que nous ne voyons pas sur ton schéma, ton fin de course peut être activé soit momentanément juste au moment où le moteur dépasse le fin de course (pas avant, plus après).

Soit de manière plus "définitive", dés que et tant que tu dépasse le fin de course.

Ces 2 nuances peuvent avoir de l'importance, surtout si tu ne lis pas le fin de course pile au moment où il s'enclenche si tu a un montage "momentané"

Imagine que dans ton sketch, tu ordonne de faire 270°, que durant ce déplacement, tu dépasse le fin de course, donc il s'enclenche.
A la fin du pas, et seulement à la fin, tu lis l'état du fin de course, selon ton montage mécanique, il serrât activé ou non (s'il ne s'active que momentanément, si la fin du pas est loin derrière le fin de course, il serrât désactivé).

Autre point:
Un moteur pas à pas, à la mise sous tension, démarre de la position où il s'était arrêté lors de la coupure de courant.
Il n'a pas de calage sur une position 0, comme pourrait l'avoir un servo-moteur.

Donc quand tu fait des pas de 270°, tu ne sais pas à l'avance de où tu démarre par rapport à ton fin de course, si cela se trouve tu démarre par exemple de 5° avant le fin de course, et dés le premier pas tu est dans les choux loin derriére le fin de course.
Pour éviter cela, il faudrait rajouter une lecture même sommaire de la position pour savoir de où tu démarre pour éventuellement te rapprocher suffisamment du 0° et faire tes 270° sans tomber dans un fin de course.

Je n'apporte pas directement de solution, sauf sous formes de questions pouvant susciter des pistes de résolution du pb.

bonjour

merci de m'avoir répondu, je joins une vidéo du montage en action

phase d'initialisation puis mouvement aller et retour, pour l'instant il n'y a qu'1 fin de course

Lors de la phase d'initialisation si le capteur est fermé (appui de la palette) il ne se passe rien (normal)

Si la palette qui appuie sur le fin de course est ailleurs, le moteur va tourner et aller en buté forcer au risque de casser la pièce qui sera entraînée

S'il y a une coupure de courant et que la palette se trouve à mi-course de la butée, lorsque le courant sera rétabli le moteur sera en phase d'initialisation et tournera de 270 et viendra en force sur le fin de course

(En écrivant cette phrase je me rends compte qu'1 seul fin de course est nécessaire)

je cherche comment on peut lire l'état du fin de course en continu, et faire une fonction qui stoppera le moteur dès que le fin de course sera fermé

Joël

lien de la vidéo: Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

dans ton setup, tu déclare ton fin de course
un while digitalread(findecourse)=LOW en fonction du cablage
faire tourner le moteur de 1 pas

c'est tout
ca ira pas trop vite et ne cassera pas la machine

Merci
je vais mettre cela en place
Je reviens dés que c'est fait

Bonjour,

j'ai fait des essais avec la boucle while, mais cela ne correspond pas à ce que je cherche, car dès que le fin de course est HIGH le moteur se met à tourner sans arrêt

Ce que je voudrais faire c'est lire l'état du fin de course lors de la mise sous tension jusqu'à ce que son état soit HIGH pour stopper le moteur, puis l'ignorer jusqu'à la prochaine mise sous tension

Est-il possible de réaliser ce genre de programme?

Cdt
Joël

PS comment fait-on pour avoir des alertes de réponse

un while digitalread(findecourse)=LOW en fonction du cablage
faire tourner le moteur de 1 pas

Bonjour,

Mise sous tension, fin de course HIGH, le moteur ne tourne pas (ok)
mais dès que le fin de course est LOW (idem à la mise sous tension) je ne sort plus de la boucle lorsque le fin de course est HIGH

Bonjour,

J'ai suivi les conseils de PEPE, et ai repris l'ensemble de ce que je voulais faire
Cela fonctionne comme je le souhaite à un point près.
Pourquoi mon moteur fait une pose de: 1/2 à 1 seconde environ entre chaque boucle, alors que je ne relâche pas le bouton

/*
 * Bouton_rouge maintenu appuyé 
 * le moteur tourne en sens anti horaire par (pas de 10)
 * la led rouge clignote
 * quand arrive sur le fin_1 stoppe le moteur
 * allume la led_verte
 * bouton_noir maintenu appuyé
 * le moteur tourne en sens horaire par (pas de 10) 
 * la led rouge clignote
 * quand arrive sur le fin_2 stoppe le moteur
 * allume la led_rouge
 */

int led_rouge = 13;                       // pin 13 led rouge
int led_verte = 12;                       // pin 12 led verte
int fin_1 =42;
int fin_2 =44;
int bouton_noir=9;
int bouton_rouge=8;
int etat_bouton_noir;
int etat_bouton_rouge;
int etat_fin_1;
int etat_fin_2;



#include <Stepper.h>
//pour un moteur de 200 pas par tour et brancher sur les broches 2, 3, 4, 5
Stepper moteur(200, 5, 3, 4, 2);





void setup() {

 pinMode(led_rouge, OUTPUT);            // pin en sortie
 pinMode(led_verte, OUTPUT);            // pin en sortie
 pinMode(fin_1, INPUT);
 pinMode(fin_2, INPUT);
 pinMode (bouton_noir,INPUT);
 pinMode (bouton_rouge,INPUT);
 moteur.setSpeed(16);                    // Vitesse 30 tours par minute



}

void loop() {
boolean etat_fin_1 = digitalRead(fin_1);    //lecture du contact fin de course 1
boolean etat_fin_2 = digitalRead(fin_2);    //lecture du contact fin de course 2
boolean etat_bouton_noir = digitalRead(bouton_noir);
boolean etat_bouton_rouge = digitalRead(bouton_rouge);




if ((digitalRead(fin_1)==HIGH)&&        
     digitalRead(bouton_rouge)==HIGH)    
     { 
     
     moteur.step(10);
    

     }

if (digitalRead(fin_1)==LOW)
    {
    digitalWrite(led_verte, HIGH);
    digitalWrite(led_rouge, LOW);
   
    }



if
((digitalRead(fin_2)==HIGH)&&        
     digitalRead(bouton_noir)==HIGH)    
     {
 moteur.step(-10);
     

     }

if (digitalRead(fin_2)==LOW)
    {
    digitalWrite(led_verte, LOW);
    digitalWrite(led_rouge, HIGH);
   
    }
else if ((digitalRead(fin_1)==HIGH)&&
     digitalRead(fin_2)==HIGH)
     {
      digitalWrite(led_rouge,HIGH);
      delay(500);
      digitalWrite(led_rouge,LOW);
      delay(500);
     }
     
     }

Joël

Bonjour,

Je me permet de faire une remarque concernant ta dernière question. Tu as mis deux delay de 500 millisecondes vers la fin, çà ne viendrait pas d'ici la pose ?

[Résolu]