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 :
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 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.