Page 1 sur 1

[ARDUINO] Affichage analogique

Publié : dim. août 09, 2015 10:00 am
par Topper Harley.
Le cockpit du F16 est composé de plusieurs cadrans analogiques (cadrans à aiguille) qu'il va falloir reproduire et surtout, qu'il va falloir gérer afin qu'ils affichent les données exactes renvoyées par BMS.

Pour arriver à ce but, la plupart des tutos que j'ai lu utilisent des servomoteur, et c'est logique. Car comme me faisait remarquer très justement Two-Golf, le servo moteur a les avantages d'avoir assez de puissance pour commander un jeu d'engrenage (donc avoir une course de déplacement d'aiguille facilement définissable) et de pouvoir être positionné précisément à un endroit souhaité.

Avec une telle introduction, vous pouvez tout naturellement en déduire que les servos seront l'objet de cet article, mais.... non, on va utiliser une autre méthode d'affichage analogique : l'ampèremètre (ou galvanomètre, c'est la même chose). Son principe de fonctionnement est simple : le courant traverse une bobine qui crée un champ magnétique qui va faire varier une aiguille.
Le choix d'utiliser un ampèremètre comme afficheur analogique a été complètement dû au hasard : j'ai deux ampèremètres analogiques de 1 mA (milliampères)dans mon fouillis, et ce qu'il sera à mon avis surtout intéressant dans cet article est de savoir calculer des valeur de résistance.

L'avantage de cette solution est qu'il offre une réponse très rapide, mais il y a plusieurs inconvénients dont la nécessité de maintenir un courant pour que l'aiguille ne soit pas en position 0, et la force motrice quasi nulle de l'aiguille.
Dans le F16, cette solution pourrait être mise en place pour les cadrans le position du trim et du pitch, si toutefois vous acceptez l'idée que hors tension les aiguilles sont sur leur butée (et non pas au milieu).

Côté arduino, la tension de sortie varie de 0 à 5V (1) sur ses broches analogiques, et cette variation sera donnée par le second argument de la fonction analogWrite.:

Code : Tout sélectionner

analogWrite (pin, valeur); //pin : numéro de la broche de l'arduino / valeur : chiffre de 0 (0v) à 255 (+5v).

Notez que seules les broches avec un signe ~ permettent de délivrer un signal analogique.

Enfin, pour réaliser le circuit : on a d'un côté une tension maximum de 5V, et d'un autre côté on veut mesurer une intensité maximum de 1mA (0.001Ampère). La relation entre la tension et l'intensité est établie au travers d'une résistance selon la formule U=RI (la loi d'ohm).

U=RI ---ou----> Tension = Resistance * Intensité ---ou----> Volt = ohm * Ampère

Dans notre cas, puisqu'on connait U (5V) et I (0.001A) on modifie la formule pour chercher R. Cela donne : R=U/I donc R = 5/0.001 donc R=5000ohm (5kh).
Il faut donc mettre une résistance de 5000 ohm (5 kiloOhm) pour que la tension maximum de 5v affiche une intensité de 1mA.

Et si on veut calculer la puissance dégagée par cette résistance, il faut utiliser la formule :
P=UI ---ou----> Puissance = Tension*Intensité ---ou----> Watt=Volt*Ampère.

Ce qui nous donne : 5x0.001 = 0.005watt. (En faisant la synthèse des deux formules précédentes, on aurait pu faire aussi P=RI²). L'intérêt de calculer la puissance dissipée par la résistance détermine le type de résistance à employer. Dans notre cas, nous pourrons employer des résistance "classiques" d'1/4 de watt sans risquer de les endommager (bien qu'il n'y ait pas trop de risque avec des tensions si basses).

Un petit essai pour s'assurer que tout fonctionne :
Le schéma :
Image

Le code :

Code : Tout sélectionner

int analogPin = 3; // Broche choisie void setup(){ pinMode(analogPin, OUTPUT); } void loop(){ analogWrite(analogPin, 0); // valeur minimum (0) delay(1000); // 1seconde analogWrite(analogPin, 127); // milieu delay(1000); // 1seconde analogWrite(analogPin, 255); // valeur maximum, correspondant à 5v. delay(1000); // 1seconde analogWrite(analogPin, 127); // milieu delay(1000); // 1seconde }
Avec une valeur de 0, l'aiguille doit rester sur sa butée.
Avec une valeur de 127, l'aiguille doit être au milieu.
Avec une valeur de 255, l'aiguille doit être au maximum.

Ce qui nous donnera ça :



Application

A présent, pour appliquer cet affichage au cockpit de BMS, il suffit d'extraire la valeur désirée de BMS, la convertir en une valeur de 0 à 255 et l'envoyer sur l'arduino qui va l'afficher sur le cadran.

Prenons un exemple avec le cadran d'indication du trim manuel.

Dans la mémoire partagée, il s'agit de lire la valeur flightData->TrimPitch(si vous ne comprenez pas cette phrase, lisez les articles 2: accès à la mémoire partagée, 4: La rencontre ). Le fichier Flight data.h indique que cette valeur de TrimPitch a une plage de valeur va de -0.5 à +0.5, c'est sur cette base qu'il va falloir convertir en une donnée de 0 à 255.

Pour le programme C++ côté PC, l'accès à la mémoire partagée et la classe Serial (très légèrement modifiée) sont les mêmes que ceux précédemment utilisés dans l'article 4: La rencontre.

Le programme principal sera le suivant :

Code : Tout sélectionner

#include "stdafx.h" #include <windows.h> #include <iostream> using namespace std; HANDLE gSharedMemHandle = NULL; void* gSharedMemPtr = NULL; int main (void){ FlightData* flightData; do{ gSharedMemHandle = OpenFileMapping(FILE_MAP_READ, TRUE, TEXT("FalconSharedMemoryArea")); printf ("Unable to open file. Is Falcon Running?\n"); }while (!gSharedMemHandle); gSharedMemPtr = MapViewOfFile(gSharedMemHandle, FILE_MAP_READ, 0, 0, 0); flightData = (FlightData*)gSharedMemPtr; while (TRUE){ int a = 128+(flightData->TrimPitch)*255; //Conversion en une valeur de 0 à 255 Serial Serial("\\\\.\\COM16"); //mettez ici le port qu'utilise votre arduino Serial.WriteData(&a,1); } // Close shared memory area if (gSharedMemPtr){ UnmapViewOfFile(gSharedMemPtr); gSharedMemPtr = NULL; } CloseHandle (gSharedMemHandle); return 0; }

Côté arduino, il faut récupérer les données transmises par le PC et l'envoyer vers l'afficheur analogique. Ce sera très simple :

Code : Tout sélectionner

int analogPin = 3; // Broche choisie void setup(){ Serial.begin(9600); pinMode(analogPin, OUTPUT); } void loop(){ if (Serial.available()) { byte received = Serial.read(); analogWrite(analogPin, received); // } delay(1); }

Enfin, pour le "fun" vous pourrez enlever l'étiquette de fond de l'ampèremètre, la scanner, la modifier, l'imprimer à l'échelle 1 puis la remettre dans l'ampèremètre, pour donner un effet moins "scolaire".


Et maintenant, la petite vidéo qui va bien :




Le code source du programme C++ et du code arduino sont disponibles si vous les désirez



(1) en vrai, arduino ne délivre que du 0 et du 5v, mais il peut le faire selon une fréquence qui va donner, en moyenne, la tension désirée.

Re: [ARDUINO] Affichage analogique

Publié : jeu. août 13, 2015 9:10 am
par Cat
il existe un autre moyen, c'est d'utiliser des moteurs de compteur de vitesse de voiture qui comportent deux bobines (le nom ne me revient pas), on a ainsi au moins un debattement de 270º

Re: [ARDUINO] Affichage analogique

Publié : jeu. août 13, 2015 6:49 pm
par Topper Harley.
cat plombe a écrit :il existe un autre moyen, c'est d'utiliser des moteurs de compteur de vitesse de voiture qui comportent deux bobines (le nom ne me revient pas), on a ainsi au moins un debattement de 270º
Effectivement Cat, ce sont des "air-core motors" : principe identique au galvanomètre, mais doublé. L'utilisation est en revanche beaucoup plus compliquée. Si je peux, un jour je ferai un article dessus, car j'ai récupéré ceux du tableau de bord de la 406 de ma femme ;-).

