Construire un quadrant des gaz et une roue de trim personnalisés pour MS Flight Simulator avec Arduino Leonardo et impression 3D
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino Leonardo | 1 | Un Leonardo ou Micro convient, jusqu'à 6 contrôles par Arduino |
| Fil de raccordement | 3 | 3 fils par module |
| Potentiomètre rotatif 50kΩ | 1 | 1 par module, détails dans la section histoire |
Outils et machines nécessaires
- Fer à souder (générique)
- Imprimante 3D (générique)
Applications et services en ligne
- Arduino IDE
À propos du projet
Introduction
Après avoir mis à niveau mon PC pour faire tourner Microsoft Flight Simulator 2020, j'ai voulu améliorer mes commandes. Un clavier n'offre pas le bon ressenti pour piloter, et je ne pouvais ni dédier l'espace ni le budget pour un cockpit complet ou des commandes achetées.

Conception
J'ai conçu une série de commandes en CAO, réalisables avec mes outils, pour approcher le ressenti d'un vrai avion (je n'ai jamais touché aux commandes d'un avion, c'est donc basé sur mon imagination).
J'ai opté pour des leviers simples : gaz, volets, train d'atterrissage, et une roue de trim d'altitude. Je vole principalement sur de petits monomoteurs, donc c'était mon objectif.
La roue de trim a été le plus délicat à concevoir : plusieurs esquisses sur plusieurs jours avant d'obtenir le look et le ressenti souhaités.



Fabrication
Toutes les pièces ont été imprimées en ABS sur mon imprimante UP!, puis peintes et câblées sur un Arduino Leonardo, remplacé ensuite par un Micro. L'objectif : un ensemble plug-and-play, facile à ranger.
Pièces imprimées en 3D
Chaque module levier nécessite :
- 1 × Corps gauche
- 1 × Corps droit
- 1 × Levier avec crans (5 variantes : 2 à 6 crans)
- 1 × Embout de levier
- 1 × Bouton (6 variantes)
- 1 × Plaque de friction (3 variantes)
- 1 × Support de potentiomètre
Chaque module roue nécessite :
- 1 × Corps gauche de la roue de trim
- 1 × Corps droit de la roue de trim
- 1 × Engrenage de la roue de trim
- 1 × Moyeu de la roue de trim
- 1 × Roue de trim (si version assemblée)
- 8 × Ergots de la roue de trim (si version assemblée)
- 1 × Pièce unique de la roue de trim (si version monobloc)
- 1 × Quadrant de la roue de trim
- 1 × Entraînement du quadrant de la roue de trim
- 1 × Support de potentiomètre
Des pièces de boîtier arrière peuvent loger l'Arduino et le câblage.
Conclusion
Une construction très agréable, simple côté code ; le vrai défi était la conception, surtout la roue de trim et l'obtention du bon ressenti.
Code
Quadrant.ino
#include <Joystick.h>
Joystick_ Joystick;
// Valeurs min/max brutes lues sur chaque potentiomètre (à calibrer via le moniteur série)
int axisLimits0[] = {686, 338};
int axisLimits1[] = {345, 695};
int axisLimits2[] = {327, 678};
int axisLimits3[] = {342, 692};
int axisLimits4[] = {0, 1023};
int axisLimits5[] = {0, 1023};
// Activation de chaque axe
bool a0Used = true;
bool a1Used = true;
bool a2Used = true;
bool a3Used = true;
bool a4Used = false;
bool a5Used = false;
// Mode réglage : -1 = normal, 0-5 = affiche la valeur brute et convertie sur le port série
int setting = -1;
void setup() {
if(a0Used) pinMode(A0, INPUT);
if(a1Used) pinMode(A1, INPUT);
if(a2Used) pinMode(A2, INPUT);
if(a3Used) pinMode(A3, INPUT);
if(a4Used) pinMode(A4, INPUT);
if(a5Used) pinMode(A5, INPUT);
Joystick.begin();
if(setting >= 0) Serial.begin(9600);
}
void loop() {
int value = 0, pos = 0;
if(a0Used){
value = analogRead(A0);
pos = translateValue(value, axisLimits0[0], axisLimits0[1]);
Joystick.setThrottle(pos);
if(setting == 0) settingPrint(value, pos);
}
if(a1Used){
value = analogRead(A1);
pos = translateValue(value, axisLimits1[0], axisLimits1[1]);
Joystick.setRxAxis(pos);
if(setting == 1) settingPrint(value, pos);
}
if(a2Used){
value = analogRead(A2);
pos = translateValue(value, axisLimits2[0], axisLimits2[1]);
Joystick.setRyAxis(pos);
if(setting == 2) settingPrint(value, pos);
}
if(a3Used){
value = analogRead(A3);
pos = translateValue(value, axisLimits3[0], axisLimits3[1]);
Joystick.setRzAxis(pos);
if(setting == 3) settingPrint(value, pos);
}
if(a4Used){
value = analogRead(A4);
pos = translateValue(value, axisLimits4[0], axisLimits4[1]);
Joystick.setXAxis(pos);
if(setting == 4) settingPrint(value, pos);
}
if(a5Used){
value = analogRead(A5);
pos = translateValue(value, axisLimits5[0], axisLimits5[1]);
Joystick.setYAxis(pos);
if(setting == 5) settingPrint(value, pos);
}
delay(5);
}
// Convertit une valeur brute en plage 0-1023
int translateValue(int v, int f1, int f2){
int result = 0, start = 0;
float range = 0;
if(f1 < f2){ start = f1; range = f2 - f1; }
else{ start = f2; range = f1 - f2; }
result = (v - start) * (1023 / range);
if(result < 0) result = 0;
if(result > 1023) result = 1023;
return result;
}
void settingPrint(int value, int pos){
Serial.print(value);
Serial.print(" ");
Serial.println(pos);
}
Pièces personnalisées et boîtiers
Fichier STEP contenant toutes les pièces : released_u3k8QjPXzJ.stp
Schémas
Pour ajouter plus de commandes, connectez 5V et GND et utilisez les broches A1 à A5.

Processus de fabrication
- Créer des animations et jeux sur LCD avec Arduino UNO
- Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
- Enregistreur de Température et Humidité Arduino avec DHT11 et Shield Ethernet
- Construisez une molette de trim d'élévateur compacte pour FlightGear avec Arduino Nano
- Contrôle Arduino UNO depuis Python 3 – Communication Série et Démo LED
- Automates Cellulaires Temps Réel sur Arduino avec Écran OLED 128x64
- Construire une Radio FM Compacte avec Arduino Nano et RDA5807M
- Système de pointage RFID temps réel avec Arduino et Google Sheets
- Équilibrage vs géométrie des roues : ce qu'il faut savoir