Développement de PICOSYNTHÉ.

Agencer un synthétiseur polyvalent et convivial.

Bien que très facile à configurer en fréquence, le générateur étalon testé dans le programme n°12 n’est pas encore très opérationnel. L’affichage des deux paramètres QRG et PAS n’est facile à interpréter que pour des valeurs faibles. En revanche, pour des entités comme 1356894 sur un écran de dimensions aussi réduites, il devient délicat de faire la différence entre 135kHz et 1,35MHz. La lecture s’avère encore plus indigeste avec des valeurs telles que 20000000 pour lesquelles on doit compter les zéros pour estimer l’ordre de grandeur. Vous avez immédiatement compris que pour faire de PICOSYNTHÉ un appareil de mesures « professionnel », il faut impérativement en améliorer les formats d’affichage. Par ailleurs, la fonction ÉTALON DE FRÉQUENCE et loin de couvrir tous les besoins classiques en électronique. À nous les octets, les lignes de code et le plaisir de gaver des « 0 » et « 1 » dans ce merveilleux petit pavé électronique nommé ATmega328 …

Nouveau traitement du MENU de base.

L’expérience acquise au cours des travaux qui précèdent apporte forcément une moisson riche en idées, en pistes à explorer. En début de projet, le programmeur oriente ses actions vers des « standard » qui ont fait leurs preuves. Le source intègre des séquences propres, qui respectent les canons d’une structure logique bien définie. Par exemple le schéma de traitement de la boucle
de base des appareils actuel réalise un dichotomie entre « fonctions immédiates » et « fonctions bouclées ». Cette technique a conduit à des réalisations tout à fait satisfaisantes. Néanmoins, il n’est jamais négatif de remettre en cause un concept quel qu’il soit, pour oser envisager l’éventualité d’une évolution.
La direction que nous allons tenter de défricher part du principe que l’appareil en cours de développement ne comportera que des « fonctions bouclées » dont la Fig.27 présente l’organigramme d’une l’architecture que l’on va systématiser. Cette hypothèse est crédible, car contrairement à un multimètre sur lequel on change constamment de calibre et de fonction, sur un générateur de signaux on manipule généralement de façon moins « nomade ».
Le type d’activité impose le plus souvent une fonction « sédentaire », incluant plusieurs paramètres optionnels. Dans cette optique, chaque item du MENU de base aiguille le logiciel vers des fonctions bouclées. On peut alors grandement simplifier la boucle de base, comme présenté sur la Fig.28 dans laquelle on ne teste plus pour savoir si un B.P. a été utilisé. C’est forcément le cas, puisque la sortie en @ d’une OPTION n° N résulte d’un désir de passer à la précédente ou à la suivante. Par ailleurs, la sortie des « fonctions bouclées » se fait systématiquement sur des clics longs, ce choix étant imposé par une homogénéité dans le comportement de nos divers appareils dans le laboratoire. Il devient donc inutile dans la boucle de base de chercher à savoir si le clic est long ou court pour aiguiller le programme. Le code source de P13_NOUVELLE_STRUCTURE.ino permet d’examiner la simplification notable dans l’ossature de base. L’expérience semble montrer de plus, que l’on peut réduire la durée qui permet d’évaluer un clic long. Cette valeur passe de 0,8S à 0,5S étant bien entendu que chacun pourra la modifier à sa guise.

La première fonction du MENU de base.

Philosophiquement un concept n’est jamais idéal. Il résulte au mieux d’un compromis entre du positif et du négatif. Dans notre cas, il faut évaluer les avantages, les inconvénients. C’est le rapport entre ces deux entités qui apportera le critère objectif de décision : Soit on adopte la nouvelle direction, soit on persévère dans l’ancienne approche dont le rapport Qualité/Prix reste plus favorable. Comme seule la pratique peut aider à cette décision, dans les démonstrateurs qui vont suivre on va construire le logiciel avec l’approche « Tout en fonctions bouclées ».
Le vocable première induit « plusieurs », et plusieurs impose de « sélectionner ». Les fondations du programmes définitifs sont constituées par un « noyau de base » que l’on va compléter au fur et à mesure que de nouvelles possibilités viendront se greffer sur la souche initiale. Cette façon de faire appartient désormais à la routine. Le noyau logiciel initial P14_ETALON_de_FREQUENCE.ino intègre la gestion du menu de base et de l’écran de présentation. Pas de LOGO, le strict minimum pour créer l’ossature générale, on affinera éventuellement les fioritures plus tard. Chaque appel de fonction traitera son propre écran d’accueil. Allant au plus court, on commence la mise en place des routines de servitudes, à commencer par les procédures de formatage des affichages numériques. Si vous observez en détails la procédure de service void Affiche_VALEUR_avec_formatage() vous constaterez qu’elle a été épurée par rapport à son équivalente dans PICOLAB. (Son code mieux pensé, plus compact …)    Elle commence très mal cette page, j’ai le pressentiment qu’une salamandre va encore venir trainer dans le coin !
Poussez les manipulations, pour vérifier qu’en l’état, l’appareil est parfaitement fonctionnel, que son utilisation donne pleine satisfaction. À ce stade, changer de politique ne sera pas très pénalisant, il est donc préférable de chercher à vérifier que les protocoles mis en place se traduisent par un agrément d’utilisation patent. Vous noterez au passage, que les changements de fréquence ou de PAS sont moins rapides que dans les démonstrateurs précédents. C’est qu’avec les procédures actuelles devenus des outils de servitudes, l’afficheur OLED devant être rafraichi sur dix chiffres, sa lenteur relative pénalise un peu la célérité sans rendre pour autant la dynamique « léthargique ».
En ce qui me concerne, j’ai estimé que la convivialité actuelle était suffisante pour poursuivre le développement sur ces bases. Vous pouvez naturellement modifier librement le total à votre guise.

