一、PS2接线说明

功能:
1,数据:控制器- > PlayStation 游戏机。这是一个集电极开路输出,需要一个上拉电阻(10K,或许更多)。(上拉电阻是必要的,因为控制器只能连接线对地,它不能真正把电压就行了)。
2,命令:PlayStation - >控制器。
4,地线,接电源负极。
5,电源:任何官方的索尼控制器应在 3-5V。
6,注意:各组发送/接收的字节前,此行必须被拉低,然后重新置高之后。在我们的测试中,它是不足够的,以配合永久-它被赶下来,周围每一组 Digitan 认为这是一个“片选”或“从选择”行,是用来解决不同的控制器上在同一总线上。
7,时钟: 500kH / Z,通常高。似乎是 SPI 总线的通信。我们已经得到了它的工作为 500kHz 小于 100kHz 的上升,(500K比特/秒,这还不算字节和数据包之间的延迟)。吉他英雄控制器连接时,时钟频率是 250kHz,这也是游戏站 1 使用的速率。
最后特别需要提醒的是:
按下遥控器的 MODE 键,手柄可配置成“红灯模式”或者“绿灯模式”,当遥控器侧面的 “MODE LED”亮为红灯模式,反之为绿灯模式,“红灯模式”和“绿灯模式”的主要区别是摇杆模拟值得输出。
红灯模式时:左右摇杆发送模拟值,0x00〜OxFF 之间,且摇杆按下的键值 L3、R3 有效;
绿灯模式时:左右摇杆模拟值为无效,推到极限时,对应发送 UP、RIGHT、DOWN、LEFT、△、〇、X、□,按键 L3、R3 无效。

引脚1DAT—>GPIO19
引脚2CMD—>GPIO23
引脚6SEL—>GPIO5
引脚7CLK—>GPIO18

二、程序说明

本程序取自一位大佬的博客https://blog.csdn.net/freewebsys/article/details/104734241

