基于STM32的PS2遥控小车

发布者:EternalBliss最新更新时间:2024-03-12 来源: elecfans关键字:STM32  PS2  遥控小车 手机看文章 扫描二维码
随时随地手机看文章

摘要:PS2手柄是索尼的PlayStation2游戏机的遥控手柄。索尼的psx系列游戏主机在全球很是畅销。不知什么时候便有人打起ps2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的智能小车。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。

0a1cfade-f02b-11ec-ba43-dac502259ad0.jpg0a2d4c5e-f02b-11ec-ba43-dac502259ad0.jpg

1.PS2手柄控制

PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫作主机,可直接用在PS2游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。

0a3c22c4-f02b-11ec-ba43-dac502259ad0.jpg

2.PS2手柄时序

0a4ad260-f02b-11ec-ba43-dac502259ad0.png

1、CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每个字节为8位)发送完毕后才会拉高,而不是每个字节发送完拉高。

2、DO、DI在在CLK时钟的下降沿完成数据的发送和读取。

下降沿:数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。

3、CLK的每个周期为12us。若在某个时刻,CLK处于下降沿,若此时DO为高电平则取“1”,低电平则取“0”。连续读8次则得到一个字节byte的数据,连续读9个字节就能得到一次传输周期所需要的数据。DI也是一样的,发送和传输同时进行。

以STM32与PS2手柄 通信为例:

1、 首先STM32拉低CS片选信号线,然后在每个CLK的下降沿读一个bit,每读八个bit(即一个byte)CLK拉高一小段时间,一共读九组bit。这九个byte如下表

0a5483f0-f02b-11ec-ba43-dac502259ad0.png

对应的的手柄读取代码如下


//读取手柄数据voidPS2_ReadData(void){volatileu8byte=0;volatileu16ref=0x01;

CS_L;

PS2_Cmd(0x01);//开始命令PS2_Cmd(0x42);//请求数据for(byte=2;byte<9;byte++)//开始接受数据{for(ref=0x01;ref<0x100;ref<<=1)

{

CLK_H;

CLK_L;

delay_us(50);

CLK_H;if(DI)

Data[byte]=ref|Data[byte];

}

delay_us(50);

}

CS_H;

}


2、第1个byte是STM32发给接收器命令“0X01” ,是一个开始的命令。

3、第2个byte是STM32发给PS2一个0x42请求数据。PS2手柄会在第二个byte回复它的ID(0x41=绿灯模式,0x73=红灯模式)。

红灯模式时 :左右摇杆发送模拟值,0x00~0xFF 之间,且摇杆按下的 键值 L3 、 R3 有效;绿灯模式时 :左右摇杆模拟值为无效,推到极限时,对应发送 UP、RIGHT、DOWN、 LEFT、△、○、╳、□,按键 L3 、 R3 无效;

4、第3个byte时PS2 会给主机发送 “0x5A” 告诉STM32数据来了。

5、从第4个byte开始到第9个byte全是接收器给主机(stm32)发送的数据,每个byte定义如上图,当有按键按下,对应位为“0 ”,例如当键“SELECT”被按下时, Data[3]=11111110。


pYYBAGKv2lGADGLTAAGcZDMcmxU149.png

3.PS2手柄测试

手柄需要两节7号1.5V的电池供电,接收器和单片机共用一个电源,电源范围为3~5V,不能接反,不能超压,过压和反接,都会使接收器烧坏。手柄上有个电源开关,0N开/OFF关,将手柄开关打到0N上,在未搜索到接收器的状况下,手柄的灯会不停的闪,在一定时间内,还未搜索到接收器,手柄将进入待机模式,手柄的灯将灭掉,这时,只有通过“START”键,唤醒手柄。接收器供电,在未配对的情况下,绿灯闪。手柄打开,接收器供电,手柄和接收器会自动配对,这时灯常亮,手柄配对成功。下面是接线说明:

供电方面VDD接3.3~5V,GND接GND。接收器信号线与stm32连接方式DI->PAODO->PA1CS->PA2CLK->PA3

4.电机实物接线图解

