Calcul de vitesse de rotation avec capteur optique et arduino uno
Bonjour,
Je voudrais calculer la vitesse de rotation d'un disque fixé sur un arbre moteur avec un capteur optique. J'ai codé cela sur Arduino mais cela ne fonctionne pas. Je me suis aperçue que le problème vient de la fonction qui compte le nombre de tours du disque mais je ne vois pas comment le régler.
Voici mon code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
//capteur port OUT relié au pin2 de l'arduino
const int pinCapteur=2;//on utilise le pin 2 (avec arduino uno pin 2 ou 3 pour les interruptions)
// pour le pin2 l'interruption se fait sur le pin0
// Initialisation des variables
unsigned int Mesure; //variable qui compte le nombre de mesures
float trmin; // variable qui affichera la vitesse du disque en tour/min
unsigned long temps; //sert à déterminer le temps que met le disque pour réaliser exactement un tour
volatile int tour; //compte le nombre de tours du disque
const int n=100; //nombre de tours du disque avant de faire le calcul de vitesse
float dT;
void setup() {
Serial.begin(9600); //connection au port série
pinMode(pinCapteur, INPUT); //connection du capteur au pin2 de l'arduino
//Initialisation des variables
tour=0;
trmin=0;
Mesure=0;
temps=millis();
//on appelle la fonction NouveauTourInterrupt dès qu'il y a un changement d'état abscence(HIGH) vers présence(LOW) du trou du disque, c'est à dire dès que le disque fait exactement un tour
//attachInterrupt(interruption,fonction,mode)
attachInterrupt(0,nouveauTourInterrupt,FALLING);
}
void loop() {
// si il y a eu n tours du disque
if (tour >= n){
//on arrête l'interruption pendant le calcul
//detachInterrupt(0);
// trmin= (n* 60000)/ (temps écoulé pour faire n tours du disque en minute 1min=60 000ms
//entre temps2 et temps1 il y a eu exactement 1 tour
dT=millis()-temps;
trmin= ((unsigned long)60000*n)/(dT);
Mesure++;
Serial.print("Mesure:");
Serial.print(Mesure);
Serial.print("vitesse en tour/min: ");
Serial.println(trmin);
//Serial.print("nb de tours: ");
//Serial.println(tour);
//Serial.print("temps entre deux mesures en ms: ");
//Serial.println(dT);
//Réinitialisation du temps et du nombre de tours
temps=millis();
tour=0;
//on recommence les interruptions
attachInterrupt(0,nouveauTourInterrupt,FALLING);
}
}
//Dès qu'il y a 1 nouveau tour on appelle la fonction
void nouveauTourInterrupt() {
tour++;
//Serial.println(tour);
} |
Je compte sur vous!