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.
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]
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).
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.
}
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.
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.
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);
}
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.
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.
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 :