玩游戏的小伙伴都知道,有的游戏需要使用游戏手柄体验才会更好,今天就我们来DIY一款自己专属的手柄!

1.设计思路

电脑游戏手柄和鼠标键盘一样属于USB HID设备,Window系统和Linux系统和各种游戏机系统都会自带此种设备的驱动,使用这种协议可以免装装驱动,即插即用。本次DIY使用单片机stm32f103c8t6,其自带USB资源,通过移植USB功能,修改相关配置和描述符,使其识别为USB-HID设备,再通过按键检测,检测到不用的按键就发送不同键值给电脑,以实现手柄不同的操作,实现原理同电脑键盘。

2.准备材料如下:

 

洞洞板5*7cm               x2

按键12*12cm              x10

按键帽                          x8

按键6*6                        x2

usb线micro转A口       x1

连接线                          若干根

螺丝M3*6                    若干个

螺丝M3*8                    若干个

 

3.硬件制作

使用一块stm32f103c8t6的最小系统板,将其部分io口接入按键的一端,将按键的另外一端接地,设置stm32的这些io口内部上拉,这样当按键按下后,单片机既可检测到,并做出相关处理。

 手柄的各个位置对应到stm32上面的引脚号如下:

 

4.软件调试

移植stm32官方的usb扩展代码,在此基础上修改如下描述符,定义设备属性和数据格式,在加上按键检测功能,根据不同按键响应发送不同的数据以实现控制。

下面介绍主要的USB需要配置的几个描述: 

第1个:设备描述符DeviceDesciptor  

 第2个:配置描述符ConfigurationDescriptor

第3个:接口描述符InterfaceDescriptor

第4个:HID描述符HIDDescriptor

HID设备专有的描述符,用于配置HID设备的属性和报告描述符的大小。

第5个:端点描述符EndpointDescriptor

端点描述符是用于配置端点号以及端点的输入输出。

第6个:报告描述符ReportDescriptor

报告描述符是HID设备专有的描述符,用于描述传输的数据的格式。

第7个:字符串描述符StringDescriptor

 

 配置好描述符后,主要发送函数如下:

 

数据格式定义:

我们设定的一次发送的数据为9个字节,第1个字节默认0x1,第2个字节定义如下

 

第3个字保留位,后面几个字节为普通按键码。如发送01 02 00 04 05 00 00 00 00 表示同时按下Left_Shift  + a + b 三个键。当然我们作为手柄不需要这么多按键功能,主要实现上下左右键,和A,B,X,Y键,ESC和Space键即可。需要什么按键功能,根据下图标准键值码值来进行设定修改代码。

 

5.外壳制作

使用proe5.0设计上下外壳如下:

 

 

 

外壳设计好之后,使用3D打印机打印外壳

将电路板装配进外壳里

 

 全部安装完成后如下

 

 

6.测试使用

将手柄插入电脑后,识别为USB-HID设备

 

 

打开游戏测试,操作流畅!

 至此,我们的USB电脑游戏手柄就完成啦

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