Boitier

Réaliser un boitier de commandes pour Fsx


Le coeur du boitier est constitué d'un microcontroleur Arduino Uno, quand aux commandes elles sont constituées de switch, push,  potentiometres et joystick le tout pour une trentaine d'euros.
L'Arduino Uno permet de gérer 6 axes et 12 contacts. Le boitier présenté en photo utilise 5 axes et 7 contacts. La liaison avec FSX ou P3D se fait avec mon application FsxBox réalisée en C# pilotant Simconnect.

Exemple de réalisation :

La première étape consiste à se procurer les composants suivants :
  • carte Arduino uno ou compatible
  • 1 joystick type ps2 ou plus grand selon le confort souhaité
  • 3 potentiometres 10k de résistance
  • 3 push-boutons
  • 4 switchs
Schéma de montage électrique des composants :



Téléchargez ensuite le sdk Arduino à partir du site officiel 
Installez le sdk et les pilotes de la carte
Recopiez le code suivant :

//----------------------------------------------------------------
// application pour console de commande d'avion (FSX) 14/10/2016
// révision du 06/06/2017
//----------------------------------------------------------------
// variables globales pour la conservation des valeurs
int joyX;
int joyY;
int neutreX;
int neutreY;
int neutreTMP;
int addX;
int addY;
int addTMP;
int moteur;
int rich;
int pas;
unsigned long temp;
bool boutonA;
bool boutonB;
bool boutonC;
bool boutonD;
bool boutonE;
bool boutonF;
bool boutonG;
bool start;
//----------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  delay(50);
  // initialisation potentiometres
  neutreX = 5;   // reglage pour retour à zéro du joystick x (à étalonner)
  neutreY = 6;   // reglage pour retour à zéro du joystick y (à étalonner)
  neutreTMP = 5;  // reglage pour throttle-mixture-propeller (à étalonner)
  addX = -15;    // reglage decalage zero du joystick (à étalonner)
  addY = 17;    // reglage decalage zero du joystick (à étalonner)
  addTMP = -10;  // reglage zero du throttle-mixture-propeller (à étalonner)
  temp = 0;
  start = false;
  initPotar(joyX, 'X', 0, -511, 512, neutreX, addX);
  initPotar(joyY, 'Y', 1, -511, 512, neutreY, addY);
  initPotar(moteur, 'M', 2, 0, 1023, neutreTMP, addTMP);
  initPotar(rich, 'R', 3, 0, 1023, neutreTMP, addTMP);
  initPotar(pas, 'P', 4, -511, 512, neutreTMP, addTMP);
  // initialisation boutons
  initBouton(boutonA, 'A', 8);
  initBouton(boutonB, 'B', 9);
  initBouton(boutonC, 'C', 10);
  initBouton(boutonD, 'D', 11);
  // initialisation push-boutons
  initPush(boutonE, 5);
  initPush(boutonF, 6);
  initPush(boutonG, 7);
}
//----------------------------------------------------------------
void loop() {
  delay(50);
  // capture la valeur des potentiometres
  potar(joyX, 'X', 0, -511, 512, neutreX, addX);
  potar(joyY, 'Y', 1, -511, 512, neutreY, addY);
  potar(moteur, 'M', 2, 0, 1023, neutreTMP, addTMP);
  potar(rich, 'R', 3, 0, 1023, neutreTMP, addTMP);
  potar(pas, 'P', 4, -511, 512, neutreTMP, addTMP);
  // capture l'état des boutons
  bouton(boutonA, 'A', 8);
  bouton(boutonB, 'B', 9);
  bouton(boutonC, 'C', 10);
  bouton(boutonD, 'D', 11);
  // capture l'état des push-boutons
  push(boutonE, 'E', 5);
  push(boutonF, 'F', 6);
  push(boutonG, 'G', 7);
  if (start) {
    initPotar(joyX, 'X', 0, -511, 512, neutreX, addX);
    initPotar(joyY, 'Y', 1, -511, 512, neutreY, addY);
    initPotar(moteur, 'M', 2, 0, 1023, neutreTMP, addTMP);
    initPotar(rich, 'R', 3, 0, 1023, neutreTMP, addTMP);
    initPotar(pas, 'P', 4, -511, 512, neutreTMP, addTMP);
    initBouton(boutonA, 'A', 8);
    initBouton(boutonB, 'B', 9);
    initBouton(boutonC, 'C', 10);
    initBouton(boutonD, 'D', 11);
    start = false;
  }
}
//----------------------------------------------------------------
void initPotar(int &arg, char c, int canal, int q1, int q2, int ntr, int add) {
  arg = map(analogRead(canal), 0, 1023, q1, q2) + add;
  if (abs(arg) <= ntr) arg = 0;
  Serial.print(" ");
  Serial.print(arg);
  Serial.print(c);
  Serial.print(".");
}
//----------------------------------------------------------------
void potar(int &arg, char c, int canal, int q1, int q2, int ntr, int add) {
  int val = map(analogRead(canal), 0, 1023, q1, q2) + add;
  if (abs(val) <= ntr) val = 0;
  if (abs(arg - val) > 4) {
    arg = val;
    Serial.print(" ");
    Serial.print(arg);
    Serial.print(c);
    Serial.print(".");
  }
}
//----------------------------------------------------------------
void initBouton(bool &arg, char c, int canal) {
  pinMode(canal, INPUT_PULLUP);
  arg = digitalRead(canal);
  Serial.print(" ");
  Serial.print(arg);
  Serial.print(c);
  Serial.print(".");
}
//----------------------------------------------------------------
void bouton(bool &arg, char c, int canal) {
  bool val = digitalRead(canal);
  if (val != arg) {
    arg = val;
    Serial.print(" ");
    Serial.print(arg);
    Serial.print(c);
    Serial.print(".");
  }
}
//----------------------------------------------------------------
void initPush(bool &arg, int canal) {
  pinMode(canal, INPUT_PULLUP);
  arg = true;
}
//----------------------------------------------------------------
void push(bool &arg, char c, int canal) {
  if ((millis() - temp) < 200) return;
  bool val = digitalRead(canal);
  if (val != arg) {
    arg = val;
    if (!arg) {
      Serial.print(" ");
      Serial.print(1);
      Serial.print(c);
      Serial.print(".");
      start = (canal == 7);
      temp = millis();
    }
  }
}
//-------------------------------------------- fin ----------------

Dernière étape :
téléversez le code dans la carte Arduino et procéder à l'étalonnage des valeurs neutres

Il vous reste maintenant à observer l'effet des commandes avec Fsx.


Commentaires