• Post category:Fort
  • Post comments:0 commentaire
  • Post last modified:mars 13, 2022
  • Temps de lecture :9 min de lecture

Cycle de décélération, pause et accélération Moteur pas à pas bipolaire déclenché par 1 bouton avec un L298N et Arduino Uno *

Niveau APPRENTISSAGE :   Fort

 

    Prérequis :

Matériel :

  • 1 x Carte Arduino Uno
  • 1 x Bouton
  • 1 x L298N
  • 1 x Moteur PAP bipolaire
  • 1 x Alimentation 12v
  • Fils de connexion
  • 1 x Breadboard

Version IDE :

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

Code :

#include <Stepper.h>
//Nombre de pas par tour du moteur PAP
const int stepsPerRevolution = 200; 
//Le numéro de la broche du bouton stop
const int Boutonstop = 2; 
//Initialise le moteur PAP sur les broches 8 à 11 du L298N
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); 
//Vitesse max du moteur PAP
int Vitessemoteur = 200; 
//Temps d'accélération et deceleration du moteur.
int TpsAccDec = 30;
//Temps de pause du moteur en ms.
int Tpsdepause = 5000;

//Variable programme/////////////
int Etatvitessemoteur = 1;
int Etatmoteur = 0;
int Etatpause = 0;
int Etatboutonstop = 0;
unsigned long currentTime = 0;
unsigned long previousTime = 0;
unsigned long previousTime2 = 0;
/////////////////////////////////

void setup() {  
  pinMode(Boutonstop, INPUT_PULLUP);
  Etatmoteur = 1;
}

void loop() {
  //On récupére le nombre de millisecondes écoulées "millis()" depuis que la carte Arduino a commencé à exécuter le programme 
  //et on y stocke dans la variable "currenttime" qui sera utilisée pour TIMER1 "previousTime" et TIMER2 "previousTime2" aprés. 
  currentTime=millis();
  
  //Si détection appuie bouton "digitalRead(Boutonstop) == LOW" 
  //et que l'on n'a pas déjà lancer un cycle d'arrêt "Etatboutonstop == 0" grace au bouton.  
  //on demande arrêt du moteur "Etatmoteur = 0" et 
  //on bloque la détection appuie bouton "Etatboutonstop = 1" tant que le cycle n'est pas fini. 

  if (digitalRead(Boutonstop) == LOW && Etatboutonstop == 0) {
    Etatboutonstop = 1; 
    Etatmoteur = 0;
  }
  
  //On attend que le l'opération(TIMER1) currentTime-PreviousTime1 soit > "TpsAccDec" Temps d'Accélération décélération
  //Une fois le temps accélération décélération atteind "TpsAccDecde" :  
  //on récupére le nombre de millisecondes écoulées depuis que la carte Arduino a commencé à exécuter le programme "currenttime" et au stock dans "previoustime" pour mettre à jour notre TIMER1
  //Si on demande la marche du moteur "Etatmoteur = 1" 
  //et que sa vitesse "Etatvitessemoteur" < que la vitesse max "Vitessemoteur" 
  //alors on augmente sa vitesse de +1 "etatvitessemoteur++" 
  //Ou Si on a demandé l'arrêt du moteur "Etatmoteur = 0" 
  //et que sa vitesse "Etatvitessemoteur" > que la vitesse min "1" 
  //alors on diminue sa vitesse de -1 "Etatvitessemoteur-;

  //Ce cycle va se répéter à intervalles réguliers qui est = "TpsAccDec" tant que l'opération 
  //if(Etatmoteur == 1 && Etatvitessemoteur  Vitessemoteur) ou 
  //if(Etatmoteur == 0 && Etatvitessemoteur > 1) 
  //ne sera pas fini.
  
  if((currentTime-previousTime)>TpsAccDec){
    previousTime=currentTime;
    if(Etatmoteur == 1 && Etatvitessemoteur < Vitessemoteur){
      Etatvitessemoteur++;   
    }
    if(Etatmoteur == 0 && Etatvitessemoteur > 1){
      Etatvitessemoteur--;
    }
  }

  //Si une demande arrêt moteur est en cours "Etatmoteur == 0" 
  //et que sa vitesse est à l'arrêt "Etatvitessemoteur == 1" 
  //on met les sorties de L298N au repos pour pas que le moteur PAP et L298N chauffe 
  //On récupére le nombre de millisecondes écoulées depuis que la carte Arduino a commencé à exécuter le programme "currenttime" et a le stock dans "previousTime2" pour mettre à jour notre TIMER2 
  //On met alors le cycle en pause "Etatpause = 1" 
  //Et on attend que l'opération (TIMER2) currentTime-PreviousTime2 soit > "Tpsdepause" Tant de pause du moteur
  //Une fois le temps de pause écoulé on stop la pause "Etatpause = 0" 
  //On demande la marche du moteur "Etatmoteur = 1" 

  if(Etatmoteur == 0 && Etatvitessemoteur == 1){
    digitalWrite (8, LOW);
    digitalWrite (9, LOW);  
    digitalWrite (10, LOW);
    digitalWrite (11, LOW); 
    if(Etatpause == 0){
      previousTime2=currentTime;
    }
    Etatpause = 1; 
    if((currentTime-previousTime2)>Tpsdepause){
      Etatpause = 0;
      Etatmoteur = 1;
    }
  }
  
  //Si on est en demande de marche "Etatmoteur == 1 " 
  //Et que la vitesse du moteur "Etatvitessemoteur" == "Vitessemoteur" vitesse max 
  //Alors ont re autorise l'appui sur le bouton "Etatboutonstop = 0"
  
  if(Etatmoteur == 1 && Etatvitessemoteur == Vitessemoteur){
    Etatvitessemoteur = Vitessemoteur; 
    Etatboutonstop = 0; 
  }
  
  //Si la consigne de vitesse du moteur n'est pas nulle "etatvitessemoteur > 1" 
  //On envoie la vitesse du moteur au L298N "my Stepper.Set Speed(Etatvitessemoteur)"
  //Et on effectue un PAS sur le moteur PAP myStepper.step(1);
  if(Etatvitessemoteur > 1){
    myStepper.setSpeed(Etatvitessemoteur);
    myStepper.step(1);   
  }  
}

 


+ Infos sur le langage utilisé :

1. Fonctions
2. Variables
3. Stucture

 

Laisser un commentaire