Une fonction génétiquement modifiée.

Examinons ensemble quelques subtilités de P14_ETALON_de_FREQUENCE.ino qui constitue le premier programme « complet » dans lequel est extrait P00_NOYAU_de_base.ino qui contient déjà l’ADN de toute la descendance. Charger le source dans l’éditeur de texte de l’environnement IDE. Le moins que l’on puisse dire à lecture du listage, c’est que ce programme est bitrange autant qu’ézare ! On devine immédiatement que chaque fonction du MENU et ses procédures seront « encadrées » par une ligne de remarque TITRE telle que (1) et un délimiteur de fin (3).

(1)      //————– Séquences relatives à la fonction ETALON_de_FREQUENCE ————
(2)     // Pas de séquence spécifique à cette fonction …
(3)     //—————————————————————————————–

Rien de bien nouveau en ce domaine. On classe les zones de code par catégories, par la nature typée des actions réalisées, celle des variables traitées. Ainsi, s’il faut modifier le comportement, les outils relatifs à un thème sont sans une zone bien délimitée. Ce qui attire le regard, c’est la ligne (2).

– Rien à voir … circulez !

Cette information nous signale que le programmeur ne s’est pas foulé et que par miracle l’ÉTALON DE FRÉQUENCE fonctionne sans code spécifique.
Hummmm, c’est suspect ça, c’est aussi miraculeux qu’une pommade anti-âge. (Surtout n’abusez pas de ces cosmétiques qui vous rajeunissent merveilleusement. À force d’en user vous serez tellement proche de votre naissance qu’il faudra remettre des couches !)

Poursuivons l’analyse de ce logiciel magique, et tout particulièrement détaillons sa boucle de base listée ci-dessous :

