Générateur BF pour débutants


I - Avant-propos

Il s'agit de réaliser un petit générateur Basse Fréquence de Signaux Carrés.

J'ai réalisé ce petit appareil car j'avais besoin, pour un module de visualisation, de simuler le signal à fréquence variable fourni par un capteur d'analyse du taux de E85.

C'est un montage très simple à réaliser à partir d'une carte Arduino Nano car il est fait avec un "hard" relativement simple, et un "soft" peu complexe.

Toutefois, pour un débutant, ce projet peut être très intéressant, car il fait appel à toute une variété de fonctions de base du monde Arduino, principalement :

  • Recours à une Bibliothèque pour la gestion de l'affichage,

  • Appel d'une Fonction de calcul indépendante (sous-programme),

  • Utilisation d'une Interruption,

  • Utilisation de différentes structures de contrôle (if ... else ; switch ... case ; etc. ...),

  • Entrée Logique avec Filtrage numérique des parasites, et des rebonds du poussoir,

  • Utilisation d'une entrée Analogique avec mesure par Moyenne glissante.

Je me suis efforcé de rendre ce logiciel didactique et explicite, en le structurant au mieux, et en le commentant ligne par ligne.

II - Conception générale

Cet appareil délivre un signal carré d'amplitude 5V dont la fréquence peut varier de 31 Hz à 65.535 Hz.

Je n'ai pas pris cette plage de fréquence de manière arbitraire, ce sont les limites de la commande "tone" qui permet de générer une fréquence variable sur une sortie logique.

Le réglage de la fréquence se fait grâce à un potentiomètre, mais afin de pouvoir régler assez finement les fréquences désirées la totalité de la plage des fréquences est divisée en 4 gammes :

  • F1 : de 31 Hz à 600 Hz par pas de 1 Hz

  • F2 : de 585 Hz à 5700 Hz par pas de 5 Hz

  • F3 : de 4770 Hz à 15000 Hz par pas de 10 Hz

  • F4 : de 14,35 kHz à 65,5 kHz par pas de 50 Hz

En supplément une gamme nommée "tot" permet de balayer la totalité des fréquences avec un pas d'environ 64 Hz.

Enfin un 6ème état nommé "OFF" permet d'interrompre la génération de fréquence.

A la mise sous tension, après le défilement de "HELLO", qui indique que le générateur est opérationnel, l'appareil se met sur "OFF", en attente des réglages.

  • La commutation entre les 6 états décrits précédemment se fait par impulsions sur un bouton poussoir.

  • Un potentiomètre de 10 kOhm permet un réglage fin de la fréquence.

  • La visualisation est faite par un module numérique LED de 4 digits à 7 segments, piloté par des 74HC595.

Pour piloter facilement le module de visualisation, sans être obligé de concevoir un code fastidieux et complexe dit "de bas niveau", il faut télécharger une "bibliothèque", et l'appeler dans le logiciel.

C'est une pratique très courante dans le monde Arduino, où l'on trouve une multitude de bibliothèques pour piloter ou exploiter toutes sortes de périphériques (afficheurs, capteurs, actionneurs, ...)

  • Ce générateur BF peut être alimenté :

. Soit par la prise USB de la carte Nano,

. Soit par un adaptateur secteur délivrant une tension continue de 7 à 12 V.

Le hard étant très compact il peut être "packagé" dans un petit volume, dans mon cas une embase de vieux téléphone sans fil, mais si le but est de vous familiariser avec les cartes Arduino, vous pouvez en rester au stade maquette sur "planche à pain" !

III - Matériel

3 - 1 ) Schéma

Le schéma est relativement simple.

L'afficheur est un 4 Digits à LED piloté par un 74HC595.

Pour ne pas risquer de faire un court-circuit sur la sortie, on pourra insérer une résistance de 150 Ohm (pas représentée sur le schéma), sur la sortie D9.

IV - Logiciel

Le logiciel de ce petit appareil est bien commenté, mais pour ceux qui ne sont pas familiarisés avec les programmes Arduino (appelés "croquis") , sa structure est la suivante :

  • Une première partie commune où l'on trouve les ressources pour l'ensemble du programme : l'affectation des broches, la déclaration des variables Globales, l'appel des bibliothèques ...

  • Une Fonction "setup" où les Entrées/Sorties sont définies, et où se trouvent les instructions qui ne sont déroulées qu'une fois.

  • Une Fonction "loop" qui, comme son nom l'indique est une boucle parcourue sans fin, et qui contient la partie active principale du logiciel

  • Après la Fonction "loop", on peut trouver des Fonctions spécifiques (sous-programmes, Interruptions, ...), qui pourraient être aussi bien placées en début de programme, mais que l'on trouve habituellement en fin.

