亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南

组件与物料清单

组件数量
旋转电位器 10K1
Arduino UNO1
面包板1

所需工具

软件工具

项目简介

Arduino 手柄 + 飞行创作

本项目将 Arduino 改装为 USB 游戏手柄,制作一个模拟摇杆的方向盘,可在 Steam 平台上使用。作为赛车游戏爱好者,键盘和普通手柄体验不佳,而商用方向盘价格昂贵,于是萌生自制念头。

将 Arduino 变身为控制器

核心思路是刷写 Arduino 通信芯片固件,使其被识别为 USB 游戏手柄。过程安全可逆,但操作风险自负。

  1. 下载 UnoJoy 库,运行 InstallUnoJoyDrivers.bat 安装驱动
  2. 安装 ATmel FLIP 工具,用于刷写固件

刷写固件步骤

  1. 将 Arduino 置于 DFU 模式:短接 USB 接口旁六针排中最前两针
  2. 运行 TurnIntoAJoystick.bat 刷写手柄固件
  3. 重新插拔 Arduino,系统将识别为 Joystick
  4. 恢复方法:同步操作运行 TurnIntoAnArduino.bat

简易控制器电路

10K 电位器接在 A0 引脚,作为方向输入。代码需引用 UnoJoy 库,将 UnoJoy.h 复制到草图目录。

Steam 平台游戏配置

Steam 识别为 Xbox 360 手柄。需使用 x360ce 工具将 USB 手柄映射为虚拟 Xbox 360 手柄:

  1. 下载对应游戏位数版本(32/64位)
  2. 将 x360ce.exe 放入游戏可执行文件目录
  3. 运行配置工具,自动检测 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 模型文件

原理图

电路连接图请参考项目附件。

制造工艺

  1. Arduino 数字骰子:LCD 显示随机点数的电子骰子
  2. 废旧遥控车改装:Arduino + USB Host Shield 实现 Xbox 手柄无线控制
  3. DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
  4. Arduino + 模拟摇杆互动游戏:五向 LED 反馈
  5. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  6. 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
  7. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  8. 非接触体温筛查闸机:Arduino MKR1000 + 红外测温 + 舵机控制
  9. Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
  10. Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
  11. Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
  12. Arduino RGB 颜色混合器 – 分步制作教程