
PS2手柄是索尼 PlayStation 2游戏机专用手柄,它于2000年上市,是当时最流行的游戏手柄之一。具有手感舒适,操作简单,耐用性强的优势。遗憾的是,作为近乎上世纪的产品,索尼公司早在2012年宣布PS2手柄停产。
令人欣慰的是,得益于国内强大的制造业产业,如今我们仍然能够买到PS2手柄的代工版。同时PS2手柄仍然支持目前大部分的PC游戏,例如大火的《黑神话:悟空》以及UP非常喜欢的《雨中冒险:回归》等等。强大的开源生态也让PS2手柄在智能小车项目的遥控器选择上占据一席之地。这些都让这一早已淘汰产品在玩家们,电子DIY爱好者们的生活中继续发挥余热。
PS2X_lib是一个非常强大的PS2控制器Arduino库,在这里感谢相关作者。
通讯引脚:4
详情请见:https://GitHub.com/madsci1016/Arduino-PS2X
温馨提示:PS2X_lib没有被Arduino IDE自带的库管理器收录,所以无法通过Arduino IDE直接下载,怎么办呢?以下提供三种常用的下载以及两种简单常用导入第三方库的方式,新旧版Arduino IDE(2.x.x)与(1.x.x)通用。这里以新版为例。
1.下载PS2X_lib库
通过GitHub下载,https://GitHub.com/madsci1016/Arduino-PS2X
点击<>Code下的Download Zip即可下载

将Arduino-PS2X-master文价夹中的PS2X_lib文件夹解压缩到桌面

在桌面上鼠标右键PS2X_lib选择压缩,压缩为ZIp文件,这样就可得到PS2X_lib.zip文件。
百度网盘下载,链接:https://pan.baidu.com/s/1pRxA9cpoMUJVwIsK1MoPGA?pwd=3Pro, 提取码:3Pro。将文件下载到桌面上后压缩为ZIp即可
粘贴复制库文件
2.库导入
温馨提示:GitHub下载和网盘下载选择第一种导入方式。粘贴复制的选第二种导入方式。
一.Arduino IDE直接导入



输出Library installed表示库已成功安装,编写代码时程序引入头文件的代码为
#include <PS2X_lib.h>

二.新建文件
Arduino IDE新建两个标签页分别命名为PS2X_lib.cpp,PS2X_lib.h


将专栏链接一即名为PS2X_lib.cpp的代码部分粘贴复制到PS2X_lib.cpp页中

将专栏链接二即名为PS2X_lib.h的代码部分粘贴复制到PS2X_lib.h页中



这样PS2X_lib.h就已经成功导入了(非严格意义上),编写代码时程序引入头文件的代码为
#include "PS2X_lib.h"

3.电路连接
闲话少叙直接上图


温馨提示:这里为原装控制器的接线图。注意控制器上的通讯引脚可接开发板上的任意数字引脚,这里的接线图仅为示例,如果小伙伴们买了相关的转接板,根据商家提供的接线图接线即可。UP这里的是原装控制器。
1.byte config_gamepad(uint8_t clk, uint8_t cmd, uint8_t att, uint8_t dat, bool pressures, bool rumble)
功能:启动PS2接收器并检查错误,返回错误类型(0,1,2,3)。0表现无错误;1表示无控制器,大部分为接线错误;2表示成功连接到控制器,但无法接受命令;3表示控制器拒绝设置为压力模式,可能是控制器不支持该模式。
参数:clk,cmd,att为控制器引脚;pressures为压力模式,值为true表示进入压力模式;rumble为手柄震动,值为true表示开启手柄震动。
2.boolean read_gamepad(boolean motor1, byte motor2)
功能:读取控制器和设置手柄震动强度。
参数:moto1表示是否开启马达,这里经过UP实测以及查看官方示例,直接填入false即可;motor2表示设置马达转速,范围为0~255.
3.boolean Button(uint16_t button)
功能:当按键按下时返回true。
参数:button为手柄上的按键名。
4.boolean NewButtonState(unsigned int button)
功能:指定按键的状态发生改变时(由按下到松开或松开到按下)返回true
此函数可不传入参数,此时功能为任意按键的状态发生改变是返回true
参数:button为手柄上的按键名
5.byte Analog(byte button)
功能:返回摇杆的模拟值。pressures为true即开启压力模式后,可调用该函数返回按键按下时力度的模拟值。范围:0~255
参数:button为手柄上的摇杆名
6.boolean ButtonPressed(unsigned int button)
功能:按键刚刚按下时返回true
参数:button为手柄上的按键名
7.boolean ButtonReleased(unsigned int button)
功能:按键刚刚松开时返回true
参数:button为手柄上的按键名
温馨提示:编写代码时我们还需知道自己控制器的类型,因为不同类型控制器的代码存在差异。可调用readType()返回当前控制器的类型,返回值为0,1,2,3。0表示未知类型控制器;1表示DualShock控制器;2表示GuitarHero控制器;3表示Wireless Sony DualShock控制器。
测试下来,UP手上的PS2手柄控制器类型为3,即Wireless Sony DualShock控制器。市面上大部分PS2手柄控制器应该都是类型3。由于UP没有其他类型的控制器,故下述示例代码部分仅针对Wireless Sony DualShock控制器。
运行官方示例PS2X_Example.ino可以看到

Controller_type:3,即此控制器类型为3,以下为手柄按钮名定义


温馨提示:前文我们提到了两种库导入方式,即Arduino IDE直接导入以及新建文件夹。两种导入方式仅引入头文件的代码存在差异。(Arduino IDE直接导入为#include<PS2X_lib.h>,新建文件夹为#include "PS2X_lib.h")以下示例代码以新建文件夹导入的为例。
此部分的代码较多,因此此部分将loop()函数以上的部分单独列出一张图片放不下,还请见谅。

同时ps2手柄的按键较多,按键部分演示的代码较多一张图片也放不下,下面的示例中将给出用到函数的通用用法以简化演示代码,还请见谅。
1.按键
涉及函数:Button(),ButtonPressed(),ButtonReleased(),NewButtonState()
通用用法如下
if(ps2x.函数名(按键名))
{
//其他操作
}
ps2x为创建PS2X控制类的类名,也可自行定义,这里以ps2x为例。
NewButtonState()在可不传入参数,这里不再赘述。


可以看到:
一直按下PSB_PAD_UP串口一直打印PSB_PAD_UP
刚刚按下PSB_CIRCLE串口打印PSB_CIRCLE
按下并松开PSB_BLUE串口打印PSB_BLUE
按下PSB_L1时串口打印PSB_L1,松开时串口打印PSB_L1

2.摇杆(涉及函数Analog())


拨动手柄上的摇杆,可以看到串口打印不同的摇杆模拟值

3.震动模式
rumble的值为true表示开启手柄震动。

开启震动模式后,我们可通过设置vibrate变量的值来控制震动强度,范围0~255。
0表示不震动,255表示最大震动强度。

这样当我们按下PSB_CIRCLE按键时,手柄以最大强度震动。

温馨提示:PS2手柄还有压力模式,开启后可调用Analog()函数返回按键按下力度的模拟值。但是经过UP实测该功能存在缺陷,可能是库的问题,也有可能是UP手柄的问题。所以压力模式在此略去,还请见谅。
1.本文基于对开源代码的查阅以及UP的实测编写。
2.由于UP时间精力有限,文中难免存在错误,纰漏,还请小伙伴们批评指正。
3.本文图片取自网络以及UP拍摄。
4.创作不易,如果喜欢求三连,求关注。^_^