Le capteur :
J'ai utilisé ce capteur trouvé sur eBay pour 1,50€ :
Le moteur :
Pour ce premier test, j'ai pris un moteur 4,5V des années 70 appelé "Junior Power Drive Unit" ou plus simplement "Reversible 4,5V DC Motor". La notice d'origine indique une vitesse de 1000 tr/min, que je vais pouvoir vérifier maintenant.
Le montage :
Le montage est très simple : le moteur est alimenté par une batterie 12V à travers un abaisseur de tension pour arriver à sa tension nominale de 4,5V. Le capteur est placé devant la roue et est branché sur la carte Arduino (le shield moteur visible sur la photo n'est pas utilisé). Enfin, la carte est reliée à l'ordinateur par USB pour l'alimentation et l'envoi des données mesurées.
Le programme :
/*Code adapté de celui de CMPalmer :
* http://www.instructables.com/id/Arduino-Based-Optical-Tachometer/step4/Programming/
*/
volatile int rpmcount; //compte le nbre de fois où le faisceau du capteur optique est coupé
float rpm; //la variable qui va afficher le nombre de tours, et qui sera mise à jour dans le loop()
unsigned long timeold; //sert à enregistrer le temps écoulé depuis la dernière mise à jour du compteur
unsigned int nbTrous=8; //le nombre de trous dans la roue fixée sur l'arbre du moteur
void rpm_counter()
{
//A chaque rotation du moteur, cette fonction d'interruption est appelée [nbTrous] fois
rpmcount++; //on incrémente le compteur
}
void setup()
{
Serial.begin(9600); //initialisation de la liaison série
//la pin "out" du capteur doit être reliée sur une pin de l'arduino gérant les interruptions
//sur mon Arduino Mega 2560, je l'ai branché sur la pin 21, qui correspond à Interrupt 2
//voir http://arduino.cc/en/Reference/attachInterrupt pour plus d'infos sur les interruptions avec
//les pins associées suivant votre modèle de carte
//la fonction rpm_counter sera appelée sur chaque front descendant (FALLING) de la pin 21
attachInterrupt(2, rpm_counter, FALLING);
//initialisation des variables
rpmcount = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
//on met à jour le compteur toutes les 500 ms
delay(500);
//le traitement des interruptions est stoppé pendant les calculs
detachInterrupt(2);
//calcul du nombre de rotations par minute (rpm) :
//rpm = [nbre de rotations depuis le dernier calcul]/[temps écoulé en ms]*[60000ms(=1min)]/[nbre de trous]
rpm = (float)rpmcount/(millis() - timeold)*60000.0/nbTrous;
timeold = millis(); //on actualise timeold pour le prochain calcul
rpmcount = 0; //on remet à zero le compteur avant le prochain calcul
//on affiche la valeur sur le moniteur série
Serial.println(rpm);
//on rédemarre le traitement des interruptions
attachInterrupt(2, rpm_counter, FALLING);
}
Les résultats :
J'ai fait tourner le programme pendant 50s pour avoir 100 valeurs qui m'ont permis de tracer la courbe suivante :
La moyenne est de 1656,47 tr/min, soit largement plus que les 1000 tr/min indiqués dans la notice !
J'ai tester le programme et le montage sauf que les valeurs retournées par arduino sont fausses, j'ai pu vérifier avec un compte tour.
RépondreSupprimermerci c'est très important
RépondreSupprimerOK cool
RépondreSupprimerBonjour! J'ai testé votre programme la mais il affiche toujours une vitesse de 0.00
RépondreSupprimer