PROBLEME MONITEUR SERIE

Bonjour à tous, dsl si ma question parait bete mais voila:
jai crée un programme qui compte les tours d’une roue pour ensuite calculer sa vitesse, tout cela à l’aide d’un capteur de ligne (et un ruban adhesif noir sur la roue)
Programme :

  // DEFINITIONS DES VARIABLES

      const int CapteurDeLigne = 4;     
      
      int Tours = 0;
      
      int CapteurDeLigneState = 0;
 
      double Vitesse = 0;
      
      int Temps;
      
      void setup() {
  
      pinMode(Tours, OUTPUT);      
  
      pinMode(CapteurDeLigne, INPUT);

      Serial.begin (9600);  

      }

      void loop(){
 
      CapteurDeLigneState = digitalRead(CapteurDeLigne);


      if (CapteurDeLigneState == LOW) {     
      
      Tours=Tours+1;  
      

      
      Vitesse = 0.140*PI*Tours/Temps;} // Vitesse (en m/s) = 2 * pi * r * v (en tr/min) 
   
      else {
    
      Tours=Tours; 

      Vitesse = 0.140*PI*Tours/Temps;
      
      }
      
      Serial.print (Tours);
      
      Serial.print (" Tr "); 
     
      Serial.print (Vitesse);
      
      Serial.print (" m/s ");

      delay(500);

      }

Or le moniteur serie m’affiche le nombre de tour mais pour la valeur de la vitesse il m’affiche “inf”
jai alors declarer la variable vitesse avec “double” puis “float” puisque ce sera une variable decimale mais cela m’affiche le mot “inf” je pense quil y a un probleme dans mon calcul (peut etre que je lai mal declarer ou que la syntaxe est fausse) jaurais bien besoin de votre aide lol.
Mon moniteur série est en piece jointe :slight_smile:

Doc2.docx (88.8 KB)

Bonjour, Ta variable Temps contient quoi comme valeur ?

Ah ouuuuui jai completement oublié, est-ce que cest juste au niveau de la syntaxe si je fait :

 if (CapteurDeLigneState == LOW) {     
      
      Tours=Tours+1;  
      Temps=millis();

      
      Vitesse = 0.140*PI*Tours/Temps;} // Vitesse (en m/s) = 2 * pi * r * v (en tr/min)

Re, Ta variable Temps doit contenir un delta temps correspondant à ton intervalle de mesure donc

Temps = millis();

ne sera pas corect. Par contre, il te faudrait quelque chose comme

Temps = tempsFin - tempsDebut;

Il va de soit que :

tempsDebut = millis();
tempsFin = millis();

Le tout placé au bon endroit @+

Le fait que tu obtiennes inf est normal : Temps n’est jamais affecté ! Donc Temps = 0 et diviser par zéro donne infini

L’algorythme que tu dois utiliser est :

setup :
initialisation des entrée/sorties
Tant que le capteur de ligne n’est pas à l’état bas on boucle
Prise de la référence temporelle ( <=> Temps=micros(); ou Temps=millis() )
Tant que le capteur de ligne est à l’état bas on boucle (on attend que le capteur revienne “à la normale”)

loop:

si capteur de roue est à l’état bas {
Calcul de la différence de temps
Capture de la nouvelle référence de temps
Calcul de la vitesse
On boucle tant que le capteur est à l’état bas
}

Merci beaucoup !!! Alors jai bien cogiter et jai finalement modifier mon programme voila ce que sa donne :

 // DEFINITIONS DES VARIABLES

      const int CapteurDeLigne = 4;     
      
      int Tours = 0;
      
      int CapteurDeLigneState = 0;

      float Vitesse = 0.00;
      
      float Temps = 0.00;
      
      float TempsI = 0.00;
      
      float TempsF = 0.00;
      
      void setup() {
  
      pinMode(Tours, OUTPUT);      
      
      pinMode(Vitesse, OUTPUT);
      
      pinMode(CapteurDeLigne, INPUT);
      
      Serial.begin (9600);  
      
      }

      void loop(){

      CapteurDeLigneState = digitalRead(CapteurDeLigne);
      
      TempsI = millis();

      if (CapteurDeLigneState == LOW) {     
      
      Tours=Tours+1;
      
      TempsF = millis();
      
      Temps = TempsI-TempsF;
      
      Vitesse = 0.14*PI*Tours/Temps;} // Vitesse (en m/s) = 2 * pi * r * v (en tr/min) 
   
     
   
      else {
    
      Tours=Tours; 
      
      TempsF = millis();
      
      Temps = TempsI-TempsF;
      
      Vitesse = 0.14*PI*Tours/Temps;}
      
      Serial.print (Tours);
      
      Serial.print (" Tr "); 
     
      Serial.print (Vitesse);
      
      Serial.print (" m/s ");
      
      delay(500);

      }

Je comprends pas trop comment definir ce temps (dsl jsuis debutant lol) et meme avec ces modifications jai toujours cette valeur infinie :/

Une nouvelle fois c’est normal … Suffit de comprendre ce qu’il passe :

En permanence tu boucles, donc TempsI = millis(); en permanence, et du coup dès que tu rentres dans ton if, tu fais TempsF = millis(); , l’execution de deux ligne de code comme ça ça prend largement moins d’une milliseconde donc Temps = TempsI-TempsF = 0

Suit mon algorithme …

Batto si tu pourrais me réespliquer ton algo psk je le comprends mal :/ merci mille fois lol

jai essayer avec le micros() :

/ DEFINITIONS DES VARIABLES

      const int CapteurDeLigne = 4;     
      
      int Tours = 0;
      
      int CapteurDeLigneState = 0;

      float Vitesse = 0.00;
      
      float Temps = 0.00;
      
      float TempsI = 0.00;
      
      float TempsF = 0.00;
      
      void setup() {
  
      pinMode(Tours, OUTPUT);      
      
      pinMode(Vitesse, OUTPUT);
      
      pinMode(CapteurDeLigne, INPUT);
      
      Serial.begin (9600);  
      
      }

      void loop(){

      CapteurDeLigneState = digitalRead(CapteurDeLigne);
      
      TempsI = micros();

      if (CapteurDeLigneState == LOW) {     
      
      Tours=Tours+1;
      
      TempsF = micros();
      
      Temps = TempsI - TempsF;
      
      Vitesse = 0.14*PI*Tours/Temps;} // Vitesse (en m/s) = 2 * pi * r * v (en tr/min) 
   
     
   
      else {
    
      Tours=Tours; 
      
      TempsF = micros();
      
      Temps = TempsI-TempsF;
      
      Vitesse = 0.14*PI*Tours/Temps;}
      
      Serial.print (Tours);
      
      Serial.print (" Tr "); 
     
      Serial.print (Vitesse);
      
      Serial.print (" m/s ");
      
      delay(1000);

      }

le moniteur serie maffiche maintenant des valeurs negatives pour la vitesse ...

Au hasard :
La variable Tours est déclarée en “int”, soit 2 octets avec le compilateur avr-gcc.
Ce qui veut dire qu’elle peut prendre toutes les valeurs entre -215 et +(215 -1) soit -32 768 à +32767
Si tu fait déborder l’int “Tours” tu obtiens +32767 +1 = -32768, ce qui pourrait expliquer une valeur négative de la vitesse .
Essaye avec un entier non signé pour voir.
Voir :
http://arduino.cc/en/Reference/Int

jai essayé avec byte rien y fait =( :astonished:

un byte c'est encore plus petit c'est stocké sur 8 bits.

unsigned long TempsEcoule,RefTemps;

void setup() {
  
      pinMode(Tours, OUTPUT);      
      pinMode(Vitesse, OUTPUT);
      pinMode(CapteurDeLigne, INPUT);
      
      Serial.begin (9600);  

// Sequence pour un "bon départ"
while(digitalRead(CapteurDeLigne)!=0) ; // on boucle tant qu'il n'y a pas de signal
RefTemps=micros(); // prise du temps de référence
 while(digitalRead(CapteurDeLigne)==0) ;  // tant que le capteur n'est pas revenu à la normale on boucle
delay(2);// à ajuster pour limiter les effets de rebond
      }

void loop() {

if(digitalRead(CapteurDeLigne)==0) {
TempsEcoule=micros()-RefTemps;
RefTemps=micros();
CalculVitesse();
while(digitalRead(CapteurDeLigne)==0); // tant que le capteur n'est pas revenu à la normale on boucle
delay(2);// à ajuster pour limiter les effets de rebond
}
}

Merci beaucoup B@tto :)