#include <PS2X_lib.h>  //for v1.6/******************************************************************* set pins connected to PS2 controller:  *设置连接到PS2控制器的引脚:*   - 1e column: original*   - 2e colmun: Stef?* replace pin numbers by the ones you use  *用您使用的密码替换密码******************************************************************///  ESP32 pin
// https://github.com/espressif/arduino-esp32/blob/master/docs/esp32_pinmap.png#define PS2_DAT        19  //MISO
#define PS2_CMD        23  //MOSI
#define PS2_SEL         5  //SS
#define PS2_CLK        18  //SLK/******************************************************************* select modes of PS2 controller:  *选择PS2控制器的模式:*   - pressures = analog reading of push-butttons*   - rumble    = motor rumbling* uncomment 1 of the lines for each mode selection******************************************************************/
#define pressures   false
#define rumble      falsePS2X ps2x; // create PS2 Controller Class   //创建PS2控制器类//right now, the library does NOT support hot pluggable controllers, meaning  //目前,该库不支持热插拔控制器,这意味着
//you must always either restart your Arduino after you connect the controller,  //您必须始终在连接控制器后重新启动Arduino,
//or call config_gamepad(pins) again after connecting the controller.  //或在连接控制器后再次调用config_gamepad(pins)。int error = -1;
byte type = 0;
byte vibrate = 0;
int tryNum = 1;void setup(){// 115200Serial.begin(115200);//added delay to give wireless ps2 module some time to startup, before configuring it  //添加了延迟,以使无线ps2模块在配置之前有一些启动时间//CHANGES for v1.6 HERE!!! **************PAY ATTENTION*************  //此处已更改v1.6 !!!**************请注意*************while (error != 0) {delay(1000);// 1 second wait//setup pins and settings: GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error  //设置引脚和设置:GamePad(clock, command, attention, data, Pressures?, Rumble?)检查错误error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, pressures, rumble);Serial.print("#try config ");Serial.println(tryNum);tryNum ++;}Serial.println(ps2x.Analog(1), HEX);type = ps2x.readType();switch(type) {case 0:Serial.println(" Unknown Controller type found ");break;case 1:Serial.println(" DualShock Controller found ");break;case 2:Serial.println(" GuitarHero Controller found ");break;case 3:Serial.println(" Wireless Sony DualShock Controller found ");break;}
}void loop() {if(type == 1){ //DualShock Controllerps2x.read_gamepad(false, vibrate); //read controller and set large motor to spin at 'vibrate' speed  //读取控制器并设置大型电机以“振动”速度旋转//will be TRUE as long as button is pressed  //只要按下按钮就为TRUEif(ps2x.Button(PSB_START))Serial.println("Start is being held");if(ps2x.Button(PSB_SELECT))Serial.println("Select is being held");//will be TRUE as long as button is pressed  //只要按下按钮就为TRUEif(ps2x.Button(PSB_PAD_UP)) {Serial.print("Up held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);}if(ps2x.Button(PSB_PAD_RIGHT)){Serial.print("Right held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_RIGHT), DEC);}if(ps2x.Button(PSB_PAD_LEFT)){Serial.print("LEFT held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_LEFT), DEC);}if(ps2x.Button(PSB_PAD_DOWN)){Serial.print("DOWN held this hard: ");Serial.println(ps2x.Analog(PSAB_PAD_DOWN), DEC);}vibrate = ps2x.Analog(PSAB_CROSS);  //this will set the large motor vibrate speed based on how hard you press the blue (X) button  //这将根据您按下蓝色(X)按钮的力度来设置大型电机的振动速度if (ps2x.NewButtonState()) {        //will be TRUE if any button changes state (on to off, or off to on)  //如果任一按钮改变状态(开到关,或关到开)将是TRUEif(ps2x.Button(PSB_L3))Serial.println("L3 pressed");if(ps2x.Button(PSB_R3))Serial.println("R3 pressed");if(ps2x.Button(PSB_L2))Serial.println("L2 pressed");if(ps2x.Button(PSB_R2))Serial.println("R2 pressed");}//△□○×if(ps2x.Button(PSB_TRIANGLE))Serial.println("△ pressed");if(ps2x.ButtonPressed(PSB_CIRCLE))               //will be TRUE if button was JUST pressed  //如果按钮被按下,将是TRUESerial.println("○ just pressed");if(ps2x.NewButtonState(PSB_CROSS))               //will be TRUE if button was JUST pressed OR released  //如果按钮被按下或释放,将是TRUESerial.println("× just changed");if(ps2x.ButtonReleased(PSB_SQUARE))              //will be TRUE if button was JUST released //如果按钮被释放,将是TRUESerial.println("□ just released");if(ps2x.Button(PSB_L1) || ps2x.Button(PSB_R1)) { //print stick values if either is TRUE  //打印棒值如果任一为TRUESerial.print("Stick Values:");Serial.print(ps2x.Analog(PSS_LY)); //Left stick, Y axis. Other options: LX, RY, RX  //左摇杆,Y轴。其他选项:LX,RY,RXSerial.print(",");Serial.print(ps2x.Analog(PSS_LX), DEC);Serial.print(",");Serial.print(ps2x.Analog(PSS_RY), DEC);Serial.print(",");Serial.println(ps2x.Analog(PSS_RX), DEC);}}delay(50);
}

在使用此程序之前需要先将库复制到arduino/libraries下
https://github.com/MyArduinoLib/Arduino-PS2X-ESP32此库同样取自这位大佬

三、注意

在下载程序时先将PS2的接线断开,否则会下载失败。
在运行程序时将PS2的供电连到3.3V上,否则用可能导致错误以至于芯片不断重启
在程序测试时注意L1和R1按键按下时并不显示相应按键按下而是不断传输两个摇杆的坐标信息,换句话说,想要获取两摇杆的坐标信息,需要按下L1或R1才可。

arduino环境下用ESP32连接PS2手柄相关推荐

  1. 《ESP32 学习笔记》 之Arduino环境下 使用DAC模拟输出(是真的DAC哦!)完成两路呼吸灯

    在 Arduino 环境下经常使用的 analogWrite(PIN, arg) 语法并不是真正的DAC模拟输出,也只是1kHZ的PWM 波模拟而成! 支持DAC功能的引脚请查看:引脚定义 本次ESP ...

  2. Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例

    Arduino框架下对ESP32 NVS非易失性存储解读以及应用示例 NVS非易失性存储库介绍 非易失性存储 (NVS) 库主要用于在 flash 中存储键值格式的数据.本文档将详细介绍 NVS 常用 ...

  3. ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程

    ESP32C3基于Arduino框架下的 ESP32 RainMaker开发示例教程 ESP RainMaker ESP RainMaker 是乐鑫推出的一个端到端平台.基于该平台,用户无需管理基础设 ...

  4. vscode ubuntu 环境下ssh 远程连接 不稳定 重新打开

    vscode ubuntu 环境下ssh 远程连接 不稳定 重新打开 只需要主机重启.

  5. 初学Arduino环境下WeMos D1制造简单智能垃圾桶项目(蜂鸣器、 SG90舵机、超声波模块)

    初学Arduino环境下WeMos D1制造简单智能垃圾桶项目(蜂鸣器. SG90舵机.超声波模块) 项目代码 #include <Servo.h> #define DuoPIN D5 # ...

  6. 解决Arduino环境下ESP8266模块无限重启崩溃问题

    问题背景: 最近使用ESP8266模块(NodeMCU)在Arduino环境下进行开发调试时遇到了一个ESP8266模块无限重启崩溃的问题.这个问题不是第一次发生了,很久之前遇到了后面也不知道怎么解决 ...

  7. 解决Vmware Workstation环境下CentOs7网络连接激活失败的问题

    打开虚拟机,发现网络连接激活失败 首先在工具栏的编辑里打开Vmware里的网络虚拟编辑器,如下图 win10需要管理员权限才可以,点更改设置,如下图 添加Vmnet0,选桥接模式. 然后更改适配器设置 ...

  8. 【模块】更新ESP32连接PS4手柄,PS4手柄控制遥控车,遥控车控制方案

    微信关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 210106更新PS4手柄调试进展. 上次误会ESP32 DEVKIT开发板了,这次调 ...

  9. 解决LNMP环境下客户端远程连接不上mysql的问题(已经排除防火墙/selinux问题)...

    LNMP环境下 远程连接mysql数据库 一.为了安全起见,lnmp环境是禁止远程连接的,他会删除iptables里面的3306端口的防火墙规则 一.如果是phpmydmin  那要把权限里要远程连接 ...

  10. Arduino环境下ESP32另外的下载方式(用USB转TTL连接TX0和RX0下载)

    Arduino ESP32另外的下载方式(用USB转TTL连接TX和RX下载) 今天意外摸索出了另一种下载方式,感觉非常有用,特此记录: 正常的下载方式大概就是把数据线插上,安装好驱动,理论上来说就可 ...

最新文章

  1. Android备份和添加短信
  2. python扫盲系列-(2)
  3. WPF 带CheckBox、图标的TreeView
  4. java发送QQ群邮件,简单两步使用node发送qq邮件
  5. C++ opengl 复合运动
  6. canvas绘制字体
  7. [概率论与数理统计] 常用定义与公式
  8. kafka 的structured stream 总结
  9. bigsur降级回catalina_big sur怎么降到Catalina,macOS Big Sur降级教程
  10. Win7连接共享打印机时,报 0x00000bcb 错误
  11. 我的×××面——深信服面试全记录
  12. 视频ts格式转mp4
  13. C语言函数之可变参数原理:va_start、va_arg及va_end
  14. PPT——地图快速获取(各地区域)
  15. 【QQ农场两周年】回想我的农场
  16. 使用cad数据导进arcgis,融合时出现z值或M值超出范围界线
  17. taskset 查询或设置进程绑定CPU(亲和性)
  18. 京东数据中心设施运维管理(三)
  19. mysql创建表的哈衣_地狱の沙汰も君次第日语谐音歌词, TV动画《鬼灯的冷彻》片头曲中文音译...
  20. 随笔(十一)——在杭州的100天-第十天

热门文章

  1. VS 2013编译xvid
  2. 公共基础知识:四大名楼简介
  3. 尚学堂马士兵Oracle教程笔记
  4. 嵌入式ARM核心板介绍
  5. 微软笔试题《Arithmetic Puzzles》- 题解
  6. 漫谈如何学习操作系统原理
  7. 【Demllie航天】航天器控制系统
  8. 手游传奇架设教程_「教程」传奇新手架设简单教程,自己做GM,「GEE版本」
  9. C#客户端嵌入Chrome浏览器的实现(非IE)
  10. tif格式怎么转jpg格式