Compte tour éolienne ARDUINO

Bonjour à tous

Dans le cadre d'un projet scolaire je dois réaliser un compte tour à l'aide d'un capteur à effet Hall pour trouver la vitesse de rotation d'une éolienne pour l'afficher sur un écran LCD

Etant novice je bloque pas mal, je ne sais pas comment empêcher la valeur sur l’écran de trop varier rapidement, le "delay" stoppant le programme et donc le relevé du capteur...

J'ai pour le moment réalisé le montage suivant avec un bouton et un écran (voir photo jointe)

Le code est le suivant :

#include <LiquidCrystal.h>

LiquidCrystal lcd(11,10,5,4,3,2);
int pinBouton;
int A;
char message[16] = "";

void setup()
{
pinBouton = 8;
lcd.begin(16,2);
pinMode(pinBouton, INPUT);
}

void loop()
{
boolean etat = digitalRead(8);

if(etat==HIGH)
{A++;}

sprintf(message,"%2d tours",A);

lcd.home();

lcd.write(message);

delay(10);
}

Comment pourrais-je le perfectionner ?

Je vous remercie !

Bonjour,

Il faut que tu mesures la période ou la fréquence avec une interruption.
Tu relies ton capteur sur une entrée interruption et dans la routine d'interruption tu mesures ma période ou compte le nombre de tops (ou les deux).

  • dans ton programme int pinBouton n'est pas initialisé. Tu n'a pas besoin d'initialiser dynamiquement les constantes. Tu peux faire const int pinBouton=8;
  • mets des nom explicites pour tes variables (A c'est quoi)
  • ça me parait difficile de simuler ton capteur avec un poussoir

Mets ton code entre balises

Bonjour !

Merci pour vos réponses !

Pourriez vous m'indiquer la commande permettant de mesurer la période ? Là où je l'ai branché, est-ce une "entrée interruption" ?

merci! :slight_smile:

Il y a deux méthodes pour faire un compte tour

  • mesurer le nombre de tops par unité de temps
  • mesurer la période
    La première méthode donne une meilleur résolution pour les fréquences élevées, la deuxième pour les fréquences basses.

Quel est l'ordre de grandeur nombre de tr/min ou par s de l'éolienne.

Si vous choisissez de mesurer la période, une bonne solution est effectivement d'utiliser une entrée d'interruption.
Les interruptions utilisables sur l'arduino uno sont la pin 2 (interruption 0) et la pin 3 (interruption 1).
Les autres pins sont aussi utilisables en interruption, mais c'est un peu plus compliqué à mettre en oeuvre et ça offre moins de possibilités.

Re bonjour

on ne connais pas encore la vitesse de rotation de l'éolienne, mais je suppose que ce sera assez faible.
la méthode par période me parait donc plus adaptée, c'est bien ca ? :slight_smile:

Les pins 2 et 3 de mon arduino sont pour le moment utilisées par l'écran, c'est modifiable facilement ?

Et je mets quoi dans mon programme pour qu'il mesure cette fameuse période ?

merci!

Oui c'est modifiable. Tu déplaces le fil sur une autre pin et tu modifies ton programme pour prendre en compte la nouvelle pin.

Pour mesurer la période il y a de nombreux tutos sur le net par exemple ici

Je vous remercie pour votre aide

je ne vais pas avoir le temps de bosser ca tout de suite, je vous relance dès que j'y travaille!

merci encore!

Bonjour à tous !

A l'aide de vos tutoriels, j'ai écris le programme suivant (désolé je ne me souviens plus de la commande prévue à cet effet haha)

et voici le lien du montage virtuel : https://circuits.io/circuits/4147739-compte-tours/edit

#include <LiquidCrystal.h>

LiquidCrystal lcd(11,10,5,4,3,9);

const byte PIN_SIGNAL = 2;

volatile unsigned long periode = 0;

void tick(){

static unsigned long previousMicros = 0;

unsigned long currentMicros = micros();

periode = currentMicros - previousMicros;

previousMicros = currentMicros;

}

void setup(){

lcd.begin(16,2);

pinMode(PIN_SIGNAL, INPUT_PULLUP);

attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), tick, FALLING);

delay(500);

}

void loop(){

lcd.print(periode);

delay(50);

lcd.clear();

}

Mais tout d'abord je ne suis pas certain de bien comprendre ce qu'il fait.

De plus, afin de simuler un capteur à effet Hall envoyant un signal à une certaine fréquence, je pensais utiliser une pin de la carte afin d'envoyer à une certaine fréquence à une autre pin un signal simulant la rotation de l'éolienne.
Qu'en pensez vous ? Est-ce faisable ?

Merci!

Bonjour,

Mets ton code entre balises.

eolienneverticale:
De plus, afin de simuler un capteur à effet Hall envoyant un signal à une certaine fréquence, je pensais utiliser une pin de la carte afin d'envoyer à une certaine fréquence à une autre pin un signal simulant la rotation de l'éolienne.
Qu'en pensez vous ? Est-ce faisable ?

Oui, c'est faisable.

Bonjour à tous!

