热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

arduino环境下用ESP32连接PS2手柄

一、PS2接线说明功能:1,数据:控制器-PlayStation游戏机。这是一个集电极开路输出,需要一个上拉电阻ÿ

一、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 //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才可。


推荐阅读
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
author-avatar
ex7776647
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有