Je ne vais pas ci-après décrire en détail les commandes Arduino utilisées, dont vous trouverez facilement le détail sur des tutos internet Je donne juste la composition de ce petit logiciel pour que vous puissiez en tirer des enseignements pour vos propres projets

4 - 1 ) Parties en dehors des Fonctions Arduino (setup et loop)

- Appel et Configuration de la Bibliothèque "TridentTD_7Segs74HC595.h"

. On inclue la Bibliothèque,

. On affecte les sorties logiques (D5, D6, et D7) qui piloteront la visualisation,

. On configure la Bibliothèque.

- Déclaration des Variables Globales, qui peuvent être utilisées dans tout le logiciel.

Le rôle de ces variables est donné dans les commentaires du logiciel.

Outre l'entrée Analogique de lecture de la tension du potentiomètre et la sortie Logique qui délivrera le signal carré du générateur, on trouve les variables nécessaires au calcul de la moyenne pour lisser le réglage, la variable HYST (hystérésis) pour éviter l'instabilité de la consigne.

Il faut être vigilent au type et format de ces variables pour être sûr qu'elle pourront contenir les valeurs qui leur sont affectées.

La variable String TITRE_GAMME servira à afficher la chaîne de caractères du Titre de chaque Gamme.

Variables pour Interruption

L'entrée affectée au poussoir est traité par "Interruption", ce qui signifie qu'un appui sur le poussoir interrompt immédiatement le déroulement normal du logiciel pour exécuter une Fonction spécifique que nous verrons ultérieurement.

  • Affectation de la broche D2 : "POUSS".

  • "POUSSOIR" : état du poussoir, appuyé ou relâché.

  • "TOP_IT" : On note "l'heure" d'apparition de l'IT, cela servira pour confirmer l'évènement, en lisant ultérieurement l'état du poussoir, grâce à la variable paramétrique "APPUI".

Fonction de CALCUL de la Fréquence

Cette Fonction spécifique (dans le langage Arduino) est en fait un sous-programme déporté en fin de logiciel après "loop".

Son nom est "CALCUL", et son rôle est tout simplement de calculer la fréquence à générer et afficher.

Cette fréquence dépend de la position du potentiomètre donné par la variable globale MEMO, et de 2 paramètres, déclarés dans la Fonction CALCUL comme 2 variables Locales A et B, et qui recevront les valeurs numériques transmises lors des appels à cette Fonction depuis "loop".

Par exemple, quand on trouvera dans loop l'instruction : FREQUENCE = CALCUL (5, 585) ;

  • En respectant l'ordre : 5 sera affecté à A et 585 à B,

  • Et "FREQUENCE" prendra la valeur de "retour" (return) : donc la valeur de la variable Locale RESULT.

L'appel à une Fonction spécifique évite de dupliquer les formules de calcul dans tout le logiciel, rend le logiciel plus lisible, et facilite la maintenance (si besoin est, on ne modifie qu'une seule formule).

Fonction Interruption "APPUI_BOUTON"

La carte Nano ne comporte que 2 entrées logiques (D2, et D3) susceptibles de générer des interruptions.

En toute fin de programme on trouve une seconde Fonction spécifique qui traite l'interruption du logiciel provoquée par un appui sur le poussoir, et que j'ai nommée "APPUI_BOUTON".

Elle est de type "void" (sans renvoi de valeurs).

Cette Interruption doit avoir été déclarée et paramétrée dans le "setup".

Dans le cas présent, après confirmation de la validité de cette interruption (condition d'état après un bref laps de temps), cette fponction :

  • Note l'heure de la prise en compte,

  • Incrémente le changement de gamme du générateur.

4 - 2 ) Fonction Arduino "setup"

Cette Fonction Arduino n'est déroulée qu'une seule fois en début de programme :

  • On y définit si les broches précédemment affectées sont des Entrées ou des Sorties.

Remarque : J'ai paramétré l'entrée (D2) en "INPUT_PULLUP" pour profiter d'une résistance de pull-up présente dans la carte Arduino, ce qui évite de câbler une résistance physiquement dans le hard.

