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
Je compte sur vous!
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); }
Partager