Tachymetre : mesurer la vitesse d’un moteur avec un Arduino

Fichier hébergé par Archive-Host.com

Voici un tachymetre réalisé avec un Arduino Uno. Pour le monter je suis allé cherché des éléments déjà tous présents sur ce site, il a suffi de raccorder tout ça.

Pour rendre le tachymètre indépendant d’un PC, on a connecté un écran LCD. J’ai trouvé que le module DFR0063 (LCD1602) était très intéressant car pour afficher deux lignes de 16 caractères, 4 fils seulement sont nécessaires : le + le – et deux fils de signal.

Pour les branchements de l’écran, le schéma présenté sur le site de DFRobot ne correspond pas exactement à l’exemplaire d’écran LCD que j’ai sous la main (position de SCL et SDA inversée sur le schéma). Pour que cela marche, SDA doit être relié à l’entrée analogique 4 et SCL à l’entrée analogique 5. (Pour voir le nom des Pins regarder sur la face arrière de l’écran).

La partie signal de la fourche optique est reliée à la pin 2.

Voici le schéma de la fourche optique.

Il existe des fourches optiques prêtes à l’emploi, voir par exemple le kit DFrobot SEN0038, mis en oeuvre ici

Le sketch utilise les interruptions, pour plus d’informations voir le chapitre 5 de l’introduction Arduino.


// Tachymetre V0
 
 
#include <Wire.h> // librairie standard
#include <LiquidCrystal_I2C.h> // librairie à télécharger
 
// Parametrer l'adresse du LCD à 0x27 
// pour deux lignes de 16 caractères
 
LiquidCrystal_I2C lcd(0x27,16,2);  

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
 
volatile long nb_chgt = 0; // nb de changement etat Pin
 
// Gestion de l'interruption 0
 
void gere_int0() { 
    nb_chgt = nb_chgt + 1 ;  
}
 
void setup () {

   
   lcd.init();     // initialiser le lcd 
   lcd.backlight(); // allumer écran
   lcd.print("Vitesse trs/min :    "); // affichage fixe
    
  chrono_depart = millis();
 
// l'interruption zero correspond à la pin 2 
// on enregistre tous les changements d'état
   
  attachInterrupt(0,gere_int0,CHANGE); 
   
}
 
void loop() {
 
  chrono = millis();
 
// est-ce que le test est fini ?
   
  if (chrono - chrono_depart > duree_test) { 

   lcd.setCursor(0,1); // curseur début deuxième ligne
   lcd.print("    "); // effacer la mesure précédente
   lcd.setCursor(0,1); // curseur début deuxième ligne    

  
   // la barre a deux extrémités on a donc
   // pour un tour les 4 états suivants :
   // pas de barre -> barre 
   // barre -> pas de barre
   // pas de barre -> barre
   // barre -> pas de barre
   // Il y a 4 donc changements d'état par tour

   // Mesure sur 3 secondes :
   // il faut multiplier le nb de chgt par 20
   // pour avoir le nb de changement par minute

   // Comme on a 4 changements d'état par tour
   // il suffit de multiplier par 5 le nb de chgt
   // mesuré sur 3 secondes
   // pour avoir le nombre de tours/min

   vitesse=nb_chgt*5;
   lcd.print(vitesse);            
    
   chrono_depart = millis(); 
   nb_chgt=0;
  }     
}

Pour que le résultat soit correct il faut que le dispositif qui tourne au milieu de la fourche optique (ici une barre meccano-elec trois trous dont on a bouché les deux trous libres) soit disposé avec soin et tourne bien rond.

Pour se donner une idée, un moteur « Richard » 6 vitesses alimenté en 12 V avec le rapport 1/6 tourne à environ 2000 tours/min.