Go Down

Topic: Capteur anémomètre (Read 1 time) previous topic - next topic

Rhestti

Sep 17, 2017, 09:12 pm Last Edit: Sep 17, 2017, 10:31 pm by Rhestti

Bonjour,

Je souhaite utiliser un capteur anémomètre avec une carte Arduino UNO + une platine Shield Grove acheté chez Lextronic (https://www.lextronic.fr/P36218-capteur-annomtre.html).

J'ai trouvé sur Internet un code qui permet d'afficher la vitesse du vent en m/s dans le moniteur. J'ai retravaillé ce code pour qu'il m'affiche uniquement le nombre de tours fait par les coupelles en 1 minute (ce dont j'ai besoin). Par contre, il n'affiche aucune valeur dans le moniteur (il affiche "Vitesse de rotation = inf tr/min"). Le câble est branché sur la borne D2 du shield (comme sur le site du vendeur). Je dois sûrement louper quelque chose. Pourriez-vous me dire quoi vu que je suis débutant avec Arduino.

Merci pour votre aide



Code: [Select]
#define pinANEMO 2


void setup()
{
  pinMode(pinANEMO, INPUT);
  Serial.begin(9600);
}
 
unsigned long millis_old(0);
float deltaTime(0);
float NombreTourSec(0);

bool isActive(false);
 

void loop()
{
    UpdateANEMO();
   
    //convertion periode -> fréquence
    NombreTourSec = (1/deltaTime);
   
    //affichage de la vitesse
    Serial.print("Vitesse de rotation = ");
    Serial.print(NombreTourSec);
    Serial.print(" tr/min\r\n");
}


void UpdateANEMO()
{
    //lecture du capteur
    isActive = digitalRead(pinANEMO);
 
    if(isActive)
    {
        deltaTime = (millis() - millis_old) /1000 ; // div en 1000 pour avoir le résultat en seconde
        millis_old = millis(); // remise à 0 du compteur pour capturer la différence de temps au prochain tour
    }
}



Rhestti

Merci pour votre réponse. Pouvez-vous m'écrire ce que je dois modifier dans le programme pour corriger ceci car j'avoue être un peu perdu.

Merci beaucoup

kamill

#2
Sep 18, 2017, 03:22 pm Last Edit: Sep 18, 2017, 03:29 pm by kamill
Bonjour,

Dans UpdateANEMO, il ne faut pas tester l'état de l'entrée, mais le changement d'état.


Code: [Select]
void UpdateANEMO()
{
 static byte etatPrecedent=LOW;
 //lecture du capteur
 byte etat = digitalRead(pinANEMO);

 if (etat && etat!=etatPrecedent)
 {
   deltaTime = (millis() - millis_old) / 1000.0 ; // div en 1000 pour avoir le résultat en seconde
   millis_old = millis(); // remise à 0 du compteur pour capturer la différence de temps au prochain tour
 }
 etatPrecedent=etat;
}


Comme tu fais la mesure dans la loop, tu ne vas obtenir des résultats corrects acceptables que pour les faibles vitesses. Tu dois utiliser une interruption pour la mesure de durée.

De plus tu calcules la vitesse en tr/s et à l'affichage tu dis que c'est des tr/min
    Serial.print(NombreTourSec);
    Serial.print(" tr/min\r\n");

Rhestti

Merci beaucoup pour l'aide. Le programme fonctionne. C'est vrai que j'ai manqué de rigueur concernant l'affichage en tr/s et tr/min.

Possible d'avoir un dernier coup de main pour réaliser cette interruption pour la mesure de durée ? Je suis vraiment novice dans ce domaine.

kamill

Tu peux essayer ça
Code: [Select]
#define pinANEMO 2

void setup()
{
 Serial.begin(9600);
 pinMode(pinANEMO, INPUT);
 attachInterrupt(digitalPinToInterrupt(pinANEMO), itAnemo, RISING);
}

