Construye un volante joystick personalizado con Arduino para gaming
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Potenciómetro rotativo 10kΩ | 1 |
| Arduino UNO | 1 |
| Protoboard | 1 |
Herramientas y máquinas
- Cortadora láser (opcional, para la carcasa)
- Impresora 3D (opcional)
- Arduino Materia 101 (opcional)
Aplicaciones y servicios
- Arduino IDE
Sobre el proyecto
Volante Arduino + Flying Creation
Este proyecto convierte un Arduino UNO en un mando USB tipo joystick reconocible por el sistema operativo, ideal para simuladores de carreras en Steam. La idea surgió porque los volantes comerciales son caros y quería una alternativa DIY.

¿Cómo convertir Arduino en un mando USB?
Se flashea el chip de comunicación del Arduino (ATmega16U2) con el firmware UnoJoy. El proceso es seguro y reversible.
- Descarga la última versión de UnoJoy.
- Instala los drivers ejecutando
InstallUnoJoyDrivers.bat. - Instala la herramienta ATmel FLIP (necesaria para flashear el firmware).
Flashear el firmware
- Pon el Arduino en modo DFU: haz un puente entre los dos pines más cercanos al conector USB (grupo de 6 pines). Los LEDs parpadearán brevemente.
- Ejecuta
TurnIntoAJoystick.batde la carpeta UnoJoy. - Desconecta y reconecta el Arduino: ahora aparecerá como "Joystick" en el administrador de dispositivos.
- Para revertir, repite el puente y ejecuta
TurnIntoAnArduino.bat.
Mando simple (volante)
Conecta el potenciómetro de 10kΩ al pin A0 (terminal central al pin, laterales a 5V y GND). Copia el archivo UnoJoy.h a la carpeta del sketch.

Jugar en Steam
Steam reconoce mandos tipo Xbox 360. Usa x360ce (versión 32 o 64 bits según el juego) para mapear el joystick USB a un mando virtual Xbox 360. Copia x360ce.exe en la carpeta del ejecutable del juego y configúralo.
Código
El sketch usa la librería UnoJoy y envía los valores del potenciómetro como eje X. El código completo está en el repositorio del proyecto.
/* Arduino USB Joystick HID demo */
/* Autor: Darran Hunt, actualizado por RICLAMER 25/03/2014 */
/* Compatible con Arduino UNO (6 ejes, 13 botones) y Mega */
#undef DEBUG
#define NUM_BUTTONS 40
#define NUM_AXES 8
typedef struct joyReport_t {
int16_t axis[NUM_AXES];
uint8_t button[(NUM_BUTTONS + 7) / 8];
} joyReport_t;
joyReport_t joyReport;
uint8_t btn[12];
int fulloff = 0;
void setup() {
for (int portId = 2; portId < 13; portId++) {
pinMode(portId, INPUT_PULLUP);
}
Serial.begin(115200);
delay(200);
for (uint8_t ind = 0; ind < 8; ind++) joyReport.axis[ind] = ind * 1000;
for (uint8_t ind = 0; ind < sizeof(joyReport.button); ind++) joyReport.button[ind] = 0;
}
void sendJoyReport(struct joyReport_t *report) {
#ifndef DEBUG
Serial.write((uint8_t *)report, sizeof(joyReport_t));
#else
// Salida legible para depuración
#endif
}
void setButton(joyReport_t *joy, uint8_t button) {
uint8_t index = button / 8;
uint8_t bit = button - 8 * index;
joy->button[index] |= 1 << bit;
}
void clearButton(joyReport_t *joy, uint8_t button) {
uint8_t index = button / 8;
uint8_t bit = button - 8 * index;
joy->button[index] &= ~(1 << bit);
}
void loop() {
for (int bt = 1; bt < 13; bt++) btn[bt] = digitalRead(bt + 1);
for (int on = 1; on < 13; on++) {
if (btn[on] == LOW) setButton(&joyReport, on + 16);
if (btn[on] == HIGH) clearButton(&joyReport, on + 16);
}
// Ejes analógicos (solo A0 para el volante)
for (uint8_t axis = 0; axis < 2; axis++) {
joyReport.axis[axis] = map(analogRead(axis), 350, 700, -32768, 32767);
}
// Ejes no usados a 0
joyReport.axis[2] = 0;
joyReport.axis[3] = 0;
joyReport.axis[4] = analogRead(A0);
joyReport.axis[5] = analogRead(A3);
joyReport.axis[6] = analogRead(A2);
joyReport.axis[7] = 0;
sendJoyReport(&joyReport);
delay(35);
fulloff = 0;
}
Archivos CAD
volante_iDt4RqmPLZ.dwgvolante_idt4rqmplz_hakHRvVNYD.dxf
Esquemático

Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Transforma un viejo coche RC en un vehículo controlado por joystick con Arduino
- Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
- Juego interactivo con joystick analógico y LEDs en Arduino
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Construye un Brazo Robótico Impreso en 3D Controlado por Arduino – Guía Paso a Paso
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- Puerta de control de temperatura sin contacto para detección rápida y precisa
- Pong Neón en Matriz NeoPixel con Arduino Nano
- Construye un Receptor FM Potente con Arduino y Módulo TEA5767
- Arduino 101: Construye un Podómetro con Sensor DHT11 y Pantalla LCD