[ARDUINO] Affichage analogique

Fabrication de cockpit et divers ( palonnier , panels ..) c est ICI
Avatar de l’utilisateur

Topic author
Topper Harley.
Nouvelle Recrue
Nouvelle Recrue
Messages : 28
Inscription : 13 avril 2012

[ARDUINO] Affichage analogique

#1

Message 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.
Avatar de l’utilisateur

Cat
Pilote Philanthrope
Pilote Philanthrope
Messages : 10808
Inscription : 30 juin 2008

Re: [ARDUINO] Affichage analogique

#2

Message 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º
Image

Core i5-4690K @ 3.5 GHz - 8Go RAM - Carte graphique GTX 970 - (Cougar + FSSB) - TPR - W10 64bits sur SSD - EdTracker - Un pit
Avatar de l’utilisateur

Topic author
Topper Harley.
Nouvelle Recrue
Nouvelle Recrue
Messages : 28
Inscription : 13 avril 2012

Re: [ARDUINO] Affichage analogique

#3

Message 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 ;-).
Image
Avatar de l’utilisateur

Myoda
Pilote Philanthrope
Pilote Philanthrope
Messages : 569
Inscription : 29 décembre 2014

Re: [ARDUINO] Affichage analogique

#4

Message 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 !
L'histoire du pit sur Checksix : viewtopic.php?f=286&t=192908
Télécharger mon programme : http://f4toserial.com
La chaîne Youtube : https://www.youtube.com/channel/UChAv6B ... 1J7oDf-W1w
Les photos du cockpit : https://photos.app.goo.gl/BqyyyjkKzo2ZjdoF9
Avatar de l’utilisateur

MIKE-SIMULATION
Pilote Confirmé
Pilote Confirmé
Messages : 2333
Inscription : 05 décembre 2003

Re: [ARDUINO] Affichage analogique

#5

Message 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
Image
Avatar de l’utilisateur

Topic author
Topper Harley.
Nouvelle Recrue
Nouvelle Recrue
Messages : 28
Inscription : 13 avril 2012

Re: [ARDUINO] Affichage analogique

#6

Message 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.
Image
Avatar de l’utilisateur

Milos
Dieu vivant
Dieu vivant
Messages : 22617
Inscription : 27 janvier 2004

Re: [ARDUINO] Affichage analogique

#7

Message 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:
(\_/)
(_'.')
(")_(") "On obtient plus de choses avec un mot gentil et un pistolet qu'avec le mot gentil tout seul" Al Capone.

Mon pit
Avatar de l’utilisateur

MIKE-SIMULATION
Pilote Confirmé
Pilote Confirmé
Messages : 2333
Inscription : 05 décembre 2003

Re: [ARDUINO] Affichage analogique

#8

Message 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
Image
Répondre

Revenir à « Cockpit & mod perso »