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

  1. 直接打开ArduinoIDE加载库 ,库文件提供了所有你将用到的函数;
  2. 打开实例文件的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案例。
  • 希望可以帮助大家~希望大家一次成功!
  • 物联沃分享整理
    物联沃-IOTWORD物联网 » ESP32与PS4手柄通信教程

    发表评论