Bonjour,
J'ai un souci avec mon programme qui consiste à faire tourner un moteur pas et j'ai la possibilité de mettre le programme en pause à l'aide d'un inter. Tout fonctionne, mais lors de mon interruption si le nombre de step_moteur est trop élévé (90000 par exemple: le moteur tourne sans aucune interruption pendant plusieurs heures), lorsqu'il revient sur la loop les moteurs ne tournent plus le temps d'un cycle.
Alors que si je mets 10000pas par exemple, ça fonctionne car le temps d'un cycle est plus court. mais j'ai un temps de pose entre chaque cycles et ça je ne veux pas.
Pouvez-vous me dire pourquoi lorsqu'il revient dans la loop après l'interruption, les moteurs ne tournent plus jusqu'à la fin du cycle?
Ci-joint mon programme:
#include <LiquidCrystal.h>
#include <time.h>
#define DELAY_PAS_MOTEUR 250
#define STEP_MOTEUR 10000 // (1/4 de pas selectioné sur le driver)
#define nbreCycles 9000
LiquidCrystal lcd(12,11,10,9,8,7); // affectation des pins de l'arduino pour l'ecran LCD
volatile const byte interruptPin = 2; // pin2 attribuer à l'interruption
const int bouton = A0; // attribution du bouton à la pin A0
const int boutonPause = 20; // attribution du bouton pause à la pin
const int led = 13; // attribution de la led pin 13
long cycle = 0;
int etatBouton; // variable bouton demarrage
int etatBoutonPause; // variable bouton pause
int M1dirpin = 3; // declaration pin 3 pour la direction du moteur 1
int M1steppin = 4; // declaration pin 4 pour l'activation des bobines du moteur1
int enable = 43; // pin43 active le enable du driver, pour eviter la consommation de courant à l'état delay du moteur1
int i;
void setup() {
Serial.begin(115200); //Initialise le moniteur serie
lcd.begin(16,2); //set up nombre de lignes et colonne ds l'afficheur
lcd.print("ON"); //affiche sur le LCD "cycles :"
pinMode(led,OUTPUT); // la pin 13 devient une sortie
pinMode(bouton,INPUT_PULLUP); // la pin 10 devient une entrée
etatBouton = HIGH; // on force l'entrée à l'état Haut
pinMode(boutonPause,INPUT_PULLUP); // la pin devient une entrée
etatBoutonPause = HIGH; // on force l'entrée à l'état Haut
attachInterrupt(digitalPinToInterrupt(boutonPause), Pause, LOW); //Interruption si le boutonPause est actionné, le programme s'interrompt
pinMode(M1dirpin,OUTPUT);
pinMode(M1steppin,OUTPUT);
pinMode(enable,OUTPUT);
digitalWrite (enable,HIGH); // a l'allumage, le pont en h est desactivé, le moteur ne consomme pas de courant
}
void disable_motors(){
digitalWrite (enable,HIGH);
}
void enable_motors(){
digitalWrite (enable,LOW);
}
void Pause(){
lcd.setCursor(0,1); // affiche sur la ligne 2 du LCD
lcd.print(" "); // efface le contenu de la ligne 2
lcd.setCursor(2,1); // affiche la ligne 2 du LCD
lcd.print("PAUSE "); // Dés que le boutonPause est actionner, le LCD affiche la valeur pause
disable_motors();
}
void loop(){
digitalWrite(led,HIGH); // la led est eteinte
disable_motors();
/*_______________________EN ATTENTE DU BOUTON_________________________*/
if(digitalRead(bouton) == LOW){ // Passe à la suite si le bouton est appuyé
/*____________________________________________________________________*/
digitalWrite(led,LOW); // la led s'allume
for (cycle = 0; cycle <nbreCycles; cycle++){ // le moteur tourne pour le nombre de cycles selectionnés
lcd.setCursor(0,1); // affiche sur la ligne 2 du LCD
lcd.print(" "); // efface le contenu de la ligne 2
lcd.setCursor(2,1); // affiche la ligne 2 du LCD
lcd.print("EN MARCHE");
enable_motors();
delayMicroseconds(2);
digitalWrite(M1dirpin,HIGH);
for(i=0;i<STEP_MOTEUR;i++){
digitalWrite(M1steppin,HIGH);
delayMicroseconds(2);
digitalWrite(M1steppin,LOW);
delayMicroseconds(DELAY_PAS_MOTEUR);
}
//disable_motors();
//delay(500);
}
}
}
merci pour votre aide