真车转向拨杆拆车件+Arduino实现欧卡2游戏内模拟对应功能——第2部分:方案整理
使用 Arduino UNO R3 + 真车灯光总成 + SimHub 实现游戏控制(非 HID 方式)
本方案目标是:
使用真实汽车的灯光拨杆(5pin),通过 Arduino UNO R3 串口传输拨动状态至电脑,再由 SimHub 模拟游戏中的灯光、转向等操作。
不使用 USB HID 模拟键盘或手柄,而是采用串口通信 + SimHub 的按键模拟功能。
不使用 USB HID 模拟的原因是在前期搜集资料前,就图便宜买了UNO R3(ESP-8266EX)开发板,结果发现根本不支持USB HID协议,也就不能模拟成USB设备从而进行自定义按键,只能通过串口发送数据,PC端通过Simhub读取后模拟成键盘操作
一、硬件准备
1. 主控板
- Arduino D1 UNO R3(基于ESP-8266EX,官方UNO R3是基于 ATmega328P)
- 注意:该板无法直接模拟 USB HID,但支持串口通信
2. 拨杆总成
- 真车灯光拨杆(如奥迪/大众/丰田等,淘宝上五菱宏光的18包邮)
- 提供 5 根引脚(4 条信号线 + 1 条共地)
3. 连接
- 将拨杆的 4 条信号线分别连接到 Arduino 的 D2~D5
- 拨杆公共地连接 Arduino GND
拨杆引脚 | 功能 | Arduino 接口 |
---|---|---|
A | 信号1 | D2 |
B | 信号2 | D3 |
C | 信号3 | D4 |
D | 信号4 | D5 |
GND | 公共地线 | GND |
二、工作原理
- 拨动灯光拨杆 → 改变内部连接 → 某些信号线短接到 GND
- Arduino 使用
digitalRead()
检测 4 根输入引脚电平 → 组成 4 位状态码(如 "1011") - 查表将状态码映射为功能名(如 "NEAR_LIGHT")
- Arduino 通过串口
Serial.println()
发送状态名 - SimHub 监听串口 → 将收到的文本与功能进行映射 → 模拟键盘按键或游戏操作
三、Arduino 代码
代码语言:javascript代码运行次数:0运行复制const int pinA = 2;
const int pinB = 3;
const int pinC = 4;
const int pinD = 5;
String lastState = "1111";
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 100;
void setup() {
Serial.begin(115200);
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
pinMode(pinC, INPUT_PULLUP);
pinMode(pinD, INPUT_PULLUP);
}
void loop() {
String currentState = "";
currentState += digitalRead(pinA) == HIGH ? "1" : "0";
currentState += digitalRead(pinB) == HIGH ? "1" : "0";
currentState += digitalRead(pinC) == HIGH ? "1" : "0";
currentState += digitalRead(pinD) == HIGH ? "1" : "0";
if (currentState != lastState && millis() - lastDebounceTime > debounceDelay) {
lastDebounceTime = millis();
lastState = currentState;
if (currentState == "0111") Serial.println("PARKING_LIGHT");
else if (currentState == "1011") Serial.println("NEAR_LIGHT");
else if (currentState == "1101") Serial.println("FAR_LIGHT");
else if (currentState == "1110") Serial.println("FLASH_LIGHT");
else if (currentState == "0011") Serial.println("FOG_LIGHT");
else if (currentState == "0110") Serial.println("LEFT_SIGNAL");
else if (currentState == "1010") Serial.println("RIGHT_SIGNAL");
else if (currentState == "1111") Serial.println("OFF");
}
delay(10);
}
四、SimHub 设置(串口输入 → 键盘模拟)
1. 添加串口设备
- 打开 SimHub → 设置 → 外部设备 → 添加串口设备
- 选择 Arduino 的 COM 口,设置波特率为 115200
2. 映射串口数据 → 键盘模拟
- 进入
控制和事件 → 键盘模拟
- 点击 “添加映射” → 等待串口输入
- 拨动拨杆(Arduino 发送数据)
- SimHub 会显示输入(如 "NEAR_LIGHT")
- 设置该输入对应的虚拟键(如 F6)
- 重复此操作为每种状态添加映射:
状态名 | 映射按键 |
---|---|
NEAR_LIGHT | F6 |
FAR_LIGHT | F7 |
LEFT_SIGNAL | ← |
RIGHT_SIGNAL | → |
FOG_LIGHT | F8 |
PARKING_LIGHT | F5 |
OFF | F10 |
整体效果
- 拨杆拨动后,Arduino 立即通过串口发送状态
- SimHub 自动识别状态名 → 触发配置的按键
- 游戏中表现为灯光/转向灯/雾灯同步控制
- 实现了 真车灯光拨杆 → 游戏内功能 的无缝对接