0a70123c-f02b-11ec-ba43-dac502259ad0.png图片来自平衡之家小车

一般的小直流电机只引出两个线,怎么这个电机有 6个线,而且还有两个大焊点呢?其实,那两个焊点分别和黄线和棕线是连接在一起的。也就是说只有6 个线,而6P 排线中,中间的四根线(红绿白黑)是编码器的线,只是用于测速,和直流电机本身没有联系。在实现开环控制的时候无需使用。我们只需控制施加在黄线和棕色线两端的直流电压大小和极性即可实现调试和换向。

5.TB6612FNG使用说明

要实现调试和换向功能,可以使用单片机实现的,但是单片机IO的带负载能力较弱,而直流电机是大电流感性负载,所以我们需要功率放大器件,在这里选择TB6612FNG。

TB6612FNG是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H桥结构,双通道电路输出,可同时驱动2个电机。也许大家更熟悉L298N,其实这两者的使用基本一致的。而且,相比 L298N的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于 PWM信号输入频率范围,高达100 kHz的频率更是足以满足我们大部分的需求了。

以下是TB6612FNG 的主要参数:最大输入电压:VM = 15V最大输出电流:Iout = 1.2A正反转/短路刹车/停机功能模式内置过热保护和低压检测电路以下是TB6612 模块测试一个电机的接线图:

0a8c7f4e-f02b-11ec-ba43-dac502259ad0.png

VM直接接电池即可,VCC 是内部的逻辑供电,一般给3.3 或者5V 都行,模块的3 个GND 接任意一个即可,因为都是导通的,STBY置高模块才能正常工作。

完成上面的接线之后,我们就可以开始控制电机了,上图中红色部分的5个引脚控制一路电机,蓝色部分的控制另外一路电机,这里只讲其中的A 路,B路的使用是一样的。AO1 和AO2 分别接到电机的+和-。然后通过PWMA、AIN2、AIN1控制电机。其中PWMA 接到单片机的PWM 引脚,一般10Khz 的PWM 即可,并通过改变占空比来调节电机的速度。下面是真值表:

0aa57a62-f02b-11ec-ba43-dac502259ad0.png

AIN1接 3.3~5V、 AIN2 接GND、 PWMA接 3.3 ~5V。这样相当于控制电机满占空比正转;AIN1接 GND、 AIN2 接3.3~ 5V、 PWMA接 3.3~5V。这样相当于控制电机满占空比反转;

6.舵机转向控制

关于舵机的控制我在前面的一篇文章已经具体的说明了!

点击查看:STM32驱动舵机的原理与实现

后台回复:PS2小车,即可获取项目源码!

0ab75700-f02b-11ec-ba43-dac502259ad0.png


关键字:STM32  PS2  遥控小车 引用地址:基于STM32的PS2遥控小车

上一篇:STM32低功耗唤醒方式
下一篇:基于STM32腾讯云物联网平台和微信小程序应用

推荐阅读最新更新时间:2024-11-06 12:21

