Page 1 sur 1

[ARDUINO] Ajout d'entrées/sorties analogiques sur bus I2C

Publié : dim. août 09, 2015 10:06 am
par Topper Harley.
Après l'article "Ajout d'entrées/sorties binaires sur bus I2C", voilà comment étendre l'arduino pour utiliser sur le bus série I2C des entrées et sorties analogiques.

Par opposition à une valeur binaire ou digitale, qui ne peut avoir que deux états (ouvert ou fermé, 0 ou 1, 0v ou 5v), une valeur analogique désigne une plage de valeurs entre deux valeurs de référence.
Dans BMS, en sortie, les valeurs analogiques sont celles données en type float dans la mémoire partagée. Il s'agit par exemple du trim qui a une valeur variable. En entrée, ces valeurs variables se définissent dans Options /advanced options et matériellement elles se règlent en agissant sur des potentiomètres.

Image


Analogique en Sortie :
L'arduino envoie ponctuellement une tension de 5v toutes les x millisecondes. Ce "x" est variable, il correspond à la tension moyenne désirée.
Par exemple,
[ul]
[li]Si vous voulez une tension de 5V pendant 20 secondes, l'arduino envoie 5V pendant 20 secondes, pendant 100% de la durée voulue.[/li]
[li]Si vous voulez du 0V pendant 20 secondes, l'arduino n'envoie rien pendant 20 secondes. On peut dire qu'il envoie 5V pendant 0% de la durée voulue.[/li]
[li]Si vous voulez du 2.5V pendant 20 secondes, l'arduino n'envoie pas du 2.5v, car il ne sait pas le faire. A la place, il enverra 5v pendant 10 secondes et n'enverra rien pendant 10 secondes. Il envoie donc 5V pendant 50% de la durée voulue, mais il enverra ces deux signaux (5v et 0v) à une fréquence tellement élevée (490 fois/secondes, soit 490hertz ou 490Hz [ou 980Hz sur les ports 3 et 11]) qu'une lampe, une diode ou certains autres appareils nous sembleront réagir comme si ils recevaient effectivement du 2.5v. Cette fonctionnalité se nomme PWM (Pulse With Modulation) ou, en français MLI (Modulation de Largeur d'Impulsion).[/li]
[/ul]

Image

Côté programmation, l'instruction pour dire à l'arduino d'envoyer une tension selon une PWM est analogWrite(x) dont x varie de 0 à 255. En d'autres termes, vous l'avez compris : l'arduino ne pourra envoyer que 255 valeurs différentes entre 0 et 5v.

Les ports pouvant envoyer un signal en PWM sur arduino sont les ports "DIGITAL" marqués avec le tilde ~. Ce sont donc sur la Leonardo les ports 3, 5, 6, 9, 10, 11 et 13.


Exemple : envoi d'une tension de PWM de 2.5v sur le port digital n°3

Code : Tout sélectionner

void setup(){ pinMode(3, OUTPUT); // Désigne le port 3 en sortie } void loop(){ analogWrite(3, 127); //envoie sur le port 3 une valeur PWM de 50% (donc, simule du 2.5v) }

Analogique en Entrée :

En entrée, l'arduino leonardo possède 12 ports qui permettent de lire une valeur variable comprise entre 0 et 5V, il s'agit des ports AnalogIn A0 à A5, et A6 à A11. Les ports A6 à A11 sont les ports 4,6,8,9,10,12 (vous pouvez les voir inscrits sur l'arrière de la carte, et un point blanc matérialise ces ports sur le côté composants).
Image
La lecture de la tension envoyée sur un de ces ports est convertie en une valeur entre 0 (0V) et 1023 (5V)

Exemple : lecture d'une valeur et affichage de celle-ci sur le port série

Code : Tout sélectionner

void setup(){ Serial.begin(9600); // Initialisation du port série } void loop(){ Serial.println(analogRead(1)); //Lecture de la valeur et envoi vers le port série. }
Tout cela fonctionne très bien comme ça, nous pouvons donc utiliser ces entrées et sorties analogiques via l'arduino, directement. Mais puisque nous utilisons le bus I2C pour augmenter les entrés/sorties digitales (voir article Ajout d'entrées/sorties binaires sur bus I2C), autant rajouter sur ce même bus série des entrées/sorties analogiques, ce qui aura également la fonction de pouvoir augmenter le nombres d'E/S analogiques. Le principe du bus série I2C est identique : les 4 fils permettent la communication avec un microprocesseur qui va effectuer un rôle de convertisseur analogique/digital.

Pour rappel : le port I2C communique avec un signal composé de 0 et de 1, c'est un signal digital. Pour le convertir en une valeur analogique, il faut utiliser un circuit intégré qui effectue un travail de convertisseur digital->analogique (DAC). De la même façon, quand on va lui demander de lire la valeur d'un potentiomètre pour l'utiliser comme un axe de joystick, il devra effectuer un travail de conversion analogique->digital (ADC).

Plusieurs circuits intégrés communiquant par I2C pourront faire l'affaire, je vous propose ici le PCF8591 qui permet d'effectuer 4 conversions ADC et une conversion DAC. Concrètement, pour chaque PCF8591 que vous mettrez sur votre bus I2C, vous ajoutez 4 entrées et 1 sortie analogiques.

Image

La notice technique (datasheet) du PCF8591 est ici : http://www.nxp.com/documents/data_sheet/PCF8591.pdf

Le brochage du circuit PCF8591 est aussi simple que celui que nous avons vu dans l'article "Ajout d'entrées/sorties binaires sur bus I2C" :
-les 2 fils du bus I2C plus la masse et le 5V (on a bien nos 4 fils),
-les broches 5,6 et 7 permettent de définir l'adresse variable du circuit intégré (l'adresse fixe étant 0x90),
-les broches 1 à 4 sont les 4 entrées analogiques
-la broche 15 est la sortie analogique.
-la broche VSS ( 8 ) pour la masse tandis que VDD(16) pour le +5V. Notez que Vref(14) est la valeur de référence d'échelonnage de la mesure. Donc mettez la à 5v, la même tension que celle qui va alimenter vos potentiomètres).

Pour jouer avec ce circuit intégré, sachez qu'il existe une petite carte de "découverte" à un prix très raisonnable (entre 2 euros et 4 euros) et qui relie ce circuit intégré à une photorésistance, un capteur de température et un potentiomètre.
Image

Image

Le PCF8591 en sortie
Une seule broche effectue la conversion DAC (Digital vers Analogique), c'est à dire qu'une seule broche du PCF8591 débitera une tension variable entre 0 et 5V. Notez qu'on aura bien là une tension analogique, et non pas une tension PWM comme le délivre l'arduino (si vous ne comprenez pas ce que ça signifie, relisez le début de l'article : Analogique en sortie).

Le PCF8591 en entrée
Quatre broches permettent d'effectuer des conversions Analogiques->Digitales (ADC). Concrètement, dans notre montage, cela servira à ajouter des potentiomètres qu'on pourra utiliser comme axes de joystick supplémentaires (lisez et appliquez l'article http://ffw05.fr/index.php/forum/falcon- ... ystick-usb). Car en ajoutant des nouveaux axes de joystick supplémentaire, vous pourrez lier des instruments de cockpit à leurs potentiomètres via la page de réglage (Setup) dans BMS.

La programmation, avec ce circuit intégré sera d'ailleurs plus simple qu'en passant directement par la carte :

Exemple :

Code : Tout sélectionner

JoyState_t joySt; // Joystick state structure #include <Wire.h> // PCF8591 Entrées Analogiques #define PCF8591 (0x90 >> 1) // Device address = 0 #define PCF8591_ADC_CH0 0x40 //Input pot. 0 du PCF8591 0x90 #define PCF8591_ADC_CH1 0x41 //Input pot. 1 du PCF8591 0x90 #define PCF8591_ADC_CH2 0x42 //Input pot. 2 du PCF8591 0x90 void setup() { joySt.xAxis = 0; joySt.yAxis = 0; joySt.zAxis = 0; } void loop() { joySt.xAxis = getADC(PCF8591_ADC_CH0); joySt.yAxis = getADC(PCF8591_ADC_CH1); joySt.zAxis = getADC(PCF8591_ADC_CH2); delay(1); Joystick.setState(&joySt); }
Exemple : mon montage comporte plusieurs cartes de test sur lesquels sont soudées des composants du bus I2c. Chaque carte permet de dupliquer les 4 fils du port I2C donc, dans l'absolu je peux mettre tous mes CI I2C sur ce circuit.
Néanmoins, vous pourrez remarquer deux résistances entre le positif et les fils SDA et SCL : le bus I2C ne communique pas avec des 0 et des positifs, il communique avec des différences de tension.

Image

Image

Image

Au niveau des potentiomètres, vous en aurez besoin de 3 sortes différentes :
  • Des potentiomètres linéaires : ceux là vont s'appliquer aux intensité lumineuses (et avec interrupteur si vous voulez l'utiliser sur le HUD), réglage du réticule de visée en mode manuel.
  • Des potentiomètres logarithmiques : ils vont s'appliquer aux boutons de contrôle de volume uniquement
  • Des potentiomètres W : ces potentiomètres sont linéaires mais présentent une sensation de "creux" lorsque la course est au milieu de leur valeur. Par exemple, pour la compensation manuelle du trim, il sera utile d'avoir ce type de potentiomètre car on pourra sentir immédiatement lorsque leur course est à mi-valeur dont que le trim est au milieu.
La valeur des potentiomètres est assez peu importante et généralement les valeurs souvent employées vont de 1 kiloohm à 10 kiloohm.

Le brochage des potentiomètres est généralement très simple : les broches externes sont reliées à la masse et au positif (lorsque le curseur est face à soi, la masse est à gauche, et le positif à droite), tandis que la broche du milieu est reliée au curseur du potentiomètre. C'est donc la broche du milieu qu'il faut relier à l'entrée analogique.

A la lumière de ces quelques informations, vous pourrez donc lire les valeurs analogiques du CI et les utiliser dans BMS.
P.exemple ici, ils corrigent des axes :