Générateur Basse Fréquence de signaux carrés (5V)

Difficulté:

I - Avant-propos


Copie de l'article de mon Blog :

https://bernyblogvitara.blogspot.com/2020/01/generateur-bf-de-signaux-carres.html


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

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

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

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

- Le recours à une Bibliothèque pour la gestion de l'affichage,

- L'appel d'une Fonction indépendante (sous-programme),

- L'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 mesures par moyenne glissante. 

- Et enfin utilisation de l'instruction "tone()" ...


Ce montage basique pourra être amélioré, par exemple en concevant une sortie signal plus puissante et protégée, à amplitude de tension variable ; on pourra aussi modifier les gammes de fréquence pour améliorer la finesse du réglage, etc., ...

Cet article n'est surtout pas un tuto d'informaticien car je ne suis qu'un simple amateur autodidacte dans le domaine, ... cependant je me suis efforcé de rendre ce logiciel structuré et explicite, 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 0.05 kHz


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 du signal. 

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 dans chaque gamme.

- La visualisation est faite par un module numérique LED de 4 digits à 7 segments, dont les circuits pilotes sont 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 dans l'embase d'un 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 une "planche à pain" !


III - Hard

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 - Soft

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 fonction :
- 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.


4 - 4 ) Codage

On pourra visualiser et télécharger le code en cliquant sur le lien donné ci-dessous






&&&&&&&&&&&&&&&&&&&

Matériel :

Budget : Non défini

Fichiers :

Connecte-toi pour découvrir ce tuto
Rejoins une communauté de plus de 40 000 Makers français, découvre toutes leurs techniques et idées créatives et partage tes projets !

A découvrir :
Etape 1 : Photos

Sources :

https://bernyblogvitara.blogspot.com/2020/01/generateur-bf-de-signaux-carres.html


Ces tutoriels devraient vous plaire

Construire son Bartop Arcade de A à Z
Écran Tactile et Raspberry Pi
Comment fabriquer son filament pour imprimante 3D

Berny 4631

Suivre

Vues: 64
Mis en favoris: 0

Découvrez d'autres tutoriels de

Berny 4631

Utilisation des cartes Arduino Nano dans le domaine Automobile

Découvrez tous les tutoriels partagés sur Oui Are Makers

Powered by Oui Are Makers