ESP32与PS4手柄的通讯(遥控小车)
在我正式开始制作PS4手柄遥控ESP32的芯片之前,我尝试过PS2和手机蓝牙串口遥控,都成功进行通讯并且效果还算可以,但是PS2的手柄要配合一个接收器,占用我至少4个IO口。
而手机方面我尝试用AppInventor写了个遥控程序,然后成功进行通讯,但是会有那么几下出现延时的可能,并且除非ESP32上面有摄像头,不然用手机遥控体验感可以说是瞎子摸象…
PS4
一、先说大坑大坑大坑!!
我曾经在这里卡了一个月,花费无数,多次想直接放弃,但是最终还是完美解决了。
具体问题:
我按照曾经的成功案例和Bilibili上的分享以及Github上面的操作说明进行了我的尝试,结果发现怎么也连接不上手柄,于是我以为是开发板的问题,我就换了个板子,看到别人分享说TTGO的可以,然后说devkit-v1的不行,恰好我的就是devkit-v1,于是我就买了个80块钱的TTGO,结果还是不行,我就又买了个手柄,还是不行…我直接找到成功案例的作者,找他要了个他的手柄的链接,结果果真是手柄的锅,总结一下各位。
1、板子只要不是低功耗蓝牙(BLE)的就行,因此淘宝上20块钱的DEVKIT-V1可以直接用。
2、手柄!!手柄真的看命,看运气,如果你不想和我一样买了6个才找到能用的
分享一家淘宝店:“宅家乐电玩店”
二、正式开始
程序方面
github上面提供了PS4手柄的库与实例文件,详情请见:
https://github.com/aed3/PS4-esp32
- 直接打开ArduinoIDE加载库 ,库文件提供了所有你将用到的函数;
- 打开实例文件的connect文件;
#include <PS4Controller.h>
void setup() {
Serial.begin(115200);
// Replace the "1a:2b:3c:01:01:01" with the MAC address
// the controller wants to pair to
// Note: MAC address must be unicast
PS4.begin("aa:ba:ca:ea:01:02");
Serial.println("Ready.");
}
void loop() {
if (PS4.isConnected()) {
Serial.println("Connected!");
}
delay(3000);
}
-
注意里面的
PS4.begin("aa:ba:ca:ea:01:02");
这个可以理解为和你的手柄对频
那么,怎么修改你的PS4手柄的Mac地址呢?
请自行下载:SixaxisPairTool
软件简单到不能再简单,第一行是你的手柄Mac,第二行是你可以设置一个MAC刷进去
-
还有值得注意的是
// Note: MAC address must be unicast
这句话的意思是你的地址必须是单播 -
1)单播 MAC 地址是指第一个字节的最低位是 0 的 MAC 地址。
2)组播 MAC 地址是指第一个字节的最低位是 1 的 MAC 地址。
3)广播 MAC 地址是指每个比特都是 1 的 MAC 地址。广播 MAC 地址是组播 MAC 地址的一个特例。 -
进行好配置,只需要打开你的手柄,打开你的ESP32,如果你看到你的PS4手柄成功白色灯常亮,那么恭喜你,你成功了!你的串口应当返回:Connected!
三、扩展与应用
- 1、demo程序中有一个ReceiveData
- if (PS4.isConnected()) {
if (PS4.Right()) Serial.println("Right Button");
if (PS4.Down()) Serial.println("Down Button");
if (PS4.Up()) Serial.println("Up Button");
if (PS4.Left()) Serial.println("Left Button");
if (PS4.Square()) Serial.println("Square Button");
if (PS4.Cross()) Serial.println("Cross Button");
if (PS4.Circle()) Serial.println("Circle Button");
if (PS4.Triangle()) Serial.println("Triangle Button");
if (PS4.UpRight()) Serial.println("Up Right");
if (PS4.DownRight()) Serial.println("Down Right");
if (PS4.UpLeft()) Serial.println("Up Left");
if (PS4.DownLeft()) Serial.println("Down Left");
if (PS4.L1()) Serial.println("L1 Button");
if (PS4.R1()) Serial.println("R1 Button");
if (PS4.Share()) Serial.println("Share Button");
if (PS4.Options()) Serial.println("Options Button");
if (PS4.L3()) Serial.println("L3 Button");
if (PS4.R3()) Serial.println("R3 Button");
if (PS4.PSButton()) Serial.println("PS Button");
if (PS4.Touchpad()) Serial.println("Touch Pad Button");
if (PS4.L2()) {
Serial.printf("L2 button at %d\n", PS4.L2Value());
}
if (PS4.R2()) {
Serial.printf("R2 button at %d\n", PS4.R2Value());
}
if (PS4.LStickX()) {
Serial.printf("Left Stick x at %d\n", PS4.LStickX());
}
if (PS4.LStickY()) {
Serial.printf("Left Stick y at %d\n", PS4.LStickY());
}
if (PS4.RStickX()) {
Serial.printf("Right Stick x at %d\n", PS4.RStickX());
}
if (PS4.RStickY()) {
Serial.printf("Right Stick y at %d\n", PS4.RStickY());
}
if (PS4.Charging()) Serial.println("The controller is charging");
if (PS4.Audio()) Serial.println("The controller has headphones attached");
if (PS4.Mic()) Serial.println("The controller has a mic attached");
Serial.printf("Battery Level : %d\n", PS4.Battery());
Serial.println();
// This delay is to make the output more human readable
// Remove it when you're not trying to see the output
delay(50);
}
- 这里面提供了大量的PS4的函数使用案例,如果你想和我一样做一个小车,自己利用这些函数设计一个程序就可以啦~
- 我使用的是L298N的电机驱动,我的电机电流比较大,所以才用这个又笨又重的东西
- 同时可以使用PWM调节与一些正负数转换可以实现速度随着遥杆的变化而变化,以上视频里只是一个最基础的Demo案例。
- 希望可以帮助大家~希望大家一次成功!