赞
踩
摘要:本文介绍游戏手柄模块JoyStick Shield的使用方法
前边已经实现了麦克纳姆轮四驱小车、循迹、避障、追光等几种智能小车,这些小车都是实现设定好规则来自动行进的,那么有人就想能不能做个遥控器,来遥控小车的行进呢?当然是可以的,从今天开始就来扩展这方面的功能。今天就来看一个游戏摇杆扩展模块,看看如何是使用这个模块来接受我们的控制指令。
市场上的游戏摇杆模块有很多种,有不同数量的摇杆和按键的组合,我在这里选择的是一个带按钮的PS2十字摇杆,4颗圆形按钮,2个小按键的游戏摇杆模块,这个只有几块钱的成本,如下图所示。
这个游戏摇杆模块的可扩展性很强,除了十字摇杆和按键外,还增加了以下这些接口:
另外,模块还提供了3.3V和5V的切换开关,方便与不同系统的连接。这些扩展接口和器件在板子上都有明确的说明,可以很清晰的知道每一个接口的定义和作用。
要使用这个游戏摇杆模块来控制之前开发的小车,那么重点就是怎样读取PS2摇杆和按钮的状态了,在板子的右上方,是关于摇杆和按键的接口。如下图所示:
左下边绿色框中的文字就是黄色排针接口的说明,两者之间是一一对应的关系。坐标第一列是电源正极和地,A、B、C、D、E、F分别对应游戏摇杆模块上的6个按键,在按键旁都有明确的标识,很好找到。K对应的是PS2摇杆中心按键,最后的X、Y则是PS2摇杆的水平和竖直位置的输出引脚。
PS2摇杆的位置是如何获取的呢?PS2的内部是两个滑动变阻器,一个是横向(X轴方向)一个是纵向(Y轴方向)。当我们波动滑动端的时候,滑动变阻器的滑动端就是随着手柄而滑动。在使用的时候,我们给游戏摇杆模块接通电源后,滑动变阻器的两端是接到电源两端的,这样我们通过检测滑动端的电压,就可以计算出滑动端所在的位置,也就可以获得摇杆的位置了。对于按键则是通过上拉电阻连接到了电源正极,这样,当按键按下时,按键的引脚会变成低电平,按键没有按下时,引脚为高电平。这两部分的原理如下图所示:
所以,在连接摇杆的引脚需要具有ADC功能,要能够得到引脚的电压值。下面就来把这个游戏摇杆模块与ESP32扩展板连接起来,具体的连接方法如下所示:
ESP32 | +3.3 | GND | P13 | P14 | P26 | P27 | P25 | P33 | P34 | P32 | P35 |
摇杆模块 | V | G | A | B | C | D | E | F | K | X | Y |
对于通过高低电平判断按键是否按下的方法,我在前面的C51仿真中已经进行了详细的介绍,如果相了解可以参考之前的文章。
在这里,介绍一个功能非常强大的按键处理库——OneButton。可以在Arduino IDE的库中直接的安装,如下所示:
在使用OneButton库时,首先需要引入头文件,如下所示:
#include <OneButton.h>
接着,需要创建一个OneButton对象的实例,如下所示:
OneButton buttonA(KEY_A, true);
其中第一个参数为按键所连接的引脚,第二个参数为按键按下的电平。true标识按键按下是低电平,false表示按键按下是高电平。
接下来,就可以利用OneButton的各个方法来实现各种功能了。该对象所包含的方法如下:
方法 | 用途 |
attachClick(callbackFunction newFunction) | 绑定单击事件处理方法 |
attachDoubleClick(callbackFunction newFunction) | 绑定双击事件处理方法 |
attachLongPressStart(callbackFunction newFunction) | 绑定长按开始事件处理方法 |
attachLongPressStop(callbackFunction newFunction) | 绑定长按结束事件处理方法 |
attachDuringLongPress(callbackFunction newFunction) | 绑定长按期间事件处理方法 |
attachPressStart(callbackFunction newFunction) | 绑定按键按下事件处理方法 |
getPressedTicks() | 获取按键按下时长 |
isLongPressed() | 判断当前按键是否处于长按状态 |
reset() | 按钮状态复位 |
setClickTicks(int ticks) | 设置单击时长(单位:毫秒) |
setDebounceTicks(int ticks) | 设置抖动时长(单位:毫秒) |
tick() | 按键扫描程序 |
下面就来看一下具体的使用方法,如下所示:
#include <OneButton.h> // 定义按键引脚 #define KEY_A 13 #define KEY_B 14 #define KEY_C 26 #define KEY_D 27 #define KEY_X 32 #define KEY_Y 35 OneButton buttonA(KEY_A, true); void doubleclick() { Serial.println("双击!"); } void click() { Serial.println("单击!"); } void setup() { // put your setup code here, to run once: Serial.begin(115200); // 按键复位 buttonA.reset(); // 绑定按键单击事件 buttonA.attachClick(click); // 绑定按键双击事件 buttonA.attachDoubleClick(doubleclick); } void loop() { // 扫描按键 buttonA.tick();
// 输出摇杆位置 Serial.print(analogRead(KEY_X)); Serial.print(" "); Serial.println(analogRead(KEY_Y)); delay(10); } |
analogRead()方法返回X、Y引脚的电压值。在前面的ADC中已经介绍过了,这个方法的返回值在0~4095之间。因此通过将返回值与在中间位置时的值进行比较就可以判断出摇杆偏向了哪一边。根据与中间值差值的大小,还可以判断出摇杆偏转程度。好了,关于JoyStick游戏摇杆的使用方法就介绍到这里了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。