Voici mon code (avec la mesure de période et le générateur de signal périodique)

#include <LiquidCrystal.h>

LiquidCrystal lcd(11,10,5,4,3,9);

const byte PIN_SIGNAL = 2;

const int sortieAnalogique = 6;

volatile unsigned long periode = 0;


void tick(){
  
  static unsigned long previousMicros = 0;
  
  unsigned long currentMicros = micros();
 
  periode = currentMicros - previousMicros;  
 
  previousMicros = currentMicros;

}

void setup(){
  
  lcd.begin(16,2);
  
  pinMode(PIN_SIGNAL, INPUT_PULLUP);
  
  attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), tick, FALLING);
  
  pinMode(sortieAnalogique, OUTPUT);
  
  delay(500);
  
}

void loop(){ 

  analogWrite(sortieAnalogique, 50);
  
 lcd.print(periode);
  
 delay(50);
  
  lcd.clear();
  

   
}

Cependant, en reliant la broche 6 à la 2, l'écran lcd m'affiche une période de 1024, et ce quelle que soit la valeur de MLI que je rentre...

Une idée ?

merci!

Bonjour,

Et tu t'attends à avoir combien? La fréquence du pwm sur la pin 6 est d'environ 980Hz -> 1024 c'est bien la valeur attendue
Quand tu modifies le pwm, tu modifies le rapport cyclique et non la fréquence.

Il est possible de modifier la fréquence des pwm. Cherche "arduino change pwm frequency" sur google.

Effectivement pepe à raison, il ne faut pas utiliser le pwm sur la pin6 car il est géré par le timer0 comme micros(), donc quand tu vas modifier la fréquence du pwm tu vas aussi changer le timer pour micro().

Il faut utiliser les pin 9 ou 10 (timer 1) ou 3 ou 11 (timer 2) ou tone() comme prposé par _pepe-.

Par contre je ne suis pas d'accord, l'utilisation de micros() est satisfaisante et il est inutile d'accéder directement au compteur des timers, sauf si la résolution de micros() (4µs) n'était pas suffisante.

Bonjour,
le module capture de l'avr n'a-t-il pas été fait pour ce type de mesures, en proposant de + un filtre numérique ?

Même si tu lis directement le compteur du timer, tu es sujet au même phénomène. Si l'interruption horloge est en cours au moment ou tu dois lire de registre tu sera retardé de quelques µs voire quelques dizaines de µs.

On peut utiliser le mode ICP comme le suggère trimarco232, mais ça ne me semble pas vraiment utile et plus difficile à mettre en oeuvre.

De toute façon il est inutile de faire une mesure sur chaque période, pour moi la bonne solution est de mesurer n périodes, par exemple pour que ces n périodes soient supérieures à 200ms, ce qui fait que les quelques dizaines de micro-secondes de 'jitter' seront négligeables par rapport au temps total.

Bonjour

Voici mon code mis à jour (mesure de la période d'un signal pulsé par la carte UNO elle-même)

#include <LiquidCrystal.h>

LiquidCrystal lcd(11,10,5,4,3,9);

const int sortieAnalogique = 6;
int F;
int T;

const byte PIN_SIGNAL = 2;

volatile unsigned long periode = 0;


void tick() {
 
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  
  periode = currentMillis - previousMillis;
  
  previousMillis = currentMillis;
}

void setup(){
  
  pinMode(PIN_SIGNAL, INPUT_PULLUP);
  
  attachInterrupt(digitalPinToInterrupt(PIN_SIGNAL), tick, FALLING);
  
  lcd.begin(16,2);
  
  pinMode(sortieAnalogique, OUTPUT);
   
}

void loop(){ 
  
tone(sortieAnalogique, 50);
  
lcd.print(periode);
  
delay(500);
  
lcd.clear();

  
    }

Tout d'abord merci beaucoup pour votre aide qui m'a permis de mettre au point un programme fonctionnel.

Tout cela est mis en place dans le but de mesurer la fréquence de rotation d'une éolienne (je ne sais pas trop mais entre 25 et 100 tr/min, pas plus).

J'ai plusieurs questions :

Je remarque que tone() se semble pas capable de pulser des fréquences plus basses que 50 Hz, ou du moins le programme renvoie des valeurs de périodes incohérentes lorsque je rentre des fréquences plus basses. Normal ?

Ensuite, je ne parviens pas à transformer ma période en fréquence. J'ai besoin de passer ma période de ms à s, mais l'Arduino ne semble pas gérer les décimales...

Des idées ? Merci!

Dans la doc de tone(), il est indiqué que la fréquence mini est 31 Hz sur un uno

La fréquence c'est l'inverse de la période, il faut faire le calcul en flottant

   float frequence=1e6/periode; // 1e6 nombre de µs dans une seconde

Super ça marche du tonnerre merci beaucoup!

Pensez vous que ce programme sera aussi utilisable pour des fréquences beaucoup plus basses (de l'ordre de 1Hz) lors de l'installation réelle ?

oui, je pense que ça fonctionnera correctement.

Il faut aussi traiter le cas où l'éolienne est arrêtée (ou vitesse très basse)