亚博智能PS2手柄学习笔记
一、PS2 手柄介绍:
PS2 由手柄与接收器两部分组成,手柄主要负责发送按键信息。都接通电源并打开手柄开关时,手柄与接收器自动配对连接(这是由于手柄与接收器之间依靠2.4G进行通信),在未配对成功的状态下,接收器绿灯闪烁,手柄上的灯也会闪烁,配对成功后,接收器上绿灯常亮,手柄上灯也常亮,这时可以按“MODE”键,选择手柄发送模式,红灯模式:遥杆输出模拟值;绿灯模式:遥杆对应上面四个按键,只有四个极限方向对应。
接收器和主机(单片机)相连,实现主机与手柄之间的通讯。
亚博智能给的又是用STM32F103C8T6,标准库的代码。这还是我从平衡小车那里弄来的源码,原本给的用来测试的源码还是用寄存器写的。然后以下是移植到STM32F407ZGT6基于HAL库的记录。
引脚定义
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|
DI/DAT | DO/CMD | NC | GND | VDD | CS/SEL | CLK | NC | ACK |
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, 未按下为1for(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);elseHAL_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手柄学习笔记相关推荐
- 使用亚博智能K210实现人脸特征提取和识别
使用亚博智能K210实现人脸特征提取和识别 亚博智能K210开发板自带有使用C语言编程实现的人脸检测代码,即可以检测到摄像头范围内的人脸并将人脸框定出来,不能实现人脸的特征提取和人脸的识别.因此,我们 ...
- 小觅智能 |MSCKF 学习笔记
转载自:https://mp.weixin.qq.com/s/shxmOtDOSVZn_eQKgs8LBw 小觅智能 |MSCKF 学习笔记 知乎觅 MYNTAI小觅智能 2019-10-31 VIO ...
- 多智能体系统仿真学习笔记:(一)ODE
多智能体系统仿真学习笔记:(一)ODE (一)ODE的一般形式 Ⅰ.常微分方程 (ODE) Ⅱ.ODE方程组 Ⅲ.高阶ODE Ⅳ.复数ODE (二)Matlab中的ODE Ⅰ.Matlab中可求解的O ...
- 智能指针_auto_ptr2_学习笔记
//1,release函数只是简单的转移对内存的拥有权,自己变成null,不会delete,一般在将所有权转移给别的智能指针的时候使用.具体可参加源码. 例:#include <memory&g ...
- 智能车K60学习笔记
文章目录 K60学习笔记(开个坑,慢慢学) 基础知识 一系列定义或名称 简单位运算 中断(Interrupt) 8051 定时器中断 Kinetis K60介绍 K60模块 PORT模块 GPIO模块 ...
- 《智能控制技术》学习笔记-1.绪论,智能控制定义、分类、发展及应用场景
一.引言 先修内容: 经典控制理论.现代控制理论.MATLAB 引入:智能理论是新兴学科,随着数字计算机和人工智能发展而来,发展得益于许多学科:人工智能.认知科学.现代自适应控制.最优控制.神经元网络 ...
- 智能社JS学习笔记(一)
前言 转眼工作即将半年,这段时间自学了UI,html和css方面能比较熟练的掌握了,写过两套小程序的模板但只知其然不知其所以然(还是因为自己js基础知识掌握的不够啊)用bootstrap之类的框架能写 ...
- ESP32连接校园网,第一次接触网络通信,写一篇博客记录一下学习笔记。
一.校园网服务器分析 我们的校园网,当我们连接上xxst时,处于它的局域网当中,只有我们获得认证授权之后才能访问外界网络,而认证授权这一操作对于单片机来说只不过是几行代码就能解决,而对于我没有系统学习 ...
- 浅谈FFT(快速博立叶变换)学习笔记
0XFF---FFT是啥? FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇.偶.虚.实等 特性,对离散傅立叶变换的算法进行改进 ...
最新文章
- 多模态学习研讨会:预训练是AI未来所需要的全部吗?
- 2021年春季学期-信号与系统-第四次作业参考答案-第三小题
- Script:收集11g Oracle实例IO性能信息
- Django中的Session与Cookie
- 在anaconda中安装tensorflow-GPU版本
- Cisco asa 5520 oid
- html5 web storage攻击,HTML5安全风险详析之二:Web Storage攻击
- Change Value to Reference(将值对象改为引用对象)
- python创建文本、判断该文件共有多少行_python如何判断文件有多少行
- matlab m文件的编写,Matlab实验报告(四)M文件的编写.doc
- qt html导pdf 页眉,如何使用wkhtmltopdf unpatched qt在每个页面上添加页眉和页脚?
- java i o是什么流_Java I/O 流,输入流、输出流
- linux中UDP编程
- 硬盘转速和平均寻道时间
- Python爬虫BeautifulSoup4小记
- Linux 查看自己的IP地址
- Go语言之父谈Go:大道至简
- 浏览器打开任意可执行exe文件方法
- oracle 分区表 变大,Oracle11G新特性:分区表分区默认segment大小64k变为8M
- LRU算法,走迷宫,数根,星际战争
热门文章
- pentaho源码分析
- linux下搭建基本web服务
- 长文干货! 一文搞懂IoC的依赖注入
- 报如下错误:android.util.AndroidRuntimeException: You cannot combine custom titles with other title featur
- FICO 里面的替代和校验 以及调试
- uniapp 子组件 mounted 刷新
- 推荐系统[四]:精排-详解排序算法LTR (Learning to Rank): poitwise, pairwise, listwise相关评价指标,超详细知识指南。
- TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(2))
- 现实环境中,关于Teb Local Planner 参数调试总结
- 随心所欲——享受恬淡的心态