基于Arduino的PS/2轨迹球USB协议转换与HID设备模拟实战
1. 项目概述与核心思路
手头有个老物件,罗技的A161轨迹球,PS/2接口的,成色不错,滚球顺滑,按键手感也扎实。但现在的电脑,主板上那个圆圆的PS/2口早就消失得无影无踪了,让它直接吃灰实在可惜。正好最近在鼓捣一个客制化键盘的项目,想集成一个指点设备,这个轨迹球就成了我的改造目标。我的思路很简单:用一块Arduino开发板作为“翻译官”,让它读取PS/2协议的数据,然后通过USB接口,把自己伪装成一个标准的USB鼠标报告给电脑。这样一来,这个老古董就能在现代任何一台电脑上即插即用了,而且因为核心控制权在我们自己手里,移动速度、按键映射甚至额外的宏功能,都可以随心所欲地定制。
这个方案的核心在于协议转换和角色模拟。PS/2是一种相对古老、基于时钟同步的串行通信协议,而USB HID(人机接口设备)是现在操作系统即插即用、无需额外驱动的标准。Arduino Leonardo(或者它的兄弟Pro Micro)这类板子天生就带USB功能,并且Arduino官方提供了Mouse.h库,让我们可以轻松地命令开发板“扮演”成一个鼠标。剩下的关键,就是找到一个能稳定、准确解读PS/2鼠标数据流的库,把轨迹球传来的原始移动和按键信息“翻译”成Arduino能理解的数字信号。经过一番搜寻和测试,PS2-Mouse-Arduino这个库成了我的首选,它封装了底层通信细节,让我们可以专注于上层逻辑。
整个改造过程,从硬件连线到代码调试,更像是一次与老硬件协议的对话。你需要理解PS/2那两根线(时钟和数据)在“说”什么,然后用Arduino“听”懂并“转述”给电脑。下面,我就把这次改造的详细步骤、关键代码解析以及我踩过的几个坑,毫无保留地分享出来。无论你是想复活一个旧设备,还是想在DIY项目中集成独特的输入方式,这套方案都值得一试。
2. 硬件准备与连接详解
2.1 核心元件清单与选型考量
工欲善其事,必先利其器。我们先来清点一下需要哪些东西,以及为什么选它们。
-
罗技A161轨迹球模块:这是本次改造的主角。它是一个完整的轨迹球组件,内部已经集成了光学传感器(或机械编码器)和微动开关,并通过一个4针的PS/2接口输出标准信号。你可以在一些二手平台或电子元件市场找到它。选择它是因为其结构紧凑、性能可靠,是罗技经典产品的核心部件。
-
Arduino开发板:这是项目的大脑。必须选择带有原生USB HID支持功能的型号。
- 首选:Arduino Leonardo 或 Arduino Pro Micro。这两款板子使用的ATmega32U4芯片内置了USB控制器,可以直接使用
Mouse.h、Keyboard.h等库模拟USB设备,无需任何额外转接芯片。Pro Micro体积更小,更适合集成到最终产品里。 - 备选:Arduino Uno/Nano(不推荐)。这些板子用的ATmega328P芯片没有内置USB功能,它们通过一个独立的USB转串口芯片(如CH340、FT232)与电脑通信。要让它们模拟USB鼠标极其困难且不稳定,几乎需要重写底层固件,对于本项目而言是条弯路,请尽量避免。
- 首选:Arduino Leonardo 或 Arduino Pro Micro。这两款板子使用的ATmega32U4芯片内置了USB控制器,可以直接使用
-
杜邦线(跳线)若干:用于连接。建议使用公对公的杜邦线,方便在面包板上进行原型测试。
-
焊接工具(可选但推荐):A161模块的接口通常是裸露的焊盘或针脚,为了可靠连接,最好能焊接上排针或直接焊上导线。一把好用的电烙铁、焊锡丝和助焊剂是得力助手。
-
USB数据线:用于给Arduino供电并与电脑通信。
注意:电压匹配。A161模块通常工作在5V逻辑电平。虽然一些资料说它也兼容3.3V,但为确保稳定,建议将Arduino的VCC输出设置为5V(如果板子支持选择)来给模块供电。Leonardo和Pro Micro的VCC引脚输出就是板载稳压后的电压,通常是5V。
2.2 A161模块引脚定义与接线方案
A161模块的PS/2接口通常是4个引脚。准确识别它们是成功的第一步。根据常见的PS/2鼠标接口定义和实测,其引脚排列通常如下(面对模块的接口部分):
- VCC (电源正极):通常为+5V。
- GND (电源地):电路公共地。
- Data (数据线):双向数据信号线。
- Clock (时钟线):由设备(鼠标)提供的时钟信号线。
如何确认?最稳妥的方法是用万用表测量:在未通电时,GND引脚通常与金属外壳或大面积接地铜箔相通。通电后(可临时接USB转PS/2适配器),用万用表电压档测量,对GND有稳定5V的是VCC。Data和Clock线在静止时通常被上拉到高电平(约3-5V),在移动或点击时会有脉冲变化。
接线到Arduino Leonardo/Pro Micro: 这是最关键的一步,连接错误会导致无法通信。接线不仅仅是物理连通,还要考虑程序里定义的引脚编号。
- A161 VCC -> Arduino 5V (或VCC引脚)
- A161 GND -> Arduino GND
- A161 Data -> Arduino 数字引脚 3 (示例,可自定义)
- A161 Clock -> Arduino 数字引脚 9 (示例,可自定义)
实操心得:引脚选择。理论上,任何支持外部中断或能稳定响应数字输入的引脚都可以。示例中选择引脚3和9,是因为在一些示例代码中常见,且它们都支持外部中断(在Leonardo上,引脚3对应中断0,引脚9对应中断4),这对于早期通过中断读取PS/2数据的库可能有益。但
PS2-Mouse-Arduino库采用了轮询方式,对中断没有硬性要求,因此你可以根据布线方便选择其他数字引脚(如2, 4, 5等),只需在代码中同步修改即可。
2.3 原型搭建与供电检查
在编写和上传代码