Construye un cuadrante de acelerador personalizado y rueda de trim para MS Flight Simulator con Arduino Leonardo e impresión 3D
Componentes y suministros
| Componente | Descripción | Cantidad |
|---|---|---|
| Arduino Leonardo | Un Leonardo o Micro es adecuado para este proyecto, hasta 6 controles posibles por cada Arduino | 1 |
| Cable de conexión | 3 cables por módulo | 3 |
| Potenciómetro rotativo 50k | 1 por módulo (detalles en la sección de historia) | 1 |
Herramientas y máquinas necesarias
- Soldador (genérico)
- Impresora 3D (genérica)
Aplicaciones y servicios en línea
- Arduino IDE
Sobre el proyecto
Introducción
Tras actualizar mi PC para ejecutar Microsoft Flight Simulator 2020, me inspiré para mejorar los controles que utilizaba. Un teclado no ofrece la sensación adecuada para volar y quería mejorar la experiencia sin dedicar mucho espacio ni dinero a un cockpit completo ni a controles comerciales.

Diseño
Me puse a diseñar en CAD un conjunto de controles que pudiera fabricar con mis herramientas y que diera una experiencia razonable de lo que imagino que se siente al volar un avión real (nunca he tocado los controles de un avión, así que me basé en mi imaginación).
Decidí que quería palancas individuales para acelerador, flaps, tren de aterrizaje y una rueda de trim de elevador. Como vuelo principalmente aviones ligeros monomotor en el simulador, me centré en ese tipo de aeronaves.
La rueda de trim fue el mayor reto de diseño y me llevó varios bocetos durante muchos días hasta lograr un diseño que proporcionara el aspecto y la sensación deseados.



Construcción
Todas las piezas se imprimieron en 3D con ABS en mi impresora UP!, luego se pintaron y cablearon a un Arduino, empezando con un Leonardo y luego cambiando a un Micro. El objetivo era obtener una unidad plug-and-play que se pueda guardar fácilmente cuando no se use.
Piezas
Lista de piezas impresas en 3D
Cada módulo de palanca requiere:
- 1 x Cuerpo izquierdo
- 1 x Cuerpo derecho
- 1 x Palanca con x detentes, 5 variantes disponibles (2-6 detentes)
- 1 x Extremo de palanca
- 1 x pomo, 6 variantes disponibles
- 1 x Placa de fricción, 3 variantes disponibles
- 1 x Soporte de potenciómetro
Cada módulo de rueda requiere:
- 1 x Cuerpo izquierdo de rueda de trim
- 1 x Cuerpo derecho de rueda de trim
- 1 x Engranaje de rueda de trim
- 1 x Cubo de rueda de trim
- 1 x Rueda de trim (si se hace la rueda ensamblada)
- 8 x Nódulos de rueda de trim (si se hace la rueda ensamblada)
- 1 x Pieza única de rueda de trim (si se hace la rueda de una pieza)
- 1 x Cuadrante de rueda de trim
- 1 x Accionamiento de cuadrante de rueda de trim
- 1 x Soporte de potenciómetro
Las piezas de la caja trasera pueden usarse para alojar el Arduino y el cableado.
Conclusión
Una construcción muy agradable, muy sencilla desde el punto de vista de la programación; el verdadero reto fue el diseño, especialmente la rueda de trim y conseguir la sensación adecuada.
Código
Quadrant.ino
Utiliza la variable de configuración y el monitor serie para encontrar los valores de punto final de cada potenciómetro, introdúcelos en el array axisLimits.
#include <Joystick.h>
Joystick_ Joystick;
// Valores máximos y mínimos de analogRead para cada eje
// Se traducen a un rango de 0 - 1023
int axisLimits0[] = {686, 338};
int axisLimits1[] = {345, 695};
int axisLimits2[] = {327, 678};
int axisLimits3[] = {342, 692};
int axisLimits4[] = {0, 1023};
int axisLimits5[] = {0, 1023};
// Activar/desactivar ejes
bool a0Used = true;
bool a1Used = true;
bool a2Used = true;
bool a3Used = true;
bool a4Used = false;
bool a5Used = false;
// Modo configuración: imprime valores en monitor serie
// int setting = -1; // sin impresión
// int setting = 2; // valores 0-5, imprime valores del pin
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;
int 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){
// Traduce valores a rango 0 - 1023
int result = 0;
int 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);
}
Piezas personalizadas y envolventes
Archivo STEP con todas las piezas: released_u3k8QjPXzJ.stp
Esquemáticos
Para añadir más controles, conecta 5V y GND y usa los pines A1 a A5.
Archivo: quadrant_ZkMygPyRiE.fzz
Proceso de manufactura
- Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
- Rueda de Trimado Compacta para FlightGear con Arduino Nano: Control Analógico DIY
- Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
- Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
- Construye una Radio FM Compacta con Arduino Nano y RDA5807M
- Sistema de control de asistencia RFID en tiempo real con Arduino y Google Sheets
- Integración IoT: Control Remoto de Arduino mediante Apps UWP Windows 10
- MKR1000 con DHT22: Monitorización de Temperatura y Humedad en Tiempo Real a Azure
- Equilibrado vs. Alineación de Ruedas: Lo Que Necesitas Saber