通过这个项目,你会学习到如何设计一个面包板游戏手柄电路,学习如何将这个电路作为一个游戏手柄与Android设备、电视盒子、PlayStation和计算机通信。
正文开始!(文末有视频演示)
步骤1:Doit ESP32 Devkit V1开发板

在电路方面,我选择了低成本的Doit ESP32 Devkit V1开发板,它提供了无线通信选项,比如WiFi、蓝牙和ESP-NOW。
在这个项目中用的ESP32板模型总共有30个I/O引脚。有些型号有36个I/O引脚,并且尺寸较长。Doit ESP32 Devkit V1开发板可以通过VIN引脚以4V到12V的供电电压工作。
更多详细信息可以在这里找到:<span>https://lastminuteengineers.com/esp32-pinout-reference/</span>
步骤2:在面包板上构建电路



除了ESP32开发板外,游戏手柄电路还需要一个摇杆模块、按钮、电阻和一些导线。
- 带有圆形盖的12mm按键开关
- 用于按钮的4K7电阻
- XY摇杆模块
- Doit ESP32 Devkit V1开发板
- 面包板
- 跳线
步骤3:设置ESP32开发板

步骤:
1、从官方Arduino网站下载并安装最新版本的Arduino IDE。
2、打开Arduino IDE,转到"Preferences" > "Board Manager URLs",粘贴共享的ESP32包链接,然后点击确定按钮。


3、导航到"Tools" > "Boards Manager"。
4、在Boards Manager中搜索"ESP32"并安装ESP32板。

5、从"Tools" > "Board"菜单中选择合适的ESP32板。
附加的Boards Manager URL:
<span>https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json</span>
步骤4:BLE GamePad和NIM BLE库的源码
源码包括一个叫做"BLE GamePad"的库。如果去库的GitHub页面,你可以找到详细的解释和示例。

转到“Add Library”搜索“BLE GamePad”库并安装它。这个库还需“NIM BLE”库。如果库已经安装,我们可以仔细研究一下源代码。



GitHub地址:<span>https://github.com/lemmingDev/ESP32-BLE-Gamepad</span>
步骤5:游戏手柄源码

共享的游戏手柄源代码包含了总共13个按钮,这些按钮定义了标准游戏手柄的关键功能。此外,源代码还提供了三种游戏手柄模式。
这个描述块包含了mods的关键名称以及不同游戏手柄mods的按钮编号。每个键名都有一个对应的引脚编号。
/*
* ANDROID游戏手柄
* {A=1, B=2, C=3, X=4, Y=5, Z=6, L1=7, R1=8, L2=9, R2=10,
* Select=11, Start=12, PS=13, L3=14 , R3=15}
*
* PS游戏手柄模式
* {SQUARE=1, X=2, CIRCLE=3, TRIANGLE=4, L1=5, R1=6, L2=7, R2=8,
* Select=9, Start=10, L3=11, R3=12, PS=13}
*
*/
"Buttons Pins"数组代表了在开发板上使用的物理按钮引脚。"Number Buttons"常量指定了按钮的数量,并包含了每个按钮连接的引脚的值。
int buttonsPins[NUM_BUTTONS] = {X_BUTTON, CIRCLE_BUTTON, TRIANGLE_BUTTON, SQUARE_BUTTON,
R1_BUTTON, R2_BUTTON, L1_BUTTON, L2_BUTTON,
START_BUTTON, SELECT_BUTTON, PS_BUTTON,
R3_BUTTON, L3_BUTTON};
"Android GamePad Buttons"数组包含了在Android GamePad模式下使用的按钮的有序列表。每个按钮都被分配了一个数字。比如,按钮"A"是数字1,按钮"B"是数字2。
int androidGamepadButtons[NUM_BUTTONS] = {1, 2, 3, 4, 8, 10, 7, 9, 12, 11, 13, 15, 14};
"PS GamePad Buttons"数组包含了在PlayStation GamePad模式下使用的按钮列表。
int PS1GamepadButtons[NUM_BUTTONS] = {2, 3, 4, 1, 6, 8, 5, 7, 10, 9, 13, 12, 11};
"PC GamePad Buttons"数组包含了在计算机游戏手柄模式下使用的按钮列表。
int PCGamepadButtons[NUM_BUTTONS] = {1, 2, 4, 3, 6, 8, 5, 7, 10, 9, 0, 12, 11};
"GamePad Mode"变量包含了当前的GamePad模式。默认情况下,分配了Android模式,但这个值可以在代码中后期更改。
GamepadModes gamepadMode = ANDROID;
让我们根据面包板电路中找到的组件来更新源码。电路中有4个按钮和一个摇杆模块,我将选择"Android Gamepad"模式来测试电路。定义电路上组件的引脚,游戏手柄应该调用的关键函数,并更新引脚编号。然后上传源码。
完整代码可以在文末下载。
步骤6:使用应用程序测试面包板电路


我使用“GamePad Tester”这款Android应用来查看和测试按钮和摇杆功能。

安装应用程序,然后打开蓝牙连接并连接到ESP32。

打开应用程序,转到"Android GamePad Tester"并完成电路组件的测试。然后,通过一个游戏来真实测试电路。

这边安装了一个赛车应用程序,准备开始测试!
步骤7:印刷电路板

我用了之前设计的蝙蝠主题印刷电路板来测试作游戏手柄。


和面包板电路一样,选择了易于组装的可焊接组件。将所需的组件安装在PCB上,然后使用烙铁和焊线焊接到位。


- 1x二极管SB560
- 3x电容100uF 16V
- 2x XY拇指摇杆
- 1x稳压器7805CV(* 可选)
- 2x LED 3mm
- 2x电阻220R
- 6x电阻4K7
- 1x Doit ESP32 DevKit V1
- 2x母头1x15 2.54
- 2x母头1x4 2.54
- 1x连接器
- 4x带有圆形盖的12mm按键开关
PCB Gerber文件:<span>pcbway.com/project/shareproject/DIY_ESP32_Bluetooth_GamePad_for_Android_PlayStation_and_PC</span>
步骤8:测试印刷电路板

设计包括4个按钮和2个摇杆,以及每个摇杆连接的一个按钮。所以,需要为6个按钮和2个摇杆定制源代码。
然后我上传源代码。电路包括一个电压稳压器的母线头。如果你想用外部电源为电路供电,并且电源电压高于ESP32的工作范围6到12v,可以使用稳压器(*7805CV)。
你可以通过ESP32的USB输入供电,不使用稳压器,也可以通过用跳线在6到12伏特的电源范围内通过外部供电。
我用了一个空白的PCB作为盖子,避免手接触电路。将ESP32板插入电路,然后通过游戏手柄测试应用程序测试按钮和摇杆。接下来,我打开赛车游戏进行控制测试。




这部分代码也可以在文末下载。
步骤9:总结
这个电路在安卓手机上工作得非常好。我在 Android TV 和 Android TV Box 上再次测试了,结果也令人满意。在基于 Windows 的 PC 上的测试也同样成功,但是在 MacBook 上,遇到了一些连接上的问题。经过研究,我把 PS 模式分配给了操纵杆按钮,并在建立蓝牙连接时保持按下,结果连接成功,MacBook 将该电路识别为游戏控制器。我还用两个 ESP32 测试了该电路,使用 ESP-NOW 关于它们之间的通信,结果也很成功。
如果你想知道还能用这个电路做什么,可以参考下面的几个项目。
你可以在项目中使用这块 PCB,它有多种无线通讯选项,比如从 ESP32 到 ESP32,以及从蓝牙到 WiFi。


