Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Tachymètre avec Arduino et ILS



  1. #1
    batoue74

    Question Tachymètre avec Arduino et ILS

    Bonjour à tous,
    je me fabrique un petit tachymètre avec un écran OLED I2C pour pouvoir compter mes tours de pédales en vélo (cadence). Pour cela j'utilise un capteur ILS en parallèle avec un condensateur pour filtrer les petits rebonds. Je compte le nombre de tours en 3sec pour y mettre en tours/min ensuite. La cadence est donc actualisée toutes les 3secondes.
    Cependant, mon programme ne fonctionne pas bien, le comptage ne se fait pas, est-ce que quelqu'un trouverait l'erreur?
    Code:
    #include <Wire.h> // librairie standard
    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #include <math.h>
    
      
      
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
     #define NUMFLAKES 10
    #define XPOS 0
    #define YPOS 1
    #define DELTAY 2
    #if (SSD1306_LCDHEIGHT != 64)
    
    #endif
    long vitesse = 0;
      
    long chrono = 0; // valeur courante du chrono
      
    long chrono_depart = 0; // valeur de départ du chrono
      
    long duree_test = 3000; // test sur 3 secondes
      
    long tour = 0; 
    const int bouton = 2;  
    
      int etatBouton;
    
    void setup () {
      Serial.begin(9600);
     display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x32)
    // init done
        pinMode(bouton, INPUT); //le bouton est une entrée
        
        
      
       display.display(); // show splashscreen
    delay(10);
    display.clearDisplay(); 
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(25,0);
    display.println("Vitesse TPM:   ");
    
      
      chrono_depart = millis();
     
    
        
    }
      
    void loop() {
      
      chrono = millis();
    tour=0;
       
    while(chrono - chrono_depart < duree_test){ 
      etatBouton = HIGH;
    etatBouton = digitalRead(bouton); 
    if(etatBouton == LOW) {
      tour++; // incrémente la variable
    }
    else {
    }
    }
       
      if (chrono - chrono_depart > duree_test) { 
     
        vitesse=tour*20;
        
      display.setTextSize(1);
    display.setTextColor(WHITE);
      display.setCursor(80,25);
    display.println(vitesse);
    display.display();   
       chrono_depart = millis(); 
      
      }     
      
    }
    Merci d'avance

    -----


  2. Publicité
  3. #2
    jiherve

    Re : Tachymètre avec Arduino et ILS

    Bonjour,
    Indentes correctement et oh merveille tu verras que cela ne fait pas ce que tu crois.
    Où est l' accolade fermante du premier while ?
    Ensuite il faut détecter un front et pas un état il faudra donc une variable supplémentaire pour detecter le changement sur etatBouton, un petit anti rebond logiciel ne sera pas superflu.
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    mag1

    Re : Tachymètre avec Arduino et ILS

    Bonjour,

    Je ne pratique pas l'arduino, mais le remplacement de ILS par un capteur Hall règlerait le problème des rebonds.

    MM
    Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...

  5. #4
    Yvan_Delaserge

    Re : Tachymètre avec Arduino et ILS

    J'essaierais comme ça:
    Code:
    void loop() {
      
      chrono = millis();
       
      etatBouton = digitalRead(bouton); 
        if(etatBouton == LOW && prevEtatBouton == HIGH) {
        dureeTour= millis - chrono_depart; //durée en millisecondes
        dureeTour = dureeTour / 3600000
        vitesse= perimetreRoue/dureeTour;
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(80,25);
        display.println(vitesse);
        display.display();
    
        prevEtatBouton == LOW; 
        chrono_depart = millis();
      }   
      
      if(etatBouton == HIGH && prevEtatBouton == LOW) {
        
       prevEtatBouton == HIGH 
       }
       
      }
    On observe à chaque tour de loop() l'état de l'ILS et quand il y a un changement de HIGH vers LOW, on mesure le temps qui s'est écoulé depuis la dernière transition HIGH vers LOW, c'est-à-dire le temps que dure un tour de roue en millisecondes. On divise le périmètre de la roue (en Km) par la durée d'un tour de roue (en heures) et on obtient la vitesse.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  6. #5
    Yvan_Delaserge

    Re : Tachymètre avec Arduino et ILS

    En fait, les routines display prennent un temps indéterminé et risquent de fausser la mesure. Il vaudrait mieux faire comme ça:
    Code:
    void loop() {
      
      chrono = millis();
       
      etatBouton = digitalRead(bouton); 
        if(etatBouton == LOW && prevEtatBouton == HIGH) {
        prevEtatBouton == LOW;
        dureeTour= millis - chrono_depart; //durée en millisecondes
        chrono_depart = millis();
        dureeTour = dureeTour / 3600000
        vitesse= perimetreRoue/dureeTour;
        display.setTextSize(1);
        display.setTextColor(WHITE);
        display.setCursor(80,25);
        display.println(vitesse);
        display.display();
    
         
        
      }   
      
      if(etatBouton == HIGH && prevEtatBouton == LOW) {
        
       prevEtatBouton == HIGH 
       }
       
      }
    Il ne faudra pas oublier de déclarer les variables prevEtatBouton, perimetreRoue, dureeTour.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  7. A voir en vidéo sur Futura
  8. #6
    jiherve

    Re : Tachymètre avec Arduino et ILS

    Re
    en fait la solution comme toujours est d'utiliser la fonction 'input capture' du Timer 1, c'est élémentaire en assembleur et comme cela fonctionne par interruption cela se contrefout royalement de ce que peu faire le µC en tache de fond.
    Le jour où l'immense majorité des utilisateurs aura quitté l'environnement arduichose resplendira la lumière!
    JR
    l'électronique c'est pas du vaudou!

  9. Publicité
  10. #7
    Yvan_Delaserge

    Re : Tachymètre avec Arduino et ILS

    En roulant à 30 Km /h un tour de roue va prendre environ 180 msec.

    Il faudrait savoir combien de temps prennent les routines d'affichage, parce que si on les appelle à intervalles trop courts, l'affichage va être perturbé.

    Si c'est bien le cas, on pourrait calculer une moyenne sur disons par exemple 15 tours de roue, ce qui fait environ 3 secondes et ne modifier l'affichage que toutes les 3 secondes.
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

  11. #8
    Yvan_Delaserge

    Re : Tachymètre avec Arduino et ILS

    Si on veut aller à l'exercice de style, on peut aussi utiliser une interruption, mais le nombre de lignes de code n'est pas beaucoup plus faible.
    ça donnerait quelque chose comme ça. A corriger éventuellement, je n'ai pas essayé de compiler.
    Code:
    const byte interruptPin = 2;
    volatile byte vitesse = 0;
    unsigned int i=0;
    
    void setup() {
      
      pinMode(interruptPin, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(interruptPin), timing , FALLING);
    }
    
    void loop() {
      if (i >= 1000000){  //on affiche une fois chaque 1000000 boucles
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(80,25);
          display.println(vitesse);
          display.display();
          i=0;
        }
        
       i++;
    }
    
    void timing() {
      dureeTour= millis - chrono_depart; //durée en millisecondes
      chrono_depart = millis();
      dureeTour = dureeTour / 3600000
      vitesse= perimetreRoue/dureeTour;
    }
    Un civet, un plat de côtes et puis, glissez-moi une petite paupiette avec.( Lino Ventura)

Sur le même thème :

Discussions similaires

  1. Tachymètre avec capteur à effet hall
    Par matheouss dans le forum Physique
    Réponses: 4
    Dernier message: 08/04/2017, 14h43
  2. isolation entre tachymètre et arduino
    Par idriss.mstge dans le forum Électronique
    Réponses: 16
    Dernier message: 27/07/2015, 18h26
  3. Alimenter un tachymètre ou un capteur de velo avec un dynamo
    Par FrancoisMino dans le forum Électronique
    Réponses: 8
    Dernier message: 04/03/2015, 21h00
  4. Communication arduino-arduino avec module Xbee
    Par TPESI22012 dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
  5. probleme avec tachymetre et asservisement d'un moteur
    Par mousaab dans le forum Électronique
    Réponses: 0
    Dernier message: 23/12/2010, 21h03