当前位置: 首页 > news >正文

STM32中使用PS2手柄

目录

一、硬件介绍

1、PS2手柄

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

 二、程序设计

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

 2、创建STM32程序工程

(1)工程创建

 (2)Main程序

(3)PS2_Init()

(4)PS2_SetInit()

三、测试

四、工程下载连接


一、硬件介绍

1、PS2手柄

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

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


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

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

 

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

 二、程序设计

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

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

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

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

 2、创建STM32程序工程

(1)工程创建

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

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

ps2.h代码

 (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();		    //完成并保存配置
}

三、测试

 

四、工程下载连接

https://download.csdn.net/download/panjinliang066333/86758071

 

相关文章:

  • wordpress 全屏幻灯片/进入百度app查看
  • 网站开发一般用哪个浏览器/社交网络推广方法有哪些
  • 优酷网站怎么做的/线上营销模式有哪些
  • 响应式网站模板 开源/百度风云榜游戏排行榜
  • 织梦57网站的友情链接怎么做/友情链接分析
  • 凡科免费建设企业网站靠谱吗/微博付费推广有用吗
  • Hystrix熔断器
  • Linux 基础篇-VIM编辑器
  • 改进YOLOv5系列:首发结合 RepLKNet 构建 最新 RepLKDeXt 结构|CVPR2022 超大卷积核, 越大越暴力,大到31x31, 涨点高效
  • 【C语言】操作符
  • python题库刷题训练软件
  • 【设计模式】【第九章】【设计模式小结】
  • 基于图搜索的规划算法之 A* 家族(十一):总结
  • RocketMQ 消费者Rebalance算法 解析——图解、源码级解析
  • 【0126】Latch中self-pipe trick的应用机制
  • 《gitlab从零到壹》出现问题:代码合并,源分支会被删除解决方案
  • 模拟电路中的“基础积木”是什么?
  • MySQL查询慢,除了索引,还有什么原因?