Pour pouvoir faire cela, il faut bien sûr que le poussoir fasse contact entre l'entrée et le 0V.

  • Il ne faut pas oublier de déclarer et de paramétrer la Fonction d'Interruption grâce à l'instruction "attachInterrupt()".

On peut choisir l'évènement qui déclenche l'IT : état, ou type de front (ici sur un front descendant, correspondant à un appui sur le poussoir).

  • Il ne faut pas non plus oublier d'initialiser les bibliothèques utilisées.

Ici : "my7SEGMENT.init() ;"

  • On y met les portions de programme à ne parcourir qu'à la mise sous tension.

Ici la Visu va dire "HELLO" en scrollé, puis se mettre en attente en indiquant "OFF".

4 - 3 ) Fonction Arduino "loop"

Boucle sans fin qui contient en général toute la substance du logiciel.

Dans ce programme les différentes sections sont les suivantes :

Calcul de la MOYENNE glissante

Afin de lisser la mesure de la tension potentiométrique prise en compte, on fait la MOYENNE sur des paquets de "NOMBRE" mesures.

Ce filtrage numérique diminue les instabilités de valeur et de temps, car la moyenne diminue l'influence des parasites, et l'augmentation du temps entre 2 moyennes temporise les éventuelles instabilités.

Hystérésis

Le principe est de ne prendre en compte une nouvelle consigne qu'à partir d'une certaine variation en comparaison de la valeur de la précédente consigne mémorisée "MEMO", pour éviter les instabilités quand la valeur mesurée est proche d'une transition d'échantillonnage.

Ici on n'a retenu qu'une hystérésis à la baisse de tension, pour pouvoir accéder aux dernières valeurs hautes de chaque gamme.

Caractéristiques de chaque Gamme de Fréquences

Pour chaque Gamme de Fréquence, cette partie donne l'intitulé de la Gamme, et les paramètres qui permettront le calcul des Fréquences de cette Gamme (en fonction de la position du potentiomètre).

Les paramètres a et b qui sont nécessaires pour chaque Gamme au calcul des fréquences, sont calculés en fonction des fréquences extrêmes et du pas désiré. Il est prévu un recoupement des gammes.

Suivant la valeur de la variable "GAMME" qui est donnée par le sous-programme d'Interruption (qui fait défiler les gammes à chaque pression sur le bouton), on transmet à la Fonction CALCUL les paramètres (a et b) à prendre en compte.

La prise en compte des informations relatives à la gamme choisie se fait grâce à l'instruction de contrôle "switch ... case ... break".

  • La variable FREQUENCE prendra la valeur du résultat retourné par la Fonction CALCUL.

  • La désignation de la gamme choisie sera transmise à la gestion de l'afficheur.

Visualisation du Titre de la Gamme choisie

  • Le Titre de la Gamme est affiché à chaque changement de gamme pendant "TEMPO_VISU" millisecondes.

  • La position OFF est visualisée en permanence.

Visualisation de la FREQUENCE réglée

Dans cette partie (le "else" du "if" d'affichage du Titre) :

  • On traite le cas du Générateur en attente sur OFF.

  • Pour l'affichage de la Fréquence, comme on est limité à 4 digits, on affiche des kHz quand la Fréquence dépasse 9999 Hz (division par 1000, et gestion de la virgule).

Pilotage de la Sortie du Générateur

Tout le principe de ce Générateur repose sur l'instruction "tone()" qui permet de générer grâce à un timer auxiliaire des signaux carrés 5V et de rapport cyclique 0,5 dans une plage de fréquence qui va de 31 Hz à 65.535 Hz.

Compte-tenu du temps de parcours de "loop", on serait très vite limité en fréquence pour générer un signal carré avec des instructions classiques : quelques kHz avec peu d'instructions, et à peine 80 Hz dans notre cas, où l'on pilote un afficheur.

Etant donnée la puissance limitée du microcontrôleur, le signal généré par la fonction tone() est assez instable, car perturbé par des "blancs" surtouts gênants aux fréquences hautes.

Pour faire cesser une émission de fréquence permanente lancée par l'instruction "tone", il faut recourir à l'instruction "noTone()", utilisée ici quand on est en position OFF.

Logiciel

4 - 4 ) Codage

On pourra visualiser le code en cliquant sur le lien ci-dessous :

Logiciel Géné BF V4

Beau projet ! Merci pour le partage