Pour un petit projet je dois crée un tachymètre à l'aide d'un capteur a effet hall. Celui ci est alimenté entre 10 et 15V, je me demandais si je pouvais directement le brancher sur une pin digital sans risque ou si je devais mettre un diviseur de tension ?
Est ce que mon code vous parait correcte ?
Merci d'avance !
Carte : Arduino UNO
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=6; //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 UNO, je l'ai branché sur la pin 2, qui correspond à Interrupt 0
//la fonction rpm_counter sera appelée sur chaque front descendant (FALLING) de la pin 2
attachInterrupt(0, 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(0);
//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(0, rpm_counter, FALLING);
}
Bon j'ai essayé mon code aujourd’hui, le moniteur de série m'indique une vitesse de 500t/min au lieu de 200t/min. Même quand le signal n'est pas branché il continue à compter.
Bonjour,
que d'opérations sur une même ligne !
fais une seule opération par ligne
vérifie le résultat de la première ligne avec Serial.println()
puis la 2ème etc
cela te permettra de bien comprendre ce que tu fais ...
zenip:
Bon j'ai essayé mon code aujourd’hui, le moniteur de série m'indique une vitesse de 500t/min au lieu de 200t/min. Même quand le signal n'est pas branché il continue à compter.
Pouvez vous me donner une piste ?
Bonjour,
Je pense à deux choses à vérifier :
-1 Que le problème ne vient pas de "bruit parasite" récupéré sur l'entrée (mauvaise adaptation)
-2 Que le calcul est exact
D'abord vérifier que quand on fait varier la vitesse, le résultat change dans le même sens.
Ensuite effectivement vérifier le résultat pas à pas en sortant des valeurs intermédiaires.
Maintenant que signifie précisément "signal débranché" ??
Justement l'étape du calcul je ne l'ai pas bien compris.. Quand je dis que le signal n'est pas branché c'est que mon capteur n'est pas connecté au arduino.
Le calcul lui même a l'air correct.
Comme le dit trimarco232 il faut que tu affiches les valeurs intermédiaires et en particulier les valeurs mesurées rpmcount et millis() - timeold pour voir s'il n'y a pas un 'loup' quelquepart.
Dans ta loop évite de faire des attachInterrupt/detachiInterrupt. attach l'interruption dans le setup, un point c'est tout.
Merci pour vos réponses ! Je vais donc modifier mon code pour afficher les valeurs intermédiaires.
J'ai visualisé le signal du capteur à l'oscilloscope, il me donne un signal créneau si je met une pull-down entre sa sortie et la masse et il fait +15V d'amplitude. Est ce que je dois réduire cette tension avant de l'injecter dans l'arduino ?