ESP32与PS4手柄的通讯

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案例。
  • 希望可以帮助大家~希望大家一次成功!
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
DIY使用ESP32的手持游戏手柄并通过BLE进行通信 硬件部件: esp32× 1个 ws2812b× 6 游戏杆× 2 角度按钮× 2 按钮× 8 18560电池和电池座× 2 三向拨动开关× 1个 TP4056带保护的电池充电电路× 1个 MT3608升压转换器× 1个 软件应用程序和在线服务: Arduino IDE 手动工具和制造机: 烙铁(通用) 这是一个使用ESP32微控制器制作的DIY手持游戏手柄。您可能之前已经看过这样的游戏控制器。但大多数使用Arduino。或更具体地说,是Arduino pro micro或Leonardo开发板。因为这些板支持HID或通过USB的人机接口设备。但是esp32没有这种功能。那么我们该怎么做呢?嗯,esp32确实具有BLE或低功耗蓝牙,我们可以使用它通过蓝牙进行无线通信。 因此,我们有ESP32模块作为中央控制器,然后有USB C型端口和一个3.3v稳压器,可将5v转换为3.3v。然后我们有了编程电路,使用具有自动编程模式的ch340c usb到串行转换器和使用双工晶体管的自动复位电路。我们还具有电池充电电路,以及过充电和过放电保护功能。然后使用升压转换器ic将其升压至5v。接下来,我们有操纵杆,D-Pad按钮,触发按钮,Neopixel LED和i2c端口。最后是3向开关,可在USB电源和电池电源之间切换。 游戏手柄有 2个模拟游戏杆 2个触发按钮 2个D-Pads 6个可寻址RGB LED 和一个i2c端口 它可以使用2个18650锂离子电池运行,可以使用USB C型端口对其进行更改。它也可以用来对微控制器进行编程。该设计的灵感来自新的ps5控制器,以使其外观更好。GPIO4使用分压器连接到电池。这样我们就可以测量电池电压了。NeoPixel LED将指示控制器是否连接到设备或电池电压是否低。 该代码基于lemmingDev的BLE Gamepad库。在代码中,我为不同的输入定义了所有GPIO引脚。然后在设置中有一些初始的led动画。板子一旦连接到设备,所有的LED就会变成绿色。并且它将按先前定义的时间间隔检查电池电压。然后我们获得按钮状态,并相应地设置游戏手柄按钮。然后,我们采用模拟输入,并将其映射到合适的值。最后根据我们收到的值设置轴。上载代码后,在智能手机或PC上打开蓝牙菜单,您会看到一个新设备弹出。单击该按钮将其连接,就可以开始游戏了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值