lundi 27 avril 2020

Le premier CV en I2C / SPI ?

Rappel du but de l'expérience en cours :
Interfacer un pico ordinateur "hôte" (Raspberry Pi / Orange Pi / ESP32 / ...) avec un condensateur variable, pour écouter des web-radios dans une vieille TSF.

Pour des raisons de facilité et de portabilité, j'ai décidé de confier la mesure de la valeur du CV à un micro-contrôleur autonome, avec un minimum de composants externes.
L'idée c'est de communiquer la mesure avec l'hôte via le bus I2C ou le bus SPI.

J'ai choisi un Atmega pour la facilité de prototypage grâce à la plateforme Arduino.
Pour l'instant le classique "arduino nano" avec son Atmega328P et sa connexion usb.
Une fois le prototype validé, on pourra réaliser un circuit allégé, sans toute la quincaillerie led, usb et connecteurs. On pourrait même tenter d'utiliser le minuscule ATtiny85 ?

J'ai essayé plusieurs méthodes de mesure, y compris détourner du code existant "Capacitive Touch Sensor".
Après plusieurs tentatives échouées, je reviens à du code "perso" :

Oscillateur logiciel.

Pour commencer, un oscillateur avec le trigger de Schmitt déjà présent sur les entrées GPIO.
Pour éliminer un élément variable de la démonstration, j'utilise pour l'instant un condensateur fixe.

oups. J'ai laissé le 4093 (au milieu), avec des entrées "en l'air", c'est mal.

Le principe :

- Le condensateur (initialement déchargé) est relié à un GPIO (in) se charge au travers d'une résistance par un autre GPIO (out=1).
- Le changement de valeur logique sur (in) (seuil du trigger de Schmitt) déclenche une interruption de changement d'état, on inverse (out), C se décharge, etc...- Si on compte le nombre d'inversions pendant 1/2s, on a la fréquence en Hz.

Cela fonctionne mais avec un swing (ou jitter ?) trop important, la variation de mesure dépasse +/- 2%.
Le Schmitt est très sensible aux perturbations sur la tension d'alimentation : Je constate que si l'arduino est alimenté par l'usb du mac ou par une alim externe, la fréquence varie. Même allumer la led présente sur l'arduino perturbe l'oscillateur !

Ceci est parfaitement visible à l'oscilloscope : On voit que certains pics de charge / décharge dépassent le seuil, et que la fréquence "swing" (les impulsions son nettes à gauche, et floues à droite).


En fait les variations proviennent également du code non optimisé (euphémisme pour "écrit avec les pieds"), on va améliorer tout ça.

Ça fume ?

J'en suis là lorsque je remarque une odeur bien que je connais bien : Y'a un composant qui crame quelque part.
Sous l'arduino il y a une tache brune sur le plastique qui correspond au condensateur de 10µF à la sortie 3,3V.


Je n'ai pas (encore) de fer à souder à Paris, mais j'ai... un cutter. Je gratte un peu la soudure pour essayer de couper une broche au raz du composant, et la capacité juste à côté se détache carrément !

Je bricole tellement peu que mon cutter a rouillé.

C'est le problème avec les cartes "merd... made in china" :
C'est pas cher, et on en a pour son argent.

Je ne sais pas si les cartes "original" plus chères sont mieux construites, mais c'est un point à prendre en compte par celui qui voudrait se lancer dans la production au delà du hobby.
Comme je n'utilise pas le 3,3V - qui est toujours présent, le circuit n'a pas grillé - je laisse tel quel (la communication série fonctionne).

RTFM ou "Read The F...... Manual"


Je me décide à regarder ce qu'il y a dans un 328.
Et il y a de quoi faire un oscillateur dans de bien meilleures conditions : Une référence de tension et un comparateur analogique.
Au lieu de compter les impulsions sur une période fixe (fréquence), je mesure maintenant la durée entre N impulsions (période). Avec un condensateur VLC, cela donnera une valeur proportionnelle à la position du sélecteur.
Je ne rentre pas dans les détails, mais avec un code optimisé j'ai limité le swing, avec une dynamique supérieure à 500 valeurs distinctes et stables (+/- 1pt) sur toute la plage de réglage.

(*)

Bref, ça marche !

Les prochaines étapes seront :
- Ajouter un accès I2C ou SPI pour publier la valeur au système hôte.
- Ajouter la génération d'un signal lorsqu'on tourne le CV. Ceci permettra à l'hôte d'être averti d'un changement de station.
- Porter tout ça sur un 328 (ou un ATtiny ?) alimenté en 3,3V (et en 8 Mhz au lieu de 16), même tension que les PI ou ESP.

Je ne vais pas publier ici à chaque ligne de code, on en reparlera quand ça marchera suffisamment pour faire une démonstration avec un CV dans une vraie radio.
Pour ça, il me faudrait une vieille TSF à Paris ? Quelle coïncidence ! J'ai encore rencontré des gens sympathiques qui faisaient de la place dans des armoires...





(*) : Avec un peu d'attention on pourra remarquer un léger changement entre les premières photos d'écran d'oscilloscope et cette copie écran.

Le confinement m'a fait craquer.
Malgré mon affection pour les machins à tubes, je me suis offert un oscilloscope moderne, ...
Oui, la marque c'est "Rigol" :) Ça fait moins sérieux que "Rhode & Schwarz", mais c'est dans mon budget.
C'est "made in Taiwan"... J'espère que c'est mieux soudé qu'un arduino chinois.

... J'ajoute quelques arduinos et autres circuits utiles à ce projet,... et un fer pour y souder les connecteurs.
 
Depuis ma première soudure dans les années 80, - hormis quelques pinces coupantes ou multimètres chinois -, c'est la première fois que j'achète un appareil récent et neuf !
À l'heure où des bricolages contiennent des processeurs, des bus de données, des protocoles, ..., les bons vieux oscillos à deux voies sont un peu légers en fonctionnalités (et lourds en poids).

Quand même.
Il serait temps que dé-confinement arrive, sinon mon prochain achat compulsif risquerait d'être un autre modèle de 328.
Mais là, même dans 30 ans, j'aurai pas le budget.

Aucun commentaire:

Enregistrer un commentaire