1. 项目背景与核心思路
十年前那款经典的滚球机械鼠标,现在终于有了新用途。我在整理旧物时翻出一个1998年的罗技机械鼠标,拆开发现内部结构出奇地简单——一个橡胶滚球带动两个垂直方向的编码器。这种原始结构反而给了它改造为光枪控制器的独特优势。
传统光枪原理是通过接收CRT电视的扫描信号来定位,而现代液晶电视无法使用这种技术。我这个方案巧妙利用鼠标的XY轴移动数据,配合Arduino开发板将其转换为屏幕坐标,让老鼠标变身成可以在现代电视上使用的游戏光枪。实测在《死亡之屋》《VR特警》等光枪游戏中,定位精度可以达到±3像素,完全满足怀旧游戏需求。
2. 材料准备与工具清单
2.1 核心材料
- 滚球机械鼠标(推荐90年代罗技或微软型号)
- Arduino Pro Micro开发板(需支持HID模式)
- 3D打印外壳组件(含扳机结构)
- 微动开关(用于扳机键)
- 5mm红色LED(作为"激光"指示)
- 1/4W 220Ω电阻
- 杜邦线若干
2.2 必备工具
- 电烙铁(建议使用恒温型)
- 热熔胶枪
- 万用表
- 剥线钳
- 3D打印机(或使用第三方打印服务)
注意:选择鼠标时务必确认是真正的机械滚球型号。测试方法是拆开看是否有两个垂直安装的编码器轮,光电鼠标无法用于本方案。
3. 硬件改造详解
3.1 鼠标拆解与部件处理
拆开鼠标外壳后,可以看到核心部件是两个正交安装的编码器。用万用表测量编码器引脚,找到A/B相输出端(通常为中间和某一侧引脚)。保留这两个编码器,其他电路板元件均可移除。
将编码器的机械结构用酒精棉片彻底清洁,特别是橡胶滚球的接触面。老鼠标常见的氧化问题会导致信号不稳定,可以用2000目砂纸轻微打磨编码器触点。
3.2 电路连接方案
Arduino Pro Micro与编码器的连接方式:
code复制编码器1 A相 → Arduino D2
编码器1 B相 → Arduino D3
编码器2 A相 → Arduino D4
编码器2 B相 → Arduino D5
微动开关 → Arduino D6
LED正极 → Arduino D7(串联220Ω电阻)
使用热熔胶固定所有接线点,防止游戏过程中震动导致接触不良。特别注意编码器引线比较脆弱,最好先用细铜线加固后再焊接。
4. 固件开发与校准
4.1 Arduino代码解析
核心是通过编码器计数计算位移量。使用Encoder库可以准确捕获正交编码信号:
cpp复制#include <Encoder.h>
#include <Mouse.h>
Encoder enc1(2, 3); // X轴编码器
Encoder enc2(4, 5); // Y轴编码器
void setup() {
pinMode(6, INPUT_PULLUP); // 扳机键
pinMode(7, OUTPUT); // LED
}
void loop() {
static int16_t x=0, y=0;
x = constrain(enc1.read()/4, -127, 127); // 除以4降低灵敏度
y = constrain(enc2.read()/4, -127, 127);
Mouse.move(x, -y, 0); // y轴取反符合屏幕坐标系
enc1.write(0); // 每次归零实现相对位移
enc2.write(0);
digitalWrite(7, !digitalRead(6)); // 按下扳机亮LED
if(!digitalRead(6)) Mouse.click();
delay(10); // 100Hz刷新率
}
4.2 校准技巧
- 在平坦桌面滚动鼠标球10圈,记录Serial输出的最大计数值
- 调整代码中的除数参数(示例中为4),使得快速移动时计数值在±100左右
- 在游戏中微调鼠标速度设置,建议先设置为系统默认的50%
实测发现滚球表面纹理影响很大。原装滚球磨损严重时,可以用砂纸打磨出均匀纹理,或者套上薄橡胶套(如自行车气门芯胶管)。
5. 外壳制作与人体工学设计
5.1 3D打印方案
使用FreeCAD设计符合人体工学的外壳,关键参数:
- 握把倾斜15度
- 扳机行程8mm
- 总重量控制在180g以内
- 顶部开孔容纳原鼠标滚球
打印建议:
- 材料:PLA+(比普通PLA更耐磨)
- 层高:0.2mm
- 填充率:15%
5.2 组装要点
- 将编码器模块用M2螺丝固定在外壳内部支架上
- 滚球与编码器的接触压力要适中(用弹簧调节)
- 扳机键程建议设置为5-7mm,触发行程2mm
- 在握把内部添加配重块改善平衡感
6. 游戏适配与优化
6.1 支持游戏列表
- 《死亡之屋》系列(需用DEMUL模拟器)
- 《VR特警》系列
- 《化解危机》系列
- 《幽灵小队》
- MAME光枪游戏(配置时选择"鼠标"为输入设备)
6.2 模拟器设置技巧
在DEMUL模拟器中:
- 控制设置→输入设备选择"鼠标"
- 光枪游戏专用插件中启用"相对坐标"模式
- 调整"灵敏度"参数至0.5-0.7范围
- 勾选"自动校准"选项
在MAME中:
code复制ctrlr <光枪>
mouse 1
multimouse 1
7. 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 光标跳动 | 编码器接触不良 | 清洁滚球和编码器轮 |
| 单方向失灵 | 某轴编码器接线松动 | 重新焊接并加固线材 |
| 扳机无响应 | 微动开关未接地 | 检查D6引脚是否配置为上拉 |
| LED常亮 | 电阻值过大 | 更换为150-220Ω电阻 |
| 光标漂移 | 滚球压力不均 | 调整编码器支架弹簧张力 |
8. 进阶改装思路
如果想进一步提升性能:
- 改用光学编码器(如AMT102-V),分辨率可提升10倍
- 添加陀螺仪模块实现体感辅助瞄准
- 集成震动马达(需外接驱动电路)
- 使用蓝牙模块实现无线化(推荐ESP32方案)
这个改装最让我惊喜的是老机械编码器的耐用性——经过200小时《死亡之屋》的残酷测试,那对1998年的编码器依然工作如新。下次准备试试用轨迹球鼠标改造双持光枪,那应该会更适合《化解危机2》的双枪模式。
