Compter les tours d’un axe avec un fin de course

Un petit montage avec lequel on va pouvoir contrôler le nombre de rotations d’un axe ; on va même pouvoir contrôler le nombre de quart de tours !

Le montage est adapté à des axes tournant à des vitesses faibles et reliés à des moteurs à faible inertie. Dans ces conditions, il offre une précision tout à fait satisfaisante.

Presque un moteur pas à pas 🙂 !

Pour ceux qui ont besoin d’un compte-tours, en voici un ici à base de fourche optique.

Voilà un modèle (construction très inspirée par un modèle de Willy) qui utilise les fonctions ci-dessous pour contrôler la montée et la descente de la benne.



/*
   Compte-tours avec fdc
    
       
 */
int FDC = 2; // fdc relié à la pin 2 
 
int E1 = 5; //M1 Controle de vitesse PWM
 
int M1 = 4; //M1 Controle du sens de rotation
 
int APPUI = 0; // sur ce fdc appui = etat bas
 
void marche_avant(char a) //Marche avant
{
  analogWrite (E1,a); // PWM (reglage vitesse)
  digitalWrite(M1,HIGH); // sens de rotation
} 
 
void marche_arriere (char a) //Marche arrière
{
  analogWrite (E1,a); // PWM (reglage vitesse)
  digitalWrite(M1,LOW); // sens de rotation
}

void stop_moteur () 
{
  analogWrite (E1,0); // PWM (reglage vitesse)
  delay(100);
}
 
 
/////////////////////////////////////////////////////////////////////
void marche_nb_pas( int vitesse, int nb_pas, char sens)
/////////////////////////////////////////////////////////////////////

{
// une poulie porte des plots
// qd le plot touche le fdc
// on compte les changements d'etat
// de la pin reliée
// pour un plot appuyé,
// deux changements d'état


boolean etat_fdc = false;

boolean etat_fdc_precedent = false ;

int chgt_fdc = 0 ;

int nb_top = 0;


// lancer le moteur

 if (sens == 'A') {
      marche_avant (vitesse);
     }
     
 if (sens == 'R') {
      marche_arriere (vitesse);
     }
     


while ( nb_top < nb_pas  ) {
  
      
 etat_fdc = 0;
  
 if (digitalRead(FDC) == APPUI) {     
    
      delay(5);     
        
      etat_fdc = 1;
            
 }             
 
  
   // est-ce qu'on a changé d'état ?
  
   if ( etat_fdc != etat_fdc_precedent ) {
     
       chgt_fdc++;
   }
   
  
   
   // 1 passage de plot entraine
   // 2 changements d'état
     
    nb_top = chgt_fdc / 2;
    
    //Serial.print ("*************** nb_top : ");
    
   // Serial.println(nb_top);
    
    etat_fdc_precedent= etat_fdc;     
     
  }     
 

stop_moteur();
}
 
 
 
 
// Executee une seule fois
 
void setup() {
   
   // initialiser la communication serie
    
   Serial.begin(9600);
    
   pinMode(E1, OUTPUT); // E1 est utilisee en sortie
    
   pinMode(M1, OUTPUT); // M1 est utilisee en sortie
   
   pinMode(FDC,INPUT); // fin de course relié pin 2
   
   // ici on n'active pas la resistance pull-up interne 
   //  on utilise un crash sensor DFRobot
   // qui est  FDC avec resistance de rappel intégrée
   // et resistance de protection intégrée
   // modèles utilisés :
   // SEN0138-L et SEN0138-R
  
}
 
// executee en boucle
 
void loop() {
  
    
   Serial.println("On avance de 4 pas");
   
   marche_nb_pas(200,4,'A');
   
   delay(3000);
    
   
  Serial.println("On recule d'un pas");
   
   marche_nb_pas(200,1,'R');
   
   delay(3000);
   
  
  Serial.println("On recule de 3 pas");
   
   marche_nb_pas(200,3,'R');    
    
   delay(3000);
}