Bouw een aangepaste manettekwadrant en trimwiel voor MS Flight Simulator met Arduino Leonardo en 3D-printen
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerking |
|---|---|---|
| Arduino Leonardo (of Micro) | 1 | Geschikt voor maximaal 6 bedieningen per Arduino |
| Aansluitdraad | 3 | 3 draden per module |
| Draaipotentiometer 50k | 1 | 1 per module, zie details in bouwverhaal |
Benodigde tools en machines
- Soldeerbout
- 3D-printer
Apps en online diensten
- Arduino IDE
Over dit project
Inleiding
Na een upgrade van mijn pc om Microsoft Flight Simulator 2020 te kunnen draaien, wilde ik de besturing verbeteren. Een toetsenbord biedt niet het juiste gevoel voor vliegen, maar een volledige cockpit of dure professionele controls waren geen optie vanwege ruimte en budget.
Ontwerp
Ik ontwierp in CAD een set besturingselementen die ik met mijn tools kon maken en die een realistisch gevoel geven. Ik richtte me op kleine eenmotorige vliegtuigen, omdat ik die voornamelijk vlieg. De trimwiel was het meest uitdagend; het kostte meerdere schetsen en dagen om een ontwerp te vinden dat er goed uitzag en goed voelde.
Bouw
Alle onderdelen zijn in ABS geprint op mijn UP!-printer, daarna geschilderd en aangesloten op een Arduino (eerst een Leonardo, later een Micro). Het resultaat is een plug-and-play unit die eenvoudig op te bergen is.
Onderdelenlijst (3D-geprint)
Per hefbelmodule:
- 1× Linker body
- 1× Rechter body
- 1× Hefbel met klikken (5 varianten: 2 tot 6 klikken)
- 1× Hefbeleind
- 1× Knop (6 varianten)
- 1× Wrijvingsplaat (3 varianten)
- 1× Potentiometerhouder
Per trimwielmodule:
- 1× Linker trimwiel-body
- 1× Rechter trimwiel-body
- 1× Trimwieltandwiel
- 1× Trimwielnaaf
- 1× Trimwiel (samengevoegd)
- 8× Trimwielknoppen (voor samengevoegd wiel)
- 1× Trimwiel (één stuk)
- 1× Trimwielkwadrant
- 1× Trimwielkwadrant-aandrijving
- 1× Potentiometerhouder
Optioneel: achterbak-onderdelen om de Arduino en bedrading te behuizen.
Conclusie
Een heel leuk project. De programmering was eenvoudig; de echte uitdaging lag in het ontwerp, vooral het trimwiel en het realiseren van het juiste gevoel.
Code
Bestand: Quadrant.ino
Gebruik de instellingvariabele en de seriële monitor om de eindwaarden van elke potentiometer te bepalen en vul ze in het axisLimits-array.
#include <Joystick.h>
Joystick_ Joystick;
int axisLimits0[] = {686, 338};
int axisLimits1[] = {345, 695};
int axisLimits2[] = {327, 678};
int axisLimits3[] = {342, 692};
int axisLimits4[] = {0, 1023};
int axisLimits5[] = {0, 1023};
bool a0Used = true;
bool a1Used = true;
bool a2Used = true;
bool a3Used = true;
bool a4Used = false;
bool a5Used = false;
int setting = -1; // -1 = geen seriële output, 0-5 = print pinwaarden
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);
}
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);
}
Aangepaste onderdelen en behuizingen
STEP-bestand met alle onderdelen: released_u3k8QjPXzJ.stp
Schema's
Schema voor extra bedieningen: sluit 5V en GND aan en gebruik pinnen A1 tot A5.
Bestand: quadrant_ZkMygPyRiE.fzz
Productieproces
- Bouw Boeiende LCD Animaties & Games met Arduino UNO
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- Arduino temperatuur- en vochtigheidslogger met DHT11 en Ethernet Shield
- Compacte Analog Trim Tab Wiel voor FlightGear met Arduino Nano
- Python 3 naar Arduino UNO: Eenvoudige Commando Besturing en LED Demo
- Bouw Real-Time Cellulaire Automaten op Arduino met 128x64 OLED Display
- Bouw een compacte FM-radio met Arduino Nano en RDA5807M
- Real-time RFID aanwezigheidssysteem met Arduino en Google Sheets
- IoT-integratie: Arduino Op afstand Besturen via Windows 10 UWP Apps
- MKR1000 met DHT22: Realtime temperatuur‑ en vochtigheidsmonitoring naar Azure
- Wielbalanceren vs. Wieluitlijning: wat u moet weten