栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

记录自制游戏手柄过程:airpods耳机壳样式 + Switch摇杆 + ABXY按键+CH552T

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录自制游戏手柄过程:airpods耳机壳样式 + Switch摇杆 + ABXY按键+CH552T

目录
  • 背景
  • 流水账的开发过程

背景

19年时候买了一个airpods耳机壳,Nintendo FC游戏机的手柄样式,按键和主体都是硅胶材质的。用了快2年多,突然想起能不能把按键弄成真的——既能装Airpods,又能插电脑打游戏。

说干就干!Airpods硅胶耳机壳

流水账的开发过程

稍加分析,影响外壳大小的主要因素是PCB和芯片。先做外壳,看看内部多少空间。

用美工刀肢解了旧硅胶壳:

开始的想法是从耳机仓下面掏空:

不过这样按键不好安装和放置,后面参考apple官网给出的airpods尺寸(跟实际有出入)来设计外壳:

这款基本照搬老的硅胶耳机壳的按键和布局。



前面板使用螺丝固定在主体上,使用PVC贴片盖住螺丝孔。

先投个3D打印看看效果:


现在的3D打印精度这么高了吗?凝脂样的材质,绝了【滑稽脸】。

淘宝找按键时发现个好东西:


使用switch摇杆可直接解决配件更换问题和传统方向键生涩的问题,可随之而来的是switch摇杆的控制问题。
网上没找到关于switch摇杆的控制方法,没办法,直接上手量吧:

摇杆与引脚间电阻关系:


四个方向推进分别对应四个引脚的电阻降低,这样一来,需要4个通道的ADC才可以采集四个方向,而上下方向在HID协议中只用一个值来表示,这样在将上下两个ADC值在合并时就很可能产生偏差问题。算了,直接拆开看看:

这样就一目了然了,上下和左右分别是两个滑动变阻器。【可惜了我20元巨款买的摇杆】,电路图如下:

直接5脚接5V,2脚接地,两个滑动变阻器接两个AD,根据分压原理可测出其电阻大小,初中知识。

耳机壳内部空间也有了,芯片直接选CH552T,带4路ADC(测摇杆电阻)、USB设备控制器(伪装手柄)和多个GPIO引脚(做按键)。

CH552T开发板【刚好可以塞到侧边的缝里】:

CH552T可使用HID协议与操作系统通讯,使Windows认为它是手柄,不是其他东西,并且在【设备和打印机】界面显示手柄和调试器:

手柄的HID协议关键点在于报告描述符,使操作系统明白怎么与你的设备交流。
报告描述符规则需要自己学,写的时候可使用HID Descriptor Tool来避免错误。
我使用了共2个字节保存上下和左右,Z,Rx, Ry,Rz四个键位虽然用不到,但我还是申请了;另外又申请了两个字节保存16个按钮的按键状态:

UINT8C JskRepDesc[75] =  	// Report Descriptor, Game pad
{
	0x05, 0x01, 			// Usage_Page Generatic Desktop
	0x09, 0x04, 			// Usage Game Pad
	0xa1, 0x01, 			// Collation Application
		0x05, 0x01, 		// Usage page (generic desktop)
		0x09, 0x30,     	// Usage (X)
		0x09, 0x31,     	// Usage (Y)
		0x09, 0x32,     	// Usage (Z)
		0x09, 0x33,     	// Usage (Rx)
		0x09, 0x34,     	// Usage (Ry)
		0x09, 0x35,    	 	// Usage (Rz)
		0x15, 0x80,     	//LOGICAL_MINIMUM(-128)
		0x25, 0x7f,     	//LOGICAL_MINIMUM(127)
		0x75, 0x08, 		// report size(8)
		0x95, 0x06, 		// repost count(6)
		0x81, 0x02, 		// input(data, var, abs)
	
		0x05, 0x09, 		// usage page(button)
		0x09, 0x01, 		// Usage (button 1)
		0x09, 0x02, 		// Usage (button 2)
		0x09, 0x03, 		// Usage (button 3)
		0x09, 0x04, 		// Usage (button 4)
		0x09, 0x05, 		// Usage (button 5)
		0x09, 0x06, 		// Usage (button 6)
		0x09, 0x07, 		// Usage (button 7)
		0x09, 0x08, 		// Usage (button 8)
		
		0x09, 0x09, 		// Usage (button 9)
		0x09, 0x0a, 		// Usage (button 10)
		0x09, 0x0b, 		// Usage (button 11)
		0x09, 0x0c, 		// Usage (button 12)
		0x09, 0x0d, 		// Usage (button 13)
		0x09, 0x0e, 		// Usage (button 14)
		0x09, 0x0f, 		// Usage (button 15)
		0x09, 0x10, 		// Usage (button 16)
		
		0x15, 0x00, 		// logical minimum (0)
		0x25, 0x01, 		// logical maximum (1)
		
		0x75, 0x01, 		// repost size(1)
		0x95, 0x10, 		// report count(8)
	  	0x81, 0x02, 		// Input ( Data, Variable, Absolute )
	0xc0				// End collection
};

CH552T手册显示AIN0和AIN2引脚为11和15:

在大卫总的帮助下连的电路:

ADC会将采集的电压分成255份,万用表测量到上下的电阻范围后,使用zoom参数缩小或放大到边长为255正方形的外接圆大小。

int vpp;
UINT8 zoom=210;//1.5倍缩放到0-255范围(存在偏移),再缩放1.4倍使范围成为最大圆的直径(210~=1.5*1.4*100)
//adc电压[77, 120]转换到255-128
UINT8 ad_value_map(UINT8 voltage, UINT8 chnl)
{
		if(chnl==0)
		{
			vpp=(int)voltage-0x7f;//
			vpp*=zoom;
			vpp/=100;
			if(vpp<-128)
				return 0x80;
			if(vpp>127)
				return 0x7f;
			return vpp;
		}
		if(chnl==2)
		{
			vpp=(0xff-(int)voltage)-0x7f;
			vpp*=zoom;
			vpp/=100;
			if(vpp<-128)
				return 0x80;
			if(vpp>127)
				return 0x7f;
			return vpp; 
		}
	 return 0;
}

直接上合金弹头测试【完美】:

弹片和硅胶垫使用switch的:

给Switch按键设计个按键PCB,Select和Start使用两个微动开关:

字母标错了,是ABXY,不是上下左右:

新的外壳:


新的贴片:

新的外壳和PVC贴片已经在路上了, 坐等ing…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001863.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号