从小白入手STM32(C8T6)和PS2手柄制作PS2遥控小车:常见问题及解决方法
目录
一.PS2介绍
二.PS2通讯协议介绍
PS2通讯过程
以下是本人零基础做PS2通信时所出现的问题以及解决方法
1.代码哪里找?
2.连接串口后,串口接收不到信号?
3.小车转弯方式以及驱动模块选择
代码资源
一.PS2介绍
今天就带大家来用是stm32搭配PS2,手柄无线操控小车。如果你需要用PS2无线手柄搭配单面机来DIY制作,那么千万别错过这篇文章。
首先介绍一下我们今天的主角—–PS2手柄。 PS2手柄是日本SONY公司的PlayStation2 游戏机的遥控手柄。索尼的 PSX系列游戏主机在全球都很畅销。不知什么时候便有人打起 PS2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的机器人。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。
二.PS2通讯协议介绍
PS2采用的是SPI通信协议,SPI是串行外设接口的缩写,是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线(DI、DO、CS、CLK),节约了芯片的管脚,同时为PCB的布局上节省空间。
PS2接收器上一共有九根引脚,按上图从左往右,依次为:
1.DI/DAT:信号流向,从手柄到主机,此信号是一个8bit 的串行数据,同步传送于时钟的下降沿。信号的读取在时钟由高到低的变化过程中完成。
2.DO/CMD:信号流向,从主机到手柄,此信号和 DI相对,信号是一个 8bit 的串行数据, 同步传送于时钟的下降沿。
3.NC:空端口。
4.GND:电源地。
5.VCC:接收器工作电源,电源范围 3~5V。
6.CS/SEL:用于提供手柄触发信号。在通讯期间,处于低电平。
7.CLK:时钟信号,由主机发出,用于保持数据同步。
8.NC:空端口。
9.ACK:从手柄到主机的应答信号。此信号在每个8bits数据发送的最后一个周期变低并且CS一直保持低电平,如果CS信号不变低,约60微秒PS主机会试另一个外设。在编程时未使用ACK端口。(可以忽略)
PS2通讯过程
1. CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每个字节为8位)发送完毕后才会拉高,而不是每个字节发送完拉高。
2. DO、DI在在CLK时钟的下降沿完成数据的发送和读取。
综上所述,是PS2进行通信与操纵的基本原理。
以下是本人零基础做PS2通信时所出现的问题以及解决方法
1.代码哪里找?
代码一般商家会有,好一点的商家还会给连接视频,当然代码待得微调。
2.连接串口后,串口接收不到信号?
//向手柄发送命令
void PS2_Cmd(u8 CMD)
{
volatile u16 ref=0x01;
Data[1] = 0;
for(ref=0x01;ref<0x0100;ref<<=1)
{
if(ref&CMD)
{
DO_H; //输出以为控制位
}
else DO_L;
CLK_H; //时钟拉高
delay_us(9);
CLK_L;
delay_us(9);
CLK_H;
if(DI)
Data[1] = ref|Data[1];
}
}
特别注意,排除接线以及硬件问题,那代码问题就是最大的疑点,而我也是因为这个疑点而卡了好久————由于它是靠下降沿与上升沿来获取数据,所以手柄或去数据的时钟周期不能太长,但商家给我的代码中周期有50us,结果就是读取不到时钟边沿,所以造成没有串口读取不到数据的情况,但吧这串代码的delay_us(50)改为9,就可以收到串口信号了。
3.小车转弯方式以及驱动模块选择
小车驱动推荐使用差数转弯方式,即两侧轮胎转速不同,即可达到转弯目的。
驱动模块选择,当使用输入电压比较大的驱动模块推荐使用L298N,使用方法和HW-166非常接近,但传入电压为12V,且可以输出5V电压,为32供电,且由于输入电压(L298N 12V)比(HW-166 5V)要大,所以输出功率也大,能给与电机更大的动力。
以上就是用stm32以及PS2手柄完成的PS2遥控小车可能出现的问题,以及问题的解决方法(如串口无信号,串口信号异常等),希望能帮助到大家!!!
代码资源
以下是PS2的代码资源与教程
链接:https://pan.baidu.com/s/1ZDKcO0-EPwM4Rn3AeVKJQw
提取码:jwe5
使用时要注意时钟周期!!!
作者:仰望星(兴)空