I2C

Tous les articles taggé I2C

Bonsoir,

Comme je vous en avais parlé rapidement ici, ma première version du système permettant de générer les tensions de 1 à 4 Volts nécessaires au contrôle du fauteuil utilisait la sortie PWM de l’arduino.

C’est ce montage là :

PWM Arduino

Que j’ai depuis déporté sur une tablette :

PWM Arduino

Voyons plus précisément comment cela fonctionne…

PWM Arduino

Le principe est de faire varier sans cesse une broche de sortie entre un état haut et un état bas (5V, 0V), comme on peut le voir sur les signaux de gauche.
Le moment ou la broche passe de l’état bas vers l’état haut est toujours le même, toutes les secondes par exemple.
Par contre, on fait varier la durée à l’état haut. Pas longtemps comme le signal ‘2’, d’une durée moyenne comme le signal ‘1’ ou longtemps comme le signal ‘3’.

Ce qui vas nous intéresser, c’est la tension moyenne de ce signal.

Par exemple, il est évident que si je reste en haut 100% du temps, la tension moyenne sera de 5V et au contraire, si je reste à l’état haut 0% du temps (jamais donc), la tension moyenne sera de 0V.
Après, une simple règle de 3 permet de connaitre la tension moyenne théorique : 20% du temps => 20 x 5 /100 = 1 soit 1V.
Et comment on obtient une tension moyenne ?

Avec un condensateur et une résistance dont les valeurs ont été soigneusement choisi, pas comme moi qui ai pris plus ou moins au pif dans le stock jusqu’à ce que cela fonctionne.

Ici donc, ça marche pas …

PWM Arduino

En gros, plus la résistance et le condensateur auront une valeur élevé, plus le signal sera lisse.
MAIS :
– Si la résistance est trop élevée, alors il n’y a plus suffisamment de courant qui passe, et le signal de sortie est absorbé par le boitier de contrôle du fauteuil et disparait, le fauteuil se met en erreur.
– Si le condensateur est trop élevé, alors le signal de sortie met 3 plombes à suivre une modification du signal d’entrée et le robot de tonte est chez le voisin avant de comprendre qu’il doit tourner.

Bref, c’est simple, pas chère, mais surtout adapté pour faire varier directement la vitesse d’un moteur, pas beaucoup plus.

Comment faire la même chose, en mieux ? C’est à dire, comment à partir de mon code, avoir une tension de sortie variable, parfaitement lisse et qui réagit immédiatement ?

On utilise un Convertisseur Numérique Analogique (CNA). Il en existe avec des commandes séries ou parallèle. La commande en parallèle a l’avantage d’être plus rapide puisque pour un convertisseur 10 bits, chaque bit est envoyé en même temps sur un fil dédié alors que pour une commande série, il faut envoyer chacun des 10 bits l’un après l’autre sur le même fil.

Et la commande série, à l’avantage de n’utiliser qu’un fil (ou 2 avec l’horloge).

J’ai choisi un CNA avec une commande en I²C (série donc), je n’ai pas besoin d’atteindre les vitesses d’un port parallèle et l’arduino dispose déjà d’un port I²C et de bibliothèques dédiées.

Une recherche rapide me guide vers le DAC6573IPW

CNA Arduino

C’est pas grand, mais à priori on peut le souder sur un adaptateur :

CNA Arduino

Ha oui

CNA Arduino

Mais en vrai, j’aurais beau m’y reprendre plusieurs fois après m’être bien pris la tête à essayer de comprendre pourquoi mon code ne fonctionnais pas… je n’ai jamais réussi à le souder correctement, à moins que j’ai trop abîmé une patte. Quoi qu’il en soit, il fallait poser le doigt dessus pour qu’il fonctionne, et dans ce cas il faisait bien le boulot. Et hop, un échec pour moi !

J’ai donc recherché plus attentivement un CNA, I²C, 4 sorties, boitier DIP !

Cette fois, j’ai trouvé le MAX520BCPE+, en 8bits, ce qui après réflexion ne change pas grand chose pour mon usage.

Câblage sur une plaque à essais, réagit bien, mais la tension indiquée sur le volmètre à aiguille varie seulement de 0 à 2,5V alors que la tension de référence est de 5V…

J’ai aussi cherché un moment… Jusqu’à me rendre compte que ce CNA est un réseau R/2R SANS amplificateur. Pas d’ampli, cela signifie que le courant qui sort influe directement sur la tension mesurée, et que mon voltmètre est trop gourmand. Intuition confirmée par une mesure au voltmètre numérique, qui me donne bien un fonctionnement entre 0 et 5V.

Cette fois, pas de problème, j’ai des LM324 qui trainent … (ce sont des boitiers renfermant 4 amplis op), un montage en suiveur résout ce petit soucie.

C’est quoi un montage en suiveur ?

un amplificateur opérationnel est constitué de 2 entrée (entrée + et entrée -) et d’une sortie. si on relie la sortie a l’entrée -, et que l’on injecte un signal sur l’entrée +, alors la sortie reproduit fidèlement ce signal. Mais en plus, les entrées d’un ampli op ont une résistance infinie, il n’y a donc pas de courant qui entre, et donc pas de courant qui vient modifier la tension fournie par le CNA. Encore plus cool, le courant de sortie est infinie lui aussi (dans les limites de ce genre de truc, largement au dessus de mes besoins), ce qui signifie que je n’ai pas a me soucier du courant dont à besoin le boîtier de contrôle du fauteuil.

Un schéma pour finir de comprendre ?

CNA Arduino

En vrai, c’est un peu lourd quand même …

CNA Arduino

… mais fiable !

Et le résultat en vidéo ?

Oui, mais avec un autre sujet, j’ai d’autre vidéos un peu plus parlante, mais ce sera pour le prochain article. En attendant, je vous propose celle-ci :

Bah, et le code ? Pareil, vous l’aurez avec le prochain article 🙂

Bonne soirée,

Jilks

Edit : Bon aller, je vous la met quand même… vous connaitrez le prochain sujet 😉