亚博智能PS2手柄学习笔记

一、PS2 手柄介绍:

PS2 由手柄与接收器两部分组成,手柄主要负责发送按键信息。都接通电源并打开手柄开关时,手柄与接收器自动配对连接(这是由于手柄与接收器之间依靠2.4G进行通信),在未配对成功的状态下,接收器绿灯闪烁,手柄上的灯也会闪烁,配对成功后,接收器上绿灯常亮,手柄上灯也常亮,这时可以按“MODE”键,选择手柄发送模式,红灯模式:遥杆输出模拟值;绿灯模式:遥杆对应上面四个按键,只有四个极限方向对应。
接收器和主机(单片机)相连,实现主机与手柄之间的通讯。
亚博智能给的又是用STM32F103C8T6,标准库的代码。这还是我从平衡小车那里弄来的源码,原本给的用来测试的源码还是用寄存器写的。然后以下是移植到STM32F407ZGT6基于HAL库的记录。

引脚定义

123456789
DI/DATDO/CMDNCGNDVDDCS/SELCLKNCACK

NC我合理猜测是空端口
请添加图片描述
请添加图片描述

二、编程实验

cube

GPIO
在这里插入图片描述
将三个GPIO口设置为推挽输出模式,一个设置为下拉输入模式。三个GPIO_Output的引脚分别对应MISO、CS和SCK,GPIO_Input的引脚对应的是MOSI。
USART
在这里插入图片描述
串口初始化

keil

主函数中初始化PS2
在while(1)中读取手柄按键

void PS2_Init(void)
{
  __HAL_RCC_GPIOD_CLK_ENABLE();
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  /*Configure GPIO pins : PD0 PD1 PD2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  /*Configure GPIO pin : PD3 */
  GPIO_InitStruct.Pin = GPIO_PIN_3;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
}

将IO口的初始化写在这里是为了方便之后的移植

unsigned char PS2_DataKey()
{
	uint8_t index = 0, i = 0;
	PS2_ClearData();
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_RESET);
	for(i=0;i<9;i++)	//更新扫描按键
	{
		Data[i] = PS2_ReadData(scan[i]);	
	} 
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_SET);
	Handkey=(Data[4]<<8)|Data[3];     //这是16个按键  按下为0, 未按下为1
	for(index=0;index<16;index++)
	{	    
		if((Handkey&(1<<(MASK[index]-1)))==0)
			return index+1;
	}
	return 0;          //没有任何按键按下
}

对串口数据收发相关的把信号线,时钟线进行拉高拉低的操作我没有进行封装,主要是懒。

uint8_t PS2_ReadData(uint8_t command)
{

	uint8_t i,j=1;
	uint8_t res=0; 
    for(i=0; i<=7; i++)          
    {
		if(command&0x01)
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_SET);
		else
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_RESET);
		command = command >> 1;
		delay_us(10);
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
		delay_us(10);
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) ) 
			res = res + j;
		j = j << 1; 
		HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
		delay_us(10);	 
    }
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_0,GPIO_PIN_SET) ;
	delay_us(50);
    return res;	
}

记得这里的读数据延时是微秒级别的

三、实验结果

反正就是成功了
请添加图片描述

一. ps2原装手柄(其中分为国产和日本原装手柄) 主要给大家讲一下原装手柄的识别   下面就是如何辨识ps2原装黑震手柄方法:   1:黑色手柄线:直径4.5mm,长度2.4m,线上印有白色字体"E213229 (倒)RUAWM STYLE 2835 60'C 30V VW-1SC LOW VOLTAGE CABLE DOOWELL",线质柔软,使用一段时间便会自然顺直,组装的线粗且硬,长时间顺直不能.(指不能自然垂直)。   2:手柄插口:正面凹下的"SONY",背面是刻印的字体,不是PS1时贴的纸了。   3:手柄表面:纯黑外表面,夹杂大量金色发光粒子,电线入口左侧写有蓝色"DUAL SHOCK2",背面的凸型字体字迹清晰,粗细均匀,字体表面平整不应带有毛边或字体表面形状发尖,用力扭捏手柄不应有一丝响动,手柄结合处不应有明显刮手现象。   4:按键:   A:方向键上表面有一层细细的磨沙,整体按下的幅度在0.5-0.7mm之间,单方向按下幅度在1.5mm以内。   B:START,SELECT:按下幅度在1.0mm以内.ANGNLR键突出较高用力按下后不应卡在手柄外壳内。   C:方叉圈角均为嵌入式,永不磨灭.嵌入的部分和按键表面应平整如一,决不能出现错台现象,目前仿原装手柄这点做的不够精密是作为辩假的方法之一!上诉四键的按下幅度在0.7mm左右.按键表面边缘圆滑,不会刮手,弹性柔软。   D:LR键:上面的1和2刻入键较深,凹下的断面纵直,决不能出现断面呈梯型的情况,这也是辩假的方法之一!按下幅度在0.7mm左右。   E:L3R3键:摇杆上方接触面是橡胶材质表面凹凸不平,关键是下方的结合缝是上下缝,而并非左右接缝,这可能也是辩假的方法之一,我也不太确定.再游戏时以PS的"寄生前夜"来游戏时,作同心圆跑是决不能出现中途停顿的现象.否则必为假货,这是辩假最跟本有效的方法,同类游戏还可以用PS2的"ICO"来试。   总结:所有按键弹性柔软,按下和弹起的幅度小,手感剧佳,用力狂按也不会有太大动静。   5:背面共计6只长7mm的黑色平头螺丝,这里要注意的是注意是平头螺丝呦!这也是辩假的方法之一呢!介绍的这款手柄编号为 Made China 10010 A。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值