Pour sa simplicité, j'ai choisi un oscillateur réalisé avec un trigger de Schmitt.
Cahier des charges.
Il ne s'agit pas de réaliser un capacimètre ni même un fréquencemètre.Le but est d'obtenir une valeur stable dépendant de la position de l'indicateur de la TSF, avec une résolution suffisante pour pouvoir distinguer des positions proches de ~1 mm sur l'ensemble de la plage.
La mesure stable doit s'effectuer en un temps court (<1s) pour que le changement de station soit réactif.
Théorie.
Comme je suisL'idée est de programmer le gpio d'entrée pour générer une interruption à chaque changement d'état (both-edge) sur gpio-in et d'inverser gpio-out.
Naturellement ça ne fonctionnera que si on vérifie deux premiers points :
- Le code est-il assez rapide ?
Après une rapide recherche sur les maigres documentations de l'OrangePi, je pense que maintenir de façon logicielle (interruptions) un signal de plusieurs dizaines de Khz serait assez hasardeux sur un système linux classique. À la moindre interruption ratée, l'oscillateur va s'arrêter.Je ne jette pas le OPi, mais je donne pour l'instant la priorité au Wrover.
- Un gpio en entrée peut-il se comporter en trigger de Schmitt ?
La doc de l'ESP32 indique les seuils L(ow) et H(igh) de gpio : 0,25 Vdd et 0,75 Vdd (où Vdd est la tension d'alimentation du circuit, soit 3,3V).Avec une résistance ajustable et une ligne de code, j'ai constaté que les entrées ne sont PAS des Schmitt : Vers 0,4 Vdd on a une lecture aléatoire / instable de 0 ou 1.
Même avec 3 gpio et des résistances de réaction / contre-réaction je n'arrive pas à un fonctionnement stable.
Place au CD4093.
J'abandonne l'idée d'un oscillateur logiciel. On trouve des circuits comportant de 1 à 6 trigger de Schmitt inverseurs, comme le CD40106 ou le CD4093.J'utilisais déjà le 4093 dans les années 80, ce circuit coûte moins de 1€ et ça ne va pas beaucoup compliquer le montage.
Sur l'ESP on peut utiliser des gpio(s) comme compteurs d'impulsions. Avec un des timers je peux obtenir le compte sur une période donnée. C'est gagné ?
Premier essai.
De mon dernier passage à Loches j'ai rapporté un condensateur variable, j'avais ressorti un fer à souder pour y coller deux fils.
Il s'agit comme souvent d'un CV double (2 "cages" étaient nécessaires dans beaucoup de TSF).
J'ai eu la (mauvaise ?) idée de les relier en parallèle, parce qu'ainsi la plage de valeur est plus large et on peut espérer une plus grande résolution de mesure.
Quelques lignes de code et je compte les impulsions sur une période de 1 s. J'affiche la valeur échantillonnée sur le "serial monitor" du Mac.
La valeur "swing" un peu, sans un fréquencemètre je ne sais pas si ce swing vient de l'oscillateur (le 4093 est alimenté en 3,3V, c'est un peu juste) ou de mon code.
En faisant une moyenne sur des mesures plus courtes (10 mesures de 50 ms par ex.) je devrais pouvoir avoir une valeur stable.
La relation position/fréquence n'est pas linéaire : La fréquence évolue lentement au début (condensateur fermé = forte valeur C = fréquence basse), puis de plus en plus rapidement quand on "ouvre".
C'est normal car - la moitié - de ce condensateur double est à lames en demi-cercle plein (à droite sur la photo) : Un modèle "Variation Linéaire de la Capacité" (en apprendre plus ici).
Avec un condensateur VLC, la capacité est proportionnelle à la position.
Sur un oscillateur à trigger de Schmitt, la période est proportionnelle à la capacité.
Comme fréquence = 1/période, la fréquence varie suivant une courbe.
Mais comme l'autre moitié de ce condensateur est constituée de lames profilées (visibles en bas à gauche), j'ai surement déformé la courbe en reliant les deux condensateurs en // . On va vérifier ça lors des essais.
Linéariser.
Chaque web-radio sera mémorisée dans l'ESP en regard d'une fréquence de l'oscillateur (avec une tolérance sur une petite zone, on verra ça plus tard).Si j'utilise directement la valeur mesurée (non linéaire), il sera difficile - d'un côté - de retrouver une "station" enregistrée car un tout petit déplacement du bouton produira un grand déplacement de valeur.
Si je compense avec une division importante, de l'autre côté le réglage deviendra trop "mou".
Donc je vais utiliser K/n (où n est le nombre d'impulsions comptées pendant une durée fixe - ma "pseudo fréquence" -, et K une constante), pour retrouver une valeur proportionnelle à la position de l'indicateur.
J'ai marqué le pignon d'entrainement du CV et relevé grossièrement la "fréquence" (courbe bleue) à 9 positions. À gauche le condensateur est fermé (C élevé -> f faible); Vers la droite on ouvre le condensateur, la fréquence augmente de plus en plus rapidement,
En orange, les valeurs prévues après linéarisation (calculées pour l'instant par Excel).
On va dire que c'est une ligne droite.
Tolérance...
Il faut des valeurs suffisamment "fines" (= une plage de valeurs large) pour pouvoir attribuer une station à un emplacement précis de l'aiguille.Sur certains gros postes l'aiguille peut avoir une course de 40 cm, donc pour une précision de 1 mm il faudrait une plage d'au moins 400 valeurs discrètes.
Personne ne va mémoriser 400 web-radios sur une seule gamme, je peux donc ajouter une tolérance autour de la valeur mémorisée.
Par ex., si une station est mémorisée pour la valeur 100, elle sera sélectionnée pour la zone 99...101.
Sur notre "gros poste" il restera possible de régler une station en face d'une marque du cadran à 1 mm près, mais l'écart entre deux stations devra être au minimum de 3 mm.
...et œil magique ?
Le nec plus ultra serait d'afficher la précision de la position (la distance de l'aiguille par rapport à la station la plus proche) en réutilisant l'œil magique du poste. Ceci sera peut-être l'objet d'un prochain "POC".À suivre :
Je passe de la rédaction de ce blog à l'écriture de 'C' pour l'ESP32.Et puisque j'utilise maintenant un oscillateur externe, je vais également me pencher sur les possibilités de comptage d'impulsions et de timers avec le OrangePi.
Aucun commentaire:
Enregistrer un commentaire