unsigned long periode;
bool flagMesure=true;

void loop()
{
 if (flagMesure)
 {
   //convertion periode -> fréquence
   float nombreTourSec = 1000.0 / periode;
   flagMesure=false;

   //affichage de la vitesse
   Serial.print("Vitesse de rotation = ");
   Serial.print(nombreTourSec);
   Serial.print(" tr/s\r\n");
 }
}

void itAnemo()
{
 static unsigned long timeStart=0;
 unsigned long timeCur=millis();
 periode=timeCur-timeStart;
 timeStart=timeCur;
 flagMesure=true;
}

Rhestti

Le code précédent fonctionne mieux. Celui-ci donne des valeurs assez aléatoires. Mais, ce n'est pas grave car je suis déjà très satisfait que l'autre fonctionne. Merci kamill.

kamill

#6
Sep 19, 2017, 08:16 am Last Edit: Sep 19, 2017, 08:48 am by kamill
Le dernier programme devrait donner des valeurs beaucoup plus stables.
Comment est ce que tu testes la stabilité?

La fréquence est de quel ordre?
Si la fréquence est supérieure à 10 ou 20 Hz tu peux utiliser micros() à la place de millis() pour avoir une meilleure résolution.

Rhestti

Je fais tourner l'anémomètre grâce à un ventilateur et j'ai un anémomètre manuel digital pour contrôler la vitesse. Celui-ci m'affiche une vitesse de 11,5 km/h donc je devrais trouver des valeurs autours de 7,3 tours/s. Voici ce que le moniteur série affiche :

Vitesse de rotation = 20.00 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.42 tr/s
Vitesse de rotation = 22.73 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.99 tr/s
Vitesse de rotation = 20.41 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.42 tr/s
Vitesse de rotation = 23.26 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.87 tr/s
Vitesse de rotation = 20.41 tr/s
Vitesse de rotation = inf tr/s
Vitesse de rotation = 10.64 tr/s
Vitesse de rotation = 22.73 tr/s


Concernant la fréquence, de quelle fréquence parles-tu ? Ma carte arduino est branché sur mon PC sur le câble USB.

Avec micros() à la place de millis(), voici ce que le moniteur affiche :

Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 25.00 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 125.00 tr/s
Vitesse de rotation = 22.73 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 25.00 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.03 tr/s
Vitesse de rotation = 0.01 tr/s
Vitesse de rotation = 0.02 tr/s
Vitesse de rotation = 0.01 tr/s

Je dois sûrement louper des trucs ... Merci pour ta patiente  ;)

kamill

C'est extrêmement bizarre.
Il y a bien un pullup sur l'entrée?

Rhestti

Le matériel et le câblage est exactement celui donné en exemple par le site de vente Lextronic :


https://www.lextronic.fr/P36218-capteur-annomtre.html


Donc je n'en sait pas plus sur le pullup.

kamill

Je n'ai pas trouvé de schéma, mais sur la photo on voit des résistances qui sont sans doute des pullups.

Dans le doute tu peux activer le pullup interne par
Code: [Select]
pinMode(pinANEMO, INPUT_PULLUP);

Rhestti

Avec le code pour activer le pullup interne (et millis() ou micros()), le moniteur affiche une seule ligne :

Vitesse de rotation = inf tr/s

Quel casse-tête ...


kamill

Je pense qu'il y a un problème hard.
Est ce que tu as essayé le programme de test donné sur la page de l'anémomètre, que tu as donnée dans ton post initial, en tournant à la main.

Rhestti

Oui je l'avais fait dès que j'avais reçu le matériel et je viens de le refaire à l'instant pour revérifier en faisant tourner les coupelles manuellement. Le LED 13 brille en fonction du contact.

kamill

Je viens de tester le programme que je t'ai proposé avec un générateur.
Il fonctionne parfaitement, ce qui me conforte dans l'idée qu'il doit y avoir un problème hard.

Go Up