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 : Sélectionner tout - Visualiser dans une fenêtre à part
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!