目录

一、硬件介绍

1、PS2手柄

2、PS2和STM32单片机控制板连接

 二、程序设计

1、遥控手柄按键ID识别和命名

 2、创建STM32程序工程

(1)工程创建

 (2)Main程序

(3)PS2_Init()

(4)PS2_SetInit()

三、测试

四、工程下载连接


一、硬件介绍

1、PS2手柄

PS2无线手柄为2.4GHz无线通讯。常规的PS手柄如下,分为手柄和接收器

ps remote链接手柄 ps连手柄_PS2手柄

接收器的引进信号分布和说明如下:

ps remote链接手柄 ps连手柄_PS2手柄_02

ps remote链接手柄 ps连手柄_单片机_03

 该接收器的引脚可以使用杜邦线直接跟单片机,不过使用杜邦线插拔不方便,建议使用成品的接收器。

ps remote链接手柄 ps连手柄_PS2手柄_04

2、PS2和STM32单片机控制板连接

ps remote链接手柄 ps连手柄_初始化_05

 

PS2接收器和单片机引脚连接

ps remote链接手柄 ps连手柄_单片机_06

 二、程序设计

1、遥控手柄按键ID识别和命名

(1)绿色字体为ID识别号

(2)红色字体为按键在程序中变量命名

(3)X和Y为的坐标系为单个摇杆的位置坐标系,摇杆在中间位置(静止无操作)坐标值为(128,128)

ps remote链接手柄 ps连手柄_单片机_07

 2、创建STM32程序工程

(1)工程创建

使用STM32读取MPU6050陀螺仪_Big_潘大师的博客-CSDN博客的工程,继续接下来的PS2工作。

在APP中添加PS2用户程序(网上直接找到的或者淘宝商家也提供测试)

ps remote链接手柄 ps连手柄_ps remote链接手柄_08

ps2.h代码

ps remote链接手柄 ps连手柄_PS2手柄_09

 (2)Main程序

#include "system.h"
#include "SysTick.h"
#include "SysDelay.h"
#include "led.h"
#include "i2c.h"
#include "mpu6050.h"
#include "usart.h"
#include "ps2.h"

int PS2_LX,PS2_LY,PS2_RX,PS2_RY,PS2_KEY;

int main()
{
	u8 count=0;
	u16 i=0;	
	
	SystemInit();               //系统初始化
	SysDelay_Init(72);			//自定义延时函数初始化
	LED_Init();
	USART1_Config();			//串口1初始化,上位机
	USART3_Config();			//串口3初始化-接蓝牙
	i2cInit();					//IIC初始化
	SysDelay_ms(10);			//10毫秒延时
	MPU6050_Init();			    //MPU6050 DMP陀螺仪初始化
	PS2_Init();					//PS2驱动端口初始化
	PS2_SetInit();		 		//ps2配置初始化,配置“红绿灯模式”,并选择是否可以修改
	
	PS2_KEY=0;
	delay_ms(1000);
	
	while(1)
	{
		/*LED灯闪烁*/	
		if(i%500==0)
		{
			led1=!led1;
		}
		
		//2毫秒执行一次——串口打印
		if(i%2000==0)
		{
			count++;
			printf("count:%d \r\n",count);
			printf("Pitch: %.2f ,Roll: %.2f,Yaw: %.2f \r\n",Pitch,Roll,Yaw);			//Pitch,Roll,Yaw数据传到串口
			
			printf("PS2按键:%d \r\n",PS2_KEY);     //打印按键的值
			printf("PS2左边x轴:%d \r\n",PS2_LX);   //打印左边X轴的值
			printf("PS2左边y轴:%d \r\n",PS2_LY);   //打印左边y轴的值
		    printf("PS2右边x轴:%d \r\n",PS2_RX);   //打印右边X轴的值
			printf("PS2右边y轴:%d \r\n",PS2_RY);   //打印右边y轴的值
		}
		
		//20毫秒执行一次
		if(i%20==0)
		{
			//获取摇杆数值
			PS2_LX=PS2_AnologData(PSS_LX);    
			PS2_LY=PS2_AnologData(PSS_LY);
			PS2_RX=PS2_AnologData(PSS_RX);
			PS2_RY=PS2_AnologData(PSS_RY);
			//获取按键值			
			PS2_KEY=PS2_DataKey();
						
		}
		/*获取MPU6050角度状态*/
		//在串口数据发送之后
		MPU6050_Pose();					//Pitch翻滚,Roll俯仰,Yaw偏航
		
		
		
		SysDelay_ms(1);					//1毫秒延时
		i++;
	}
}

(3)PS2_Init()

手柄引脚初始化

void PS2_Init(void)
{
	RCC->APB2ENR|=1<<2;     //使能PORTA时钟
	GPIOA->CRL&=0XFFFF000F; //PA1 2 3推挽输出 
	GPIOA->CRL|=0X00003330;   

	GPIOA->CRL&=0XFFFFFFF0; 
	GPIOA->CRL|=0X00000008; //PA0 设置成输入,默认下拉  	 	 											  
}

(4)PS2_SetInit()

手柄配置初始化

void PS2_SetInit(void)
{
	PS2_ShortPoll();
	PS2_ShortPoll();
	PS2_ShortPoll();
	PS2_EnterConfing();			//进入配置模式
	PS2_TurnOnAnalogMode();	    //红绿灯配置模式,并选择是否保存
	//PS2_VibrationMode();	    //开启震动模式
	PS2_ExitConfing();		    //完成并保存配置
}

三、测试

ps remote链接手柄 ps连手柄_ps remote链接手柄_10