Mesurer une fréquence avec un Arduino

Un G.B.F. (Générateur de basses fréquences) permet de délivrer un signal avec la fréquence désirée sous forme de sinusoïdes, de créneaux (signal carré), ou de triangles.

Nous allons ainsi envoyer un signal à l’Arduino. Celui-ci pourra ensuite mesurer la fréquence du signal d’entrée.

Il est conseillé de directement relier votre GBF à un oscilloscope afin d’obtenir une image en direct du signal que vous générez.

Nous utiliserons plus tard une fonction qui permet de détecter le temps d’état haut et/ou le temps d’état bas d’un signal. Nous devons donc générer un signal carré.

Sur le GBF, il suffit de presser le bouton ci-dessous :

Les entrées analogiques de l’Arduino ne peuvent recevoir que des tensions comprises entre 0V et +5V. Envoyer une valeur plus grande risque de détruire l’interface, voir la carte.
Il faut donc bien veiller à créer un signal électrique avec une amplitude inférieur ou égale à 5V.

De base, le GBF va créer un signal oscillant entre -5V et +5V. Il faut donc déplacer ce signal afin d’obtenir un signal oscillant entre 0V et +5V.
Le bouton Offset permet d’ajouter une composante continue à notre signal. Nous pouvons donc faire monter notre signal dans l’intervalle qui nous intéresse.

Le réglage de l’offset et de l’amplitude s’effectue de cette façon :
(il faut tirer le bouton de l’offset afin de modifier la composante continue).

Attention ! Avant de brancher votre Arduino au GBF, vérifiez que le signal ressemble à celui-ci sur l’oscilloscope :

 

Câblage :

 

PusleIn :

La commande PulseIn permet de mesurer la durée d’une pulsation. Il est ainsi possible de déterminer le temps sur une période de notre signal à un niveau logique 1 ou 0.
PulseIn nous retourne ensuite la durée de l’impulsion en microsecondes.

La syntaxe est la suivante :


pulseIn(pin, value)
pulseIn(pin, value, timeout)

Le premier paramètre permet de définir l’interface où vous souhaitez lire la durée de l’impulsion
Le second paramètre permet de définir si l’on souhaite mesurer la durée d’un état haut (HIGH) ou un état bas (LOW)
Le troisième paramètre permet de déterminer un temps d’attente en microsecondes avant la mesure d’une impulsion.

Code :

int Signal_GBF = A1; // Signal Analogique

void setup() {

// Configure le port série pour l'exemple
Serial.begin(9600);

// Met la broche de signal venant du GBF en entrée
pinMode(Signal_GBF, INPUT);
}

void loop() {

// Mesure la durée de l'impulsion haute (timeout par défaut de 1s)
noInterrupts();
unsigned long etat_haut = pulseIn(Signal_GBF, HIGH);
interrupts();

// Mesure la durée de l'impulsion basse (timeout par défaut de 1s)
noInterrupts();
unsigned long etat_bas = pulseIn(Signal_GBF, LOW);
interrupts();

// Calcul de la periode = etat haut + etat bas
long periode = (etat_bas + etat_haut);
// Calcul de la frequence = 1 / periode
long frequence = (1/ (periode*0.000001));
Serial.println("Duree etat haut : ");
Serial.print(etat_haut);
Serial.println("");
Serial.println("Duree etat bas : ");
Serial.print(etat_bas);
Serial.println("");
Serial.println("Periode : ");
Serial.print(periode);
Serial.println("");
Serial.println("Frequence : ");
Serial.print(frequence);
Serial.println(" Hz");
Serial.println("");

delay(1000);
}
Détecter fréquence depuis un GBF

 

3 commentaires

  1. Bonjour, n’étant pas un grand spécialiste et avant de me lancer, je voudrais savoir s’il est possible de récupérer les numéros composés sur une ligne téléphonique (DTMF) chaque chiffre étant composé de deux fréquences consécutives.
    C’est possible ? ou mon idée est débile !
    Merci.

Rejoignez la conversation

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.