Re: [ARDUINO] Affichage analogique

Publié : sam. août 15, 2015 5:39 am
par Myoda
Super boulot en tout cas ! :notworthy
Je suis partis sur des servomoteur 360, mais je trouve la technique intéressante ! d'autant plus que le système est plus véloce ! :yes:
Par contre, j'ai des doutes sur l'intégration dans le pit ! Mais chapeau l'artiste !

Re: [ARDUINO] Affichage analogique

Publié : sam. août 15, 2015 1:07 pm
par MIKE-SIMULATION
Salut ton travail à l'air prometteur :yes: a tu une méthode pour la boussole parce que j'ai une vrai boussole et je voudrais l'intégrer dans mon pit

Re: [ARDUINO] Affichage analogique

Publié : dim. août 16, 2015 10:33 am
par Topper Harley.
MIKE-SIMULATION a écrit :Salut ton travail à l'air prometteur :yes: a tu une méthode pour la boussole parce que j'ai une vrai boussole et je voudrais l'intégrer dans mon pit
Bonjour Mike.

une boussole comme ça ?
Image

Non, je n'ai pas de méthode spéciale. A priori, je dirai que ça ressemble beaucoup aux jauges qu'on a évoqué précédemment : un champs magnétique influe sur la position d'un corps aimanté.

Sinon, en regardant vite fait sur Google, j'ai vu ça : http://arduining.com/2012/03/04/arduino ... pper-test/ mais il faut mettre en application, et espérer que le résultat soit celui attendu. D'ailleurs, je me demande pourquoi ils mettent quatre bobines, car en inversant la polarité de deux d'entre elles, on devrait arriver au même résultat. Bizarre.
Je me pencherai sur le sujet.

Re: [ARDUINO] Affichage analogique

Publié : jeu. août 20, 2015 1:03 pm
par Milos
MIKE-SIMULATION a écrit :a tu une méthode pour la boussole parce que j'ai une vrai boussole et je voudrais l'intégrer dans mon pit
D'un autre côté, l'emploi d'une vraie boussole est assez limité dans un pit. A la rigueur, à moins de prélever là barre graduée et motoriser. Ca se fait, je l'ai déjà vu, mais ... :emlaugh:

Re: [ARDUINO] Affichage analogique

Publié : jeu. août 20, 2015 5:44 pm
par MIKE-SIMULATION
J'ai une boussole dans mon pit fait avec un écran de 2,5" mais comme j'ai une vrai boussole de f16 j'aimerais l intégré, lui intégré un stepper sous la roue graduée version arend