STM32基于标准外设库的外部中断配置
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) EXTI支持配置20个中断和事件屏蔽位; GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15; EXTI_Line16 连接到PVD
[单片机]
<font color='red'>STM32</font>基于标准外设库的外部中断配置
STM32 数据类型定义
在 Keil MDK 开发环境中,经常会遇到类似于unsigned int 8、uint8_t 、u8等数据变量定义,对于初学者来讲确实是有点痛苦,后来查询发现以上三种方式均表示——无符号的8位整形数据。 由于C语言类型的长度完全由编译器决定,char 通常被定义成 8 位宽;int 通常被定义成 16 位或 32 位宽(或更高),它取决于平台(编译器将在这两者间选择最合适的字宽);short 通常被定义成 16 位宽;long 通常被定义成 32 或 64位宽。 所以 C99 中引进了一个标准C库头文件 stdint.h ,方便精确确定整数类型的宽度 定义标准的扩展整数类型_stdint.h文件(部分) /* Sig
[单片机]
<font color='red'>STM32</font> 数据类型定义
基于STM32的数字示波器设计与实现
0 引言 随着集成电路的发展和数字信号处理技术的采用,数字示波器已成为集显示、测量、运算、分析、记录等各种功能于一体的智能化测量仪器。数字示波器在性能上也逐渐超越模拟示波器,并有取而代之的趋势。与模拟示波器相比,数字示波器不仅具有可存储波形、体积小、功耗低,使用方便等优点,而且还具有强大的信号实时处理分析功能。因此,数字示波器的使用越来越广泛。目前我国国内自主研发的高性能数字示波器还是比较少,广泛使用的仍是国外产品。因此,有必要对高性能数字示波器进行广泛和深入研究。本文通过采用高速高性能器件,设计了一实时采样率为60 Msa/s的宽带数字示波器。 1 数字示波器的性能参数设计 数字存储示波器的指标很多,包括采样率、带宽、灵敏
[单片机]
基于<font color='red'>STM32</font>的数字示波器设计与实现
在IAR下如何查看工程的堆栈(STM32
在IAR下编程,难免少不了要跟堆栈打交道,但是打交道之前也要知道堆栈的大小,以及堆栈的位置在哪里? Options- Linker- Overridde default- Edit查看芯片的堆栈大小 这里可以看到我们使用的堆栈的大小都是0x800(2K)大小。如果想修改堆栈的大小,可以在这里修改,然后保存到工程目录下即可。 那如何查看堆栈在SRAM中的位置呢? 首先设置Options- Linker- List,将Generatee linkeer map file勾选上。 编译一下,在工程目录的output文件夹下就出现了.map的文件。 在文件中我们可以看到一下分配信息。 可以看到堆栈都在 P2
[单片机]
在IAR下如何查看工程的堆栈(<font color='red'>STM32</font>)
STM32的瞬态运动参数存储测试系统设计
引言 存储测试技术是在特殊环境下记录运动物体参数行之有效的方法,先将测试数据存入存储器,待装置回收后通过特定接口与上位机进行通信,还原数据信息。在诸多领域的测试中,对数据采集存储系统的实时性和功耗提出了更高的要求,随着半导体技术的发展,各种技术的进步使得高速度、低功耗的存储测试系统能够实现。 本系统选择ST公司超低功耗的基于ARM Cortex M3四核的处理器STM32F103C8T6作为核心控制元件,采取内部A/D转换器与铁电存储器结合的方法,实现压阻式加速度传感器测试数据的采集、存储,并利用LabView开发平台设计上位机应用软件实现测试数据的USB回读及处理。 1 系统原理 存储测试系统由电源管理模块、调理模块、外部晶
[单片机]
<font color='red'>STM32</font>的瞬态运动参数存储测试系统设计
stm32之TIM-基本定时器应用实例(详细)
开发环境:Window 7 开发工具:Keil uVision4 硬件:STM32F103VCT6 定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。 STM32系列的定时器分为基本定时器、通用定时器、高级控制定时器。后者包括前者的全部功能。所以先掌握基本定时器可以更好理解后面功能繁多的定时器。 通常地,STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5,基本定时器TIM6、TIM7。 有用过STM32的话都知道,STM32所有的外设初始化都是使用标准库里的初始化结构体和初始化函
[单片机]
<font color='red'>stm32</font>之TIM-基本定时器应用实例(详细)
STM32 SysTick定时器的1秒钟设计与实现
单片机源程序如下: #include stm32f10x.h #include Delay.h #include smg.h //定义0~9十个数字的字型码表 uint16_t table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint16_t wei ={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0xff,0xff}; //位码; uint8_t i; int main(void) { SMG_Init(); while(1) { for(i=1;i 7;i++)
[单片机]
<font color='red'>STM32</font> SysTick定时器的1秒钟设计与实现
STM32串口发送问题
在串口1发送中,第一个字总是发不出来,单步调试发送正常,硬件上电复位发送不正常,发现是STM32上电复位后需要先读取 USART_SR,然后写 USART_DR,解决办法在串口初始化加入USART_GetFlagStatus(USART2, USART_FLAG_TC); void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; // NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GP
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved