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
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
}
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
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
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
}
}