En (1) et (1)’ sont placés les classiques délimiteurs qui encadrent une séquence particulière. Nous observons du reste que la boucle de base loop ne comporte qu’une seule « action » : Gérer les deux B.P. du MENU de base. En (2) un clic sur FC+ fait avancer d’un Item. Notez au passage que l’on ne se préoccupe pas de savoir s’il est long ou court. Si l’incrément dépasse la liste possible des fonctions NB_Options, l’instruction (3) fait recycler à 1. En (4) un clic sur FC- fait reculer d’un Item dans le MENU de base. Si le décrément pointe en 0 qui est hors limites, la ligne (5) recycle au maximum actuel possible NB_Options. Puis, toujours de façon aussi banale, l’instruction (7) déclare les cas possibles. Pour pouvoir tester entièrement le « cheminement » entre plusieurs possibilités d’un MENU digne de ce nom, quatre Items sont prévus. Ceux de (8) à (10) orientent sur Fonction_provisoire qui ne fait rien de particulier mis à part réaliser un BIT sur un clic court ou ressortir en amont ou en aval sur un clic long. (// F.E. signifie Future Expansion.)

La magie se cache en ligne (7).

Première étrangeté : La variable booléenne MAJ_rapide. Une recherche exhaustive dans l’intégralité du listage montre qu’elle est forcée deux fois à false et jamais à True. Sa seule utilisation dans void Affiche_VALEUR_avec_formatage n’aura aucun effet, vu qu’elle est constamment à false.
Singulier non cette variable qui ne varie jamais ?
La réponse réside dans le prochain démonstrateur qui est à l’origine de l’organisation actuelle de ce premier programme « complet » qui prépare l’avenir. On va rapidement réaliser que contrairement à l’ÉTALON DE FRÉQUENCE, divers programmes vont travailler sur plusieurs fréquences. Nous aurons donc à initialiser plusieurs fois des valeurs caractéristiques pour le signal à synthétiser. C’est la raison qui a conduit à créer une routine de servitude Saisie_VALEUR(); qui se charge de cette mission. Entièrement autonome, elle devient intrinsèquement une fonction indépendante pour le premier Item du MENU de base. Ce tour de « passe passe » cache sa subtilité dans la procédure void Ecran_Saisie_VALEUR() qui dans le cas de l’ÉTALON DE FRÉQUENCE engendre un affichage adapté, sélectionné par le diagnostic if (Option_du_MENU == 1).

La fonction Générateur B.F ou H.F.

Elle s’apparente furieusement à la fonction ÉTALON_DE_FRÉQUENCE. Dans les deux cas on modifie manuellement la valeur de la fréquence du signal produit. Toutefois, dans certaines applications, l’ETALON_DE_FREQUENCE en l’état n’est pas adapté. Supposons que l’on désire ajuster la fréquence centrale d’un filtre passe bande à fenêtre étroite à caler sur 3000Hz. Sa bande passante électronique est de l’ordre de 400Hz. Le circuit électronique permet un ajustement entre 2500Hz et 3600Hz environ. Pour réaliser le calage, il suffit d’ajuster à 3000Hz le signal généré par l’ÉTALON_DE_FRÉQUENCE. On tourne le curseur du dispositif électronique jusqu’à ce que l’onde en sortie du filtre présente un amplitude maximale. Nous savons que la fonction de transfert d’un tel filtre présente l’allure d’une courbe en cloche de Gauss. Ce thème a été largement explicité dans les développements sur le chapitre Courbe en cloche de GAUSS.
Pour caler le filtre sur sa fréquence de passage, une onde constante convient parfaitement. Mais si l’on désire vérifier la performance d’un tel dispositif, qu’il soit passe bande, filtre haut ou filtre de coupure ne laissant passer que le spectre inférieur à sa limite, on va chercher à déterminer sa fonction de transfert. Tracée en violet sur la Fig.29 la manipulation consiste à déterminer l’amplitude du signal en sortie U en injectant en entrée une onde d’amplitude constante dont on ajuste la fréquence à « intervalles régulier » de parts et d’autre de la fréquence de centrage ou de coupure. Si on désire entre 16 ou 32 échantillons pour « tracer la courbe », imposer au générateur à chaque fois une fréquence devient rapidement une corvée sans nom.
En outre, entre la phase de dégrossissage du calage et celle de finition, un PAS de 40Hz, puis de 5Hz par exemple seraient préférables. Dans ce type d’application, il importe de définir les deux limites de balayage, puis d’en déduire le PAS en fonction du nombre d’échantillons désirés. Ce sera la mission de la deuxième fonction mise au point dans P15_GENERATEUR_BF_HF.ino réalisé à partir de P00_NOYAU_de_base.ino qui sert à développer chaque nouvelle fonction. Vous en connaissez le principe. Ce genre de programme minimal contient toutes les procédures et fonctions de servitudes au fur et à mesure qu’elles sont intégrées dans le programme complet. Les constantes et les variables globales sont également ajoutées.

Principe de la saisie d’une entité particulière.

Diverses fonctions vont exiger la saisie de valeurs telles qu’une fréquence ou un PAS. Par exemple la Fig.30 représente l’écran d’accueil à l’ouverture de  P15_GENERATEUR_BF_HF.ino avec des fréquences centrées sur 1000Hz. Les valeurs par défaut pour la plage balayée ont été choisies pour engendrer un pas de 20Hz. (On va voir plus avant qu’imposer de telles limites n’est pas si élémentaire qu’il n’y paraît.) À l’usage, il faudra forcément adapter ces limites en fonction du travail à réaliser. On va donc faire appel à la fonction void Saisie_VALEUR(). L’écran affiché à l’appel de saisie d’une option présentera l’aspect général de la Fig.31 qui fait apparaitre diverses informations. L’une des plus importantes pour rendre une saisie confortable réside dans le TITRE de l’encadrement jaune. Son texte définit la nature de la valeur en cours de saisie. La ligne bleue du haut affiche la valeur actuelle de la donnée. La ligne bleue du bas précise de combien sera incrémentée ou décrémentée la valeur quand on tourne le bouton du capteur rotatif. Le curseur désigne la
ligne qui sera modifiée si on tourne le bouton du capteur incrémental dans un sens ou dans l’autre. La procédure est donc identique à celle de l’utilisation de l’ÉTALON DE FRÉQUENCE, seuls les textes présentés à l’écran sont différents. La sortie d’une page de saisie de paramètre se fait avec un clic long, peu importe que ce soit avec FC+ ou FC- puisque dans les deux cas on passe soit à la page d’OPTION suivante ou on revient dans le mode Exploitation. Par exemple la Fig.32 montre la page de saisie de la limite supérieure. On est en train de consigner la valeur, FC+ multiplie cette dernière par 10, le bouton rotatif agit sur les centaines et FC- force les valeurs à 1 sur VAL et +/-.

Améliorer la rapidité du balayage en fréquence.

Observez sur la Fig.30 la belle rampe analogique qui situe visuellement la « position » de la fréquence du signal généré dans la plage définie par INF et SUP. Cette aide symbolique est très commode, on sait immédiatement si l’on est proche de l’une des bornes ou au contraire si l’on voisine avec le centre. Nous avons déjà constaté que rafraichir un tel ruban sur l’écran OLED impose au programme un temps d’exécution non dérisoire. S’ajoute celui nécessaire à la mise à jour simultanée de la valeur numérique QRG. Ces deux durées ajoutées l’une à l’autre rendent les changements de fréquences très poussifs. Pour balayer toute la plage, il faut prendre son mal en patience. Cette lenteur relative se traduit par une durée notable pour provoquer les 32 incréments ou décréments assurant le passage d’une limite à l’autre. Dans certaines applications, par exemple chercher la fréquence de résonnance d’un BUZZER, cette paresse rend l’appareil inutilisable. La solution est simple : Ne plus afficher QRG et ne plus tracer le ruban analogique. Quand l’appareil est calé sur la fréquence provoquant le son le plus fort, on revient au mode normal pour noter la valeur ajustée. L’opérateur se contentera de cliquer sur le bouton central du capteur rotatif pour basculer d’un mode à l’autre, PICOSYNTHÉ générant un BIT chaque fois que l’on cherche à déborder l’une des deux limites de la plage balayée. C’est  MAJ_rapide qui dans le programme gèrera le mode aveugle. Nous avons en main tous les éléments pour analyser les outils logiciels.

Analyse des outils logiciels de saisie des valeurs.

L’étude de void Saisie_VALEUR() de consignation d’une valeur quelconque montre clairement que la plage de valeurs acceptables correspond à celle des fréquences possibles du générateur AD9850 soit 1 à 60M. C’est le programme appelant qui sera éventuellement chargé de filtrer des zones indésirables. On se doute que c’est également le programme appelant qui précise la nature des textes à afficher. Détaillons par exemple la saisie de deux fréquences limites. Comme cette action risque fort de se produire dans plusieurs Items du MENU de base, elle est intégrée au sein d’une procédure de service :

x      void Saisie_frequences_INF_et_SUP() {
(1)       VAL_saisie = 1; Saisie_VALEUR(); Limite_INF = VALEUR;
(2)       VAL_saisie = 2; Saisie_VALEUR(); Limite_SUP = VALEUR;
(3)       Affiche_ecran_GENERATEUR_BF_HF(); MAJ_et_affichage_parametres();
(4)        Clic_long = false; Clic_sur_le_BP = false;}

Les lignes (1) et (2) ont une structure identique. Avant d’invoquer la saisie, la variable VAL_saisie est initialisée en fonction du texte à afficher dans le TITRE de l’encadré jaune. Puis il y a appel à la procédure void Saisie_VALEUR() qui laisse dans la variable globale VALEUR le résultat du paramètre modifié. Cette VALEUR est directement affectée sans filtrage à la variable globale Limite_INF puisque la plage maximale est valide. En ligne (3) on passe à la suite qui consiste à restituer l’écran de la fonction en cours puis inscrire aux bons emplacements toutes les données avec formatage. Ne pas oublier que la sortie de (2) laisse des variables critiques « armées ». Pour les neutraliser la ligne (4) annule deux booléens « de natures sensibles ».
L’organigramme de la Fig.33 décrit le comportement global de void Saisie_VALEUR() qui commence en (1) par « élargir » au maximum possible la valeur possible de modification du paramètre indexé. Puis, en (2) elle impose l’affichage numérique des paramètres, annulant un éventuel mode « aveugle en cours ». Donc, en sortie de consignation de données il y aura affichage d’une éventuelle rampe analogique et de diverses données numériques. En (3) l’écran spécifique à la page actuelle utilise la grandeur de VAL_saisie et affiche le titre associé. En (4) on évite une sortie prématurée de la boucle « Tant que non sortie désirée faire … ». En (5) on passe à la page suivante ou on retourne au programme appelant si dans (6) on a effectué un clic long sur l’un des deux boutons poussoir. Enfin en (6) on effectue les traitements tels qu’ils sont décrits dans la fonction P14_ETALON_de_FREQUENCE.ino qui réalise en temps réel la modification du paramètre de la ligne du haut, ou du PAS dont la valeur est affichée sur la ligne du bas. Seuls PAS et VALEUR sont modifiés par cette procédure de servitude.

Calculer la valeur du PAS et des fréquences limites.

Contrairement à ce que l’on aurait été en mesure d’imaginer avant de construire cette procédure, plusieurs pièges viennent compliquer un peu la vie du programmeur. La façon dont sont effectuées les définitions de Limite_INF et de Limite_SUP nous assure que les deux paramètres seront des entiers contenus dans la fourchette valide [1 à 60000000] mais ce n’est pas suffisant.
Passons en revue de détails la suite ordonnée des traitements à réaliser :

Les nombreux essais effectués pour mettre au point le programme ont largement démontré que l’opérateur finit par oublier le TITRE dans le rectangle jaune, et par moment effectue une saisie inversée. Il faut impérativement corriger cette « étourderie », car dans le cas contraire les calculs qui suivent conduisent à des valeurs négatives. BERKKkkkkk ! La correction est facile. Quand en  on détecte une telle anomalie, en (1) on commence par préserver dans une variable disponible quelconque  la valeur de Limite_SUP par exemple. Puis dans Limite_SUP on recopie la valeur de Limite_INF. En ligne (3) on récupère la valeur de Limite_SUP qui était préservée dans Frequence_desiree. Ces deux lignes (2) et (3) constituent un grand classique de programmation : Permuter deux valeurs. Le balayage entre les deux limites est réalisé en 32 PAS. Il faut impérativement que ce soit possible. La ligne (4) réalise la vérification. Si l’intervalle est insuffisant, la plage est augmentée arbitrairement à partir de Limite_INF. Cette augmentation vers le haut peut provoquer un débordement de la butée supérieure. L’instruction (5) teste ce cas très particulier, et corrige alors « vers le bas ».
Toute une plage de fréquences étant définie, il faut bien choisir quelle valeur on va imposer au synthétiseur en retour des saisies. C’est encore un arbitraire qui par choix personnel privilégie la fréquence centrale. Le calcul de l’instruction (6) fournit dans Frequence_desiree cette valeur qui forcément sera entière. Hors la plage définie en toute liberté n’est pas forcément paire. La division par 2 peut faire perdre 1Hz. Pas de quoi alerter le big BOSS. Le calcul du PAS s’effectue en (7) et donne forcément un entier. La partie décimale perdue n’est pas sans conséquence. Multipliée par seize elle provoquera des effets de
bord, notamment sur la rampe analogique et un non retour exact à la fréquence centrale. Pour éviter ces inconvénients très pénalisants, la solution consiste à recalculer les limites pour qu’elles correspondent exactement à la fréquence centrale Frequence_desiree ±16 fois la valeur du PAS calculé. C’est l’objet des deux lignes (8) et (9). Par exemple, avec les valeurs précisées en Fig.31 et Fig32 les paramètres calculés aboutissent à ceux présentés sur la Fig.34 sur laquelle on peut vérifier que QRG correspond bien à la valeur centrale. Comme la connaissance du PAS effectif peut s’avérer utile, le bouton poussoir FC- court permet de basculer sur l’écran de la Fig.35 ou de revenir au mode banal.

La fonction Générateur CENTRÉ.

Clone manifeste de la fonction GENERATEUR B.F. et H.F. cette dernière se comporte strictement de façon identique : Deux fréquences limites étant définies dans la plage acceptable du circuit AD9850, toute rotation du capteur incrémental décale la fréquence synthétisée de plus ou moins un PAS. C’est la façon de définir les paramètres qui est un peu différente. Si l’on travaille sur un filtre « coupe bas » ou « coupe haut », GENERATEUR B.F. et H.F. est parfaitement adapté. La Fig.36 met en évidence les divers paramètres que logiquement on désire imposer à l’appareil en fonction du travail en cours. Par exemple le cas A correspond à un filtre passe haut dont la fréquence de coupure présente une « transition » relativement étroite. Pour déterminer sa fonction de transfert la

logique nous incite à consigner les deux limites INF et SUP avec des valeurs qui encadrent la courbe « montante ». Le cas C est analogue et représente la caractéristique d’un filtre coupe haut dont la transition est plus large. Dans ce cas les paramètres logiques sont encore INF et SUP définis sur un intervalle plus large pour les trente deux échelons. En B l’analyse s’effectue sur un filtre à faible largeur de bande. Pour un tel cas le GENERATEUR B.F. et H.F. ne convient pas. En effet, on va chercher à caler les limites pour encadrer la courbe en cloche de Gauss. Comme les deux limites sont proches si la bande est étroite, la division par 32 pour calculer la fréquence moyenne ne correspondra plus exactement à celle du filtre une fois arrondie à l’entier le plus proche.

Dans un tel cas, l’opérateur préfère de loin obliger le générateur à respecter la fréquence centrale souhaitée. La deuxième donnée (Repérée en jaune sur la Fig.36) qui sera alors utile sera le PAS à partir duquel seront établies par calcul des deux fréquences limites. En fonction de la bande passante du filtre, l’utilisateur imposera un ECART plus ou moins important. C’est précisément la mission de P17_GENERATEUR_CENTRE.ino qui conduit à la page d’accueil de la Fig.37 qui mis à part le titre, est une copie conforme de celle de la Fig.34 dont est issu la trame du programme. Le titre montre de façon symbolique que

l’on définit la fréquence centrale, et que les « bords sont poussés » par calcul. Fréquence QRG et PAS par défaut sont identiques sur les deux fonctions. Le centrage se fait à une onde basses fréquences audible de 1kHz avec un PAS de 20Hz. Clonage également pour l’action de la touche FC- court en mode exploitation qui, comme visualisé sur la Fig.38 alterne entre affichage de la valeur du PAS ou désignation de la fonction en cours. Les Fig.39 et Fig.40 traduisent la saisie des paramètres. Pour le premier c’est la valeur de la fréquence centrale QRG REF qui est sollicitée. Ensuite, vient la valeur du PAS. Les contraintes déjà détaillées peuvent conduire à une modification des bornes pour qu’elles restent dans la plage implicite de [1Hz – 60MHz]. Toute correction de l’une des bornes entraine obligatoirement le recalcul de la fréquence centrale avec modification par rapport à la consigne. Le programme complet P18_Complet_avec_3_Items.ino est dérivé naturellement de son prédécesseur P16_Complet_avec_2_Items.ino  avec l’ajout de la dernière fonction. Contrairement à un simple « transport » de la fonction Générateur Centré, une optimisation est effectuée pour convertir en procédures de service certaines séquences qui préparent la naissance de la prochaine descendance.

La génération de fréquences commutées.

Générer des signaux à plusieurs tonalités calibrées est à la base de la mise au point ou du dépannage d’appareils électroniques tels que les « appels sélectifs », les MODEM, les filtres de spectres etc. Un synthétiseur digne de ce nom se doit de fournir de tels signaux. Sous la forme la plus simple, la commutation automatique se fait sur deux notes dont on doit définir au préalable la fréquence et la durée. Il doit être possible pour chaque note de présenter une durée différente. Dans ces lignes, le mot « note » ne sera crédible que pour des fréquences inférieures à celles des ultrasons, toutefois les signaux possibles devront couvrir intégralement la plage opérationnelle de circuit AD9850.

Générer du signal FSK avec le synthétiseur AD9850.

Abordé dans le chapitre Générer du signal FSK avec le synthétiseur AD9850, de tels signaux imposent de pouvoir définir les deux « tonalités » ainsi que les deux durées. Pour diverses raisons pratiques d’utilisation, les temporisations maximales seront limitées à une seconde, valeur plus que suffisante puisqu’il est rare dans de telles applications de dépasser les 20mS. La nouvelle fonction de modulation par déplacement de fréquence, (Frequency Shift Keying) est disponible dans P19_Generateur_FSK.ino et présente l’écran de la Fig.41 sur lequel on peut lire les valeurs des deux fréquences générées ainsi que les durées de ces dernières. Trois modes d’exploitation sont possibles, le caractère situé en haut à droite (Qui a été colorié manuellement en orange) permet de
HF41savoir quel est celui actuellement validé. En standard C correspond à une génération Continue de la séquence alternée des deux fréquences. Le mode Alterné offre la possibilité de générer en permanence l’une des deux « tonalités ». Toute action sur la touche FC- court dans ce mode fait basculer la génération entre INF et SUP. Dans certaines applications, il est préférable de pouvoir librement déclencher la génération manuellement et en « mono coup ». C’est la fonction Séquentielle pour laquelle tout clic sur FC- court déclenche une synthétisation suivie de la mise en veille du circuit AD9850. C’est la rotation du capteur incrémental qui fait changer de mode d’exploitation avec permutation circulaire de C, A et S dans les deux sens possibles. La séquence déclenchée manuellement par FC- court génère logiquement QRG INF en premier et QRG SUP en second. Cependant, on pourrait aussi désirer l’inverse. Pour couvrir ce besoin potentiel, tout clic sur le bouton central du capteur rotatif inverse les valeurs et les durées des deux « note ». Un premier usage de FC+ court bascule le programme dans
la séquence de saisie des quatre paramètres avec pour chacun d’eux une page d’accueil stipulant la nature de la donnée en cours de définition. Chaque page ressemble à celle de la Fig.42 relative à la consignation de la durée pour la fréquence INF. Vous pouvez constater que la durée que l’on est en train de préciser est exprimée en mS. La Fig.43 qui permet de définir la durée pour la fréquence SUP est en indexation sur l’incrément de modification. Quand le curseur sera repassé sur la ligne de VAL la rotation du capteur ajoutera ou retranchera 100.000 unités à T INF . Inutile de vous acharner à proposer des valeurs dépassant 1.000 car il y aura systématiquement « rabotage » à 1.000mS, soit une seconde pour la durée maximale permise. Il serait enfantin de ne pas imposer cette valeur, et de laisser les durée atteindre des valeurs très importantes. Mais durant la génération d’une tonalité, les B.P. ne sont pas surveillés. C’est après la génération complète des deux notes que les boutons poussoir seront analysés. Pour éviter des durées d’attente exagérées, deux secondes maximales ont été estimée comme étant un délai total à ne pas dépasser. Cette contrainte n’est pas franchement pénalisante, car rares sont les applications qui exigent déjà de telles durées.
Vous vous doutez que les quatre pages de saisie qui s’enchainent vont servir à définir dans l’ordre QRG INF, QRG SUP, T INF et T SUP. Notez enfin que les deux fréquences sont présentées dans un cadre, et les deux durées dans une deuxième zone. Il aurait été plus convivial d’associer directement fréquence et durée, mais cette modification engendre une augmentation de taille de programme importante estimée non rentable. Il faudra par conséquences se discipliner lors des saisies.

RAMPE et ESCALIER : Un même combat.

Autre besoin potentiel, bien que moins fréquent, la possibilité de générer une tonalité qui balaye en continu un spectre entre deux limites reste un outil parfois bien utile. Par exemple cette fonction peut simuler un « brouilleur » quand on cherche à mettre au point une électronique anti parasites. Les exemples d’utilisation tant dans le domaine de la radio que celui des automatismes foisonnent, sans conter la recherche de séquences sonores originales pour les artistes. Dans ce type d’application, on peut désirer aussi bien un balayage progressif d’une fréquence initiale à une tonalité finale, (On parle alors de RAMPE.) qu’une évolution par incréments notables généralement nommée ESCALIER. Enfin, la variation peut être souhaitée croissante, décroissante ou symétrique. La Fig.44 résume les six variantes que se doit de satisfaire la fonction Générateur RAMPE ou ESCALIER :


Les cas 1, 2, 4 et 5 sont sans ambiguïté pour le respect de la consigne de durée dont la valeur est affichée sur la ligne du bas de l’écran en 〈T〉. Les deux cas 3 et 6 sont générés par une seule séquence de programme. C’est uniquement le choix du nombre de marches imposé par l’opérateur qui engendre une différence « visuelle et auditive ». Dans le cas d’une variation symétrique, un choix s’imposait pour le développement logiciel. La première possibilité consiste à alterner en « montant » et en « descendant » une période complète, respectant la période 〈T〉 du signal. Ce choix possible est colorié en jaune sur le dessin 6 montrant qu’une ascendance plus une décroissance totalise exactement une durée identique à deux périodes relatives aux cas 4 et 5. Si l’opérateur a sélectionné le mode RAMPE, cette solution convient à souhait. Par contre, si l’ESCALIER ne contient que quelques degrés en Nbr, la durée pour chaque marche devient notable. Rester durant deux fois ce laps de temps est alors « déroutant auditivement » car les notes émises en extrémités de période n’ont pas une durée équivalente et la progressivité est rompue. Le choix effectué pour rédiger le programme est celui colorié en violet avec changement de note systématique à chaque ΔT.

Soigner en priorité le Traitement ou la présentation ?

Émuler une nouvelle fonction n’est jamais « gratuit » et sera facturé de façon d’autant plus « salée » que les choix initiaux n’auront pas été totalement judicieux. Il reste donc vital durant les premières études de consommer plus de temps à la présentation des écrans et à l’analyse des protocoles qu’au développement de séquences qui effectuent des traitements pointilleux. Il y a quelques années, en génie logiciel, quand on apprenait la programmation en faculté, c’était l’inverse qui était conseillé : Traitez les problèmes en premier, vous soignerez la présentation à la fin. Une longue expérience à la pratique du langage machine m’a convaincu du contraire. Si tout fonctionne bien mais que l’on s’est fourvoyé dans les procédures opérationnelles, la correction devient longue et fastidieuse. Par ailleurs, je crois fermement qu’un programme est fait pour être UTILISÉ, le programmeur oublie trop souvent l’utilisateur. Je vous suggère l’alternative : Définissez soigneusement la présentation et les protocoles d’exploitation en premier, vous soignerez les traitements informatiques à la fin.
Une fois encore c’est un démonstrateur P21_GENERATEUR_A_BALAYAGE.ino qui a servi à mettre au point les séquences de traitement des données, les écrans à afficher et les protocoles d’exploitation. Il a surtout permis de mettre en évidence une philosophie « toxique » : Dans le programme  P20_COMPLET_avec_4_Items.ino, initialement l’approche consistait à utiliser une procédure d’affichage unique pour la présentation des pages d’accueil. Une foule de if et de switch encombrait des procédures telles que void Affiche_ecran_GENERATEUR_sur_PLAGE() et la lecture du source devenait incompréhensible. Intégrer la nouvelle fonction dans le programme complet engendrait alors un effet « boule de neige » très long à déverminer. Avant de terminer le développement du démonstrateur, le programme complet en version P20 a été réécrit. Il inclus maintenant une procédure d’affichage particulière propre à chaque Item du MENU de base. Le nombre de procédures a augmenté, mais paradoxalement cette cure de jouvence à diminué le code de 36 OCTETs. Pour P21 (Devenu plus lisible.) le développement a repris sur des bases plus pérennes.

Générateur à balayage continu.

Encore une fonction qui n’a pas été aussi évidente à développer que ne le laissait espérer les modes de fonctionnement présentés sur la Fig.44 qui cachent pas mal de pièges qu’il a fallu déjouer. Suite à de nombreuses tentatives, toutes aussi infructueuses les unes que les autres, la liste des paramètres indispensables à la maitrise de notre appareil devenait incompatible avec le faible nombre de boutons disponibles, car le maitre mot reste la qualité
HF45opérationnelle. Cette suite laborieuse de « marches montantes et descendantes » a conduit à une technique d’exploitation tout à fait satisfaisante, la convivialité restant au sommet de la hiérarchie. Deux facettes sont fondamentales quand on établit des manières d’utiliser un quelconque appareil. La première tombe sous le sens : Définir des manipulations agréables et optimales. La deuxième qu’il ne faut jamais sous-estimer : Parer un maximum d’erreurs logiques pouvant résulter d’une configuration mal réfléchie de l’opérateur.
La Fig.45 ci-contre présente l’écran d’accueil de cette nouvelle fonction qui fait apparaitre cinq des paramètres fondamentaux. Dans le cadre du titre,  le caractère isolé en haut à droite précisera le mode d’évolution en cours. Les lettres choisies sont volontairement toutes différentes de celles qui étaient réservées pour le générateur FSK. Cette approche vise à faciliter pour l’opérateur l’usage de PICOSYNTHÉ en évitant au maximum les confusions d’interprétation. M correspond à un escalier ou une rampe Montante. Le mode D est relatif à un escalier ou une rampe Descendante. L’option T engendre un escalier ou une rampe Triangulaire. Dans ce cas, comme il en a été question ci-avant,  la durée pour un balayage complet est presque le double de celle affichée en 〈T〉 si le nombre de marches Nbr est
faible. L’encadré bleu est encore divisé en deux zones. La première en haut est toujours réservée à la présentation des deux fréquences extrêmes QRG INF et QRG SUP. La zone inférieure indique sur la ligne du haut Nbr le nombre d’incréments désirés lors d’un balayage complet. Notez au passage qu’il n’y a pas d’unités puisqu’un nombre par définition est sans dimension. Ce nombre ne pourra pas être inférieur à 5. Ce choix est issu d’une volonté de ne pas dépasser une seconde par note, durée qui peut affecter la lenteur de prise en compte d’un bouton poussoir. Toujours dans le chapitre « protéger l’opérateur des erreurs de configuration », le maximum est limité à 200. Dans le pire des cas, la durée d’une note sera de 0,025S procurant une progressivité auditive plus que suffisante. Augmenter ce nombre ne servirait à rien mais provoquerait une plus grande probabilité de recalcul des données. (Les données affichées du type séquence ordonnée 4321 sont courantes lors des phases d’essais. Celles de la Fig.46 provoquent un bruitage assez amusant que vous pouvez tester pour le plaisir.)
Pour sa part, la ligne du bas 〈T〉 précise la quatrième donnée qui sera demandée en mode saisie des paramètres. Le symbole rappelle qu’il s’agit de la durée T comprise entre les deux « extrémités » gauche et droite . Il sera souvent utile pour l’opérateur d’avoir connaissance de la valeur d’un PAS et de sa durée. Le bouton poussoir FC- court alterne en permutation circulaire entre la valeur du PAS montrée en Fig.46 exprimée en Hz, retour au TITRE normal, affichage de la durée ΔT d’un PAS montré sur la Fig.47 exprimée en mS et enfin retour au TITRE.
En exploitation, tourner le capteur incrémental aura pour effet, comme c’était le cas pour le générateur F.S.K, de créer une permutation circulaire entre les options M, D et T, le changement respectant le sens de rotation. Notez au passage que si l’on est en option d’affichage PAS ou mS la lettre dédiée vient compléter les informations présentes à l’écran.
À tout moment, le technicien peut désirer suspendre la génération puis la reprendre. Cette aptitude sur PICOSYNTHÉ sera dévolue au bouton poussoir central se comportant comme une bascule de type OUI/NON.
FC+ court en standard fait passer au mode de saisie des paramètres. Quatre écrans successifs montrés sur les dessins des Fig.48, Fig.49, Fig.50 et Fig.51 s’enchainent dans l’ordre avec en premier la consignation des fréquences limites, puis de la durée d’une période complète et enfin le nombre désiré d’incréments sur une séquence. Le logiciel d’exploitation doit parer plusieurs cas critiques potentiels. Certains sont gérés par la procédure void Saisir_QRG_INF_SUP__Tmp_et_Nombre() suivi d’un autre filtrage par la procédure de service spécifique void Calculer_les_parametres_fonction_de_la_duree(). Je vous invite fortement à lire le listage du programme démonstrateur pour comprendre le bienfondé de tous ces traitements … et j’espère intensément  ne pas être passé à coté de combinaisons critiques qui viendront polluer le bon fonctionnement du programme.

Le générateur de CODES SÉLECTIFS.

Indispensable pour tous les techniciens amenés à travailler sur des systèmes de détection d’appels sélectifs, il sera également très appréciable pour travailler sur des électroniques à codes basés sur des séquences de fréquences. Généralement un système de détection d’appel sélectif ne comporte que peu de notes. Avec 10 on peut couvrir un nombre pratiquement infini de possibilités. Par exemple avec dix chiffres on couvre facilement les besoins téléphoniques actuels, alors que chaque « digit » ne présente que dix valeurs différentes possibles. Avec les tonalités on dispose pour chaque « digit » de toute une plage de fréquences avec une combinatoire bien supérieure à dix. Par exemple, EUROSIGNAL à une certaine époque, ne comportait pour son codage que six notes. Le code Baudot pour son compte se contente de cinq BITs. (Il est vrai que dans son cas on double la combinatoire avec prépositionnement Lettres/Chiffres.) Autant dire qu’en limitant le logiciel à dix tonalités on couvre largement les besoins actuels et futurs. Chaque tonalité consomme quatre OCTETs, raison pour laquelle on a fixé le maximum à dix. Ce type de séquence est toujours de durée identique pour chaque « note », ce qui simplifiera grandement la saisie des données, sans compter que d’avoir à ne stocker en mémoire qu’une seule temporisation diminuera d’autant la taille occupée par les variables. La Fig.52 présente la page d’accueil par défaut. Dix tonalités sont générées pour une durée individuelle de 0,1S. Comme il est indispensable
de pouvoir à tout moment passer en revue la séquence que nous avons imposé à PICOSYNTHÉ, quand on clique sur le bouton central du codeur rotatif, l’index passe sur la zone du bas. La rotation du capteur incrémental permet de faire défiler à convenance les valeurs des N tonalités programmées. Par exemple sur la Fig.53 l’appareil mémorise six notes de 0,3S chacune. La n°3 est le LA indice 3 dont nous avons déjà débattu dans le didacticiel. Dans ce mode, FC- court déclenche la génération de la tonalité indexée, alors que dans le mode séquentiel de la Fig.52 cette touche provoque l’émission d’un CODE complet.

Consigner dix fréquences de valeurs quelconques peut s’avérer un peu fastidieux. Il ne faut donc pas s’engager par erreur dans le mode de définition des paramètres par erreur, car il faudrait alors tout redéfinir. Pour prévenir ce type d’incident, quand on fait appel au menu des options avec le bouton poussoir FC+ court, l’écran est entièrement effacé, un BIP sonore pour attirer l’attention se fait entendre et il y a demande de confirmation par le message Changer de code ?. La touche FC- permet à ce stade la fuite sans modification des valeurs. Accepter avec FC+ court, ouvre la première page de saisie. Montrée sur la Fig.54 il n’y a pas d’unités puisque c’est un nombre. La valeur sera ramenée à 10 si l’on a indiqué une donnée trop importante.
FC+ long enchaine sur la page suivante visualisée sur la Fig.55 pour préciser la durée d’une tonalité. Cette dernière ne pourra pas dépasser une seconde. Enfin, vont ensuite se succéder autant de pages pour préciser les fréquences des Nbr tonalités à générer pour une séquence. Par exemple sur la Fig.56 la tonalité n°3 est en train d’être décrite. FC+ long pour la dernière note ramène à l’écran d’exploitation qui peut être aussi bien celui de la Fig.52 que celui de la Fig.53 car le mode est mémorisé.
La génération de tonalités procurant directement des notes musicales de la gamme tempérée a été expérimentée. Une telle possibilité était séduisante, mais elle engendre une augmentation significative de la taille du programme. Le bénéfice qui en résulte a été estimé insuffisant, si l’on doit indiquer une séquence utilisant des notes de musique, on codera manuellement les fréquences associées. Ce n’est pas idéal, mais tout n’est que compromis.

>>> Page suivante.

Laisser un commentaire

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