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)       GND2
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
设置的按钮检测可以选择如下:
使用验证 
注意,要连接上手柄之后再启动程序,否则请修改代码中的检测模块死循环部分。