PS2无线手柄控制模块
PS2 手柄兼容索尼的 PlayStation2 游戏机的遥控手柄。索尼的 psx 系列游戏主机在全球很是畅销。不知什么时候便有人打起 PS2 手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的机器人。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。
模块来源
规格参数
手柄工作电压:两节7号电池供电
接收器工作电压:3~5V
遥控距离:15米左右
控制方式:串行通信
管脚数量:6 Pin
使用说明
PS2 手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机 (也可叫作主机,可直接用在 PS2 游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。 特别声明:因批次不同或代工厂家不同,手柄和接收器的外观会有所区别(接收器上 都有指示灯,但一种接收器上有电源灯,另一种没有电源灯),但是接收器的引脚定义是一样的,解码方式是一样的,使用相同。
引脚说明
引脚 | 说明 |
---|---|
DI/DAT | 信号流向,从手柄到主机,此信号是一个 8bit 的串行数据,同步传送于时钟的下降沿。信号的读取在时钟由髙到低的变化过程中完成; |
DO/CMD | 信号流向,从主机到手柄,此信号和 DI 相对,信号是一个 8bit 的串行数据, 同步传送于时钟的下降沿; |
GND | 电源地; |
VDD | 接收器工作电源,电源范围 3~5V; |
CS/SEL | 用于提供手柄触发信号。在通讯期间,处于低电平; |
CLK | 时钟信号,由主机发出,用于保持数据同步; |
控制说明
时钟频率 250KHz(4us),如果接收数据不稳定,可以适当的增加频率。在通讯过中,一串数据通讯完成后 CS 才会由低转高,不是 1 个字节通讯完成后就由低转高,在通讯期间,一直处于低电平。 在时钟下降沿时,完成数据(lbit)的发送与接收,发送和接收是同时完成的。
当单片机想读手柄数据或向手柄发送命令时,将会拉低 CS 线电平,并发出一个命令“0x01”;手柄会回复它的 ID “0x41=绿灯模式,0x73=红灯模式”;在手柄发送 ID 的同时,单片机将传送 0x42,请求数据;随后手柄发送出 0x5A,告诉单片机“数据来了”。
一个通讯周期有 9 个字节(8 位),这些数据是依次按位传送。
idle:数据线空闲,该数据线无数据传送。
举例:当有按键按下,对应位为“0”,其他位为“1”,例如当键“SELECT”被按下时,Data[]=11111110。
红灯模式时: 左右摇杆发送模拟值,0x00〜OxFF 之间,且摇杆按下的键值 L3、R3 有效;
绿灯模式时: 左右摇杆模拟值为无效,推到极限时,对应发送 UP、RIGHT、DOWN、LEFT、△、〇、X、□,但是按键 L3、R3 无效。
硬件连接
PS2接收器 开发板
数据(Data) D12
命令(Cmd) D11
注意(Att) D10
时钟(Clk) D13
电源(VCC) 3.3V
地(GND) GND
2
3
4
5
6
7
使用方法
准备底层文件
将以下两个文件,放置在工程文件夹下,与.ino文件同级,这样.ino文件才能调用。
编写代码
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月11日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include "PS2X_lib.h" // 包含PS2X库
// 定义PS2控制器对象的引脚连接
PS2X ps2x;
const int PS2_DAT = 12; // 数据引脚
const int PS2_CMD = 11; // 命令引脚
const int PS2_SEL = 10; // 选择引脚
const int PS2_CLK = 13; // 时钟引脚
void setup() {
Serial.begin(9600);
// 初始化手柄,并设置模式
if (ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT) == 0) {
Serial.println("No PS2 controller found, check wiring");
while(1); // 循环结束,无法找到手柄
}
Serial.println("PS2 controller found!");
}
void loop() {
// 读取手柄状态
ps2x.read_gamepad();
// 检查是否按下了三角按钮
if (ps2x.Button(PSB_TRIANGLE)) {
Serial.println("Triangle pressed");
}
// 检查是否按下了圆形按钮
if (ps2x.Button(PSB_CIRCLE)) {
Serial.println("Circle pressed");
}
// 检查是否按下了圆形按钮
if (ps2x.Button(PSB_CIRCLE)) {
Serial.println("Circle pressed");
}
// 也可以检测其他按钮...
// // 检测右摇杆位置
// int leftStickX = ps2x.Analog(PSS_LX);
// int leftStickY = ps2x.Analog(PSS_LY);
// Serial.print("Left Stick X: ");
// Serial.println(leftStickX);
// Serial.print("Left Stick Y: ");
// Serial.println(leftStickY);
// // 检测右摇杆位置
// int rightStickX = ps2x.Analog(PSS_RX);
// int rightStickY = ps2x.Analog(PSS_RX);
// Serial.print("Right Stick X: ");
// Serial.println(rightStickX);
// Serial.print("Right Stick Y: ");
// Serial.println(rightStickY);
delay(50); // 延时以减少读取频率
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
设置的按钮检测可以选择如下:
使用验证
注意,要连接上手柄之后再启动程序,否则请修改代码中的检测模块死循环部分。