Compter les tours avec une fourche optique

Voici une variante qui utilise une roue encodeuse de 10 dents et une fourche optique (Voir Dfrobot SEN0038).

Ici pas de contrainte mécanique comme un fin de course peut poser, il n’y a pas de contact.

Pour des vitesses de rotations élevées, ce type de programme ne suffit pas, on perd des événements ; pour s’en sortir, il faut faire appel aux interruptions comme nous le verrons dans le prochain article.

Le programme est pratiquement le même :



/*
   Compte-tours avec fourche optique
   et roue encodeuse 10 dents
   DFrobot SEN0038
    
       
 */
int FO = 2; // fourche optique relié à la pin 2 
 
int E1 = 5; //M1 Controle de vitesse PWM
 
int M1 = 4; //M1 Controle du sens de rotation
 
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)
/////////////////////////////////////////////////////////////////////

{
// un axe comporte une roue
// encodeuse 
// 10 "dents" par roue
// on compte les changements d'etat
// de la pin reliée :
// pour une dent passée,
// deux changements d'état
// lumière=> pas de lumière
// pas de lumière => lumière

boolean etat_fo = false;

boolean etat_fo_precedent = false ;

int chgt_fo = 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_fo = 0;
  
 if (digitalRead(FO)) {       
        
      delay(5);
      
      etat_fo = 1;
            
 }             
 
  
   // est-ce qu'on a changé d'état ?
  
   if ( etat_fo != etat_fo_precedent ) {
     
       chgt_fo++;
   }
   
  
   
   // 1 passage de dent entraine
   // 2 changements d'état
     
    nb_top = chgt_fo / 2;
    
  //  Serial.print ("*************** nb_top : ");
    
   // Serial.println(nb_top);
    
    etat_fo_precedent= etat_fo;     
     
  }     
 

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(FO,INPUT); // fourche optique reliée pin 2
   
   
  
}
 
// executee en boucle
 
void loop() {
  
    
   Serial.println("On avance de 20 pas");
   // 10 pas = 1 tour
   
   marche_nb_pas(200,20,'A');
   
   delay(3000);
    
   
  Serial.println("On recule de 5  pas");
   
   marche_nb_pas(200,5,'R');
   
   delay(3000);
   
  
  Serial.println("On recule de 15 pas");
   
   marche_nb_pas(200,15,'R');    
    
  delay(3000);
}