CAPTEUR DE VITESSE

Bonjour ou re-bonjour à tous :slight_smile:
Alors j’ai crée un programme semblable à un capteur de vitesse :

       // DEFINITIONS DES VARIABLES
      
      const int CapteurDeLigne = 4;     
      
      int Tours = 0;
      
      int CapteurDeLigneState = 0;
 
      float Vitesse = 0.00;
      
      unsigned long Temps = 0.00;
      
      void setup() {
  
      pinMode(Tours, OUTPUT);          // LA VARIABLE "Tours" EST DEFINIE COMME SORTI D'INFO.      
      
      pinMode(Vitesse, OUTPUT);          // LA VARIABLE "Vitesse" EST DEFINIE COMME SORTI D'INFO.          
      
      pinMode(CapteurDeLigne, INPUT);          // LA VARIABLE "CapteurDeLigne" EST DEFINIE COMME ENTREE D'INFO.          
      
      Temps = micros();          //le nombre de millisecondes depuis que la carte Arduino a commencé à exécuter le programme courant.
      
      Serial.begin (9600);  
      
      }

      void loop(){
 
      CapteurDeLigneState = digitalRead(CapteurDeLigne);
      
      if (CapteurDeLigneState == LOW) {     
      
      Tours=Tours+1;
      
      Vitesse = 0.14*PI*Tours/Temps;} // Vitesse (en m/s) = 2 * pi * r * v (en tr/s) 
   
      else {
    
      Tours=Tours; 
      
      Vitesse = 0.14*PI*Tours/Temps;}
      
      Serial.print (Tours);
      
      Serial.print (" Tr "); 
     
      Serial.print (Vitesse);
      
      Serial.print (" m/s ");
      
      delay(1000);
      
      }

Alors si je place mon doigt devant le capteur de ligne, le nombre de tour augmente et par conséquent la vitesse augmente logique :P.
Mais une fois que j’enleve mon doigt le nombre de tours reste constant et la vitesse egalement. Voila le probleme : je place ce capteur sur une trottinette electrique : imaginons que ce véhicule est en pleine descente, (le morceaux de scotch noir qui remplacera mon doigt passera plus rapidement devant le capteur pour atteindre par exemple 95 Tours et une vitesse de 1m/s. Maintenant la trotinette roule sur un fort dénivelé : la vitesse doit logiquement diminué mais mon programme ne se réinitialise pas et la vitesse afficher durant la descente s’afiche pendant le parcours du dénivlé. Je pense qu’en regardant le moniteur série en pièce jointe cela sera plus clair lol
Donc pour résumer je cherche une fonction qui pourrait reinitialiser et repeter mon programme a partir du void loop.

Doc1.docx (94.3 KB)

Bonjour, Lorsque tu détectes que tu viens de faire un tour, tu faits bien tour +1 mais tu ne calcules pas le delta temps donc tes calculs ne sont pas juste. Tu initialises Temps dans le setup et après plus rien -> cherche de ce côté ;)

bonjour, déjà rien a faire dans le setup

      pinMode(Tours, OUTPUT);          // LA VARIABLE "Tours" EST DEFINIE COMME SORTI D'INFO.      
      
      pinMode(Vitesse, OUTPUT);          // LA VARIABLE "Vitesse" EST DEFINIE COMME SORTI D'INFO.

après tu mets

Vitesse = 0.14*PI*Tours/Temps;}

au lieu de

Vitesse = 0.14*PI*(Tours/Temps);}

et pour finir comme le dit Icare, pas de temps

Bon c'est pas super bien parti: En plus de ce qui à été dit plus haut

  • 1 - il faudrait éviter de mélanger les variables et les entrées/sorties. pinMode permet de définir une broche comme étant une entrée ou une sortie. Donc cela n'a rien à voir avec une variable.
  • 2 - if (CapteurDeLigneState == LOW) dans l'idée ce test détecte le passage de la bande sombre devant le capteur. Imaginons une minute que la roue ne tourne pas et que la bande noire soit devant le capteur. Tu vas incrémenter ton compteur en permanence (à chaque itération de la boucle de loop) alors que la roue est fixe. Donc le principe n'est pas bon. Il faut détecter les transitions, le passage du blanc au noir, et pas seulement la présence du noir.

Merci beaucoup pour vos conseils !! :D Alors jai essayé de remanier le programme avec vos idées enfin je fais du mieux que j'ai pu lol et je me suis aidé d'un exemple fourni par un membre du forum à savoir B@tto que je remerci :D:

const int CapteurDeLigne = 4;     
int Tours = 0;      
int CapteurDeLigneState = 0; 
float Vitesse = 0.00;
unsigned long TempsEcoule;
unsigned long RefTemps;
void setup() {
pinMode(CapteurDeLigne, INPUT);
Serial.begin (9600);  
while(digitalRead(CapteurDeLigne)!=0) ;
RefTemps=millis();
while(digitalRead(CapteurDeLigne)==0) ;
delay(1000);
}   
void loop(){
if(digitalRead(CapteurDeLigne)==LOW) {
TempsEcoule=millis()-RefTemps;
RefTemps=millis();   
Tours=Tours+1;
Vitesse = 0.14*PI*(Tours/TempsEcoule);}     
else {  
TempsEcoule=millis()-RefTemps;
RefTemps=millis();   
Tours=Tours; 
Vitesse = 0.14*PI*(Tours/TempsEcoule);}
Serial.print (Tours);
Serial.print (" Tr "); 
Serial.print (Vitesse);
Serial.print (" m/s ");
while(digitalRead(CapteurDeLigne)==0); // tant que le capteur n'est pas revenu à la normale on boucle
delay(1000);// à ajuster pour limiter les effets de rebond
}

mais ici le moniteur serie affiche les Tours mais pour la vitesse, elle est toujours égale à 0 :open_mouth:

C'est logique : Tours et TempsEcoule sont des entiers, donc la division se fait avec des entiers, et te rendra un nombre... entier.

fais comme dit plus haut par infobarquee

Bonjour Xavier et merci de ta reponse :D es-ce que tu veux dire par la que je dois definir les variable tour et temps comme étant des variables décimales avec float ?