DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
组件与物料清单
| 组件 | 数量 |
|---|---|
| 旋转电位器 10K | 1 |
| Arduino UNO | 1 |
| 面包板 | 1 |
所需工具
- 激光切割机
- Arduino Materia 101
- 3D 打印机
软件工具
- Arduino IDE
项目简介
Arduino 手柄 + 飞行创作
本项目将 Arduino 改装为 USB 游戏手柄,制作一个模拟摇杆的方向盘,可在 Steam 平台上使用。作为赛车游戏爱好者,键盘和普通手柄体验不佳,而商用方向盘价格昂贵,于是萌生自制念头。
将 Arduino 变身为控制器
核心思路是刷写 Arduino 通信芯片固件,使其被识别为 USB 游戏手柄。过程安全可逆,但操作风险自负。
- 下载 UnoJoy 库,运行
InstallUnoJoyDrivers.bat安装驱动 - 安装 ATmel FLIP 工具,用于刷写固件
刷写固件步骤
- 将 Arduino 置于 DFU 模式:短接 USB 接口旁六针排中最前两针
- 运行
TurnIntoAJoystick.bat刷写手柄固件 - 重新插拔 Arduino,系统将识别为 Joystick
- 恢复方法:同步操作运行
TurnIntoAnArduino.bat
简易控制器电路
10K 电位器接在 A0 引脚,作为方向输入。代码需引用 UnoJoy 库,将 UnoJoy.h 复制到草图目录。
Steam 平台游戏配置
Steam 识别为 Xbox 360 手柄。需使用 x360ce 工具将 USB 手柄映射为虚拟 Xbox 360 手柄:
- 下载对应游戏位数版本(32/64位)
- 将
x360ce.exe放入游戏可执行文件目录 - 运行配置工具,自动检测 USB Joystick
完整视频教程见我的 YouTube 频道。
核心代码
/* Arduino USB Joystick HID demo */
/* Author: Darran Hunt, Public Domain */
/* Updated by RICLAMER 2014/03/25 - 支持模拟/数字端口 */
/* 兼容 Arduino UNO (6轴13键) 和 Arduino 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
// 调试输出
#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() {
// 读取按键状态 (D2-D13)
for (int bt = 1; bt < 13; bt++) btn[bt] = digitalRead(bt + 1);
// 按键映射到手柄按钮 17-28
for (int on = 1; on < 13; on++) {
if (btn[on] == LOW) setButton(&joyReport, on + 16);
if (btn[on] == HIGH) clearButton(&joyReport, on + 16);
}
// 模拟轴映射 (仅使用 A0 作为 X 轴/方向盘)
for (uint8_t axis = 0; axis < 2; axis++) {
joyReport.axis[axis] = map(analogRead(axis), 350, 700, -32768, 32767);
}
// 未使用轴置零
joyReport.axis[3] = 0;
joyReport.axis[4] = 0; // A1 需接地
joyReport.axis[5] = 0;
joyReport.axis[6] = 0;
joyReport.axis[7] = 0;
joyReport.axis[8] = 0;
sendJoyReport(&joyReport);
delay(35);
fulloff = 0;
}
3D 模型文件
- volante_iDt4RqmPLZ.dwg
- volante_idt4rqmplz_hakHRvVNYD.dxf
原理图
电路连接图请参考项目附件。
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 废旧遥控车改装:Arduino + USB Host Shield 实现 Xbox 手柄无线控制
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Arduino + 模拟摇杆互动游戏:五向 LED 反馈
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- 非接触体温筛查闸机:Arduino MKR1000 + 红外测温 + 舵机控制
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
- Arduino RGB 颜色混合器 – 分步制作教程