本文简单介绍一下如何使用ESP32连接xbox的蓝牙手柄,使之变成一个相对通用的遥控器。
硬件平台
XBOX ONE S手柄蓝牙版
EPS32-DOWN-V3,需要注意Xbox One S手柄使用经典蓝牙,ESP32有较多型号仅支持BLE,需要选一个支持经典蓝牙+BLE的型号,BLE模式下扫描不到Xbox 手柄
软件平台
使用espidf 5.2.1版本进行开发。
实现原理
输入解析
espidf打开example内的esp_hid_host工程,基于这个demo进行修改,工程首先将BLE关闭,修改为经典蓝牙的配置。
例程配置为了扫描到的最后一个HID设备将被连接,这个地方可以自己改一下,识别蓝牙名称进行选择连接,避免有多个设备的时候连到别的设备上去,连接部分内容不多,此处略过。
正常连接后,主要需要处理的就是键值上报后的解析,解析可以参考下面的结构体
#pragma pack(1)
typedef struct
{
uint16_t left_x; ///< 左0~右65535
uint16_t left_y; ///< 上0~下65535
uint16_t right_x; ///< 左0~右65535
uint16_t right_y; ///< 上0~下65535
uint16_t triger_left; ///< 不按0~按到底1023
uint16_t triger_right; ///< 不按0~按到底1023
uint8_t key_dir; ///< 1~8 垂直向上为1,顺时针旋转递增,不按为0
struct
{
uint8_t key_a : 1;
uint8_t key_b : 1;
uint8_t key_x : 1;
uint8_t key_y : 1;
uint8_t key_lb : 1;
uint8_t key_rb : 1;
uint8_t key_page : 1;
uint8_t key_menu : 1;
};
uint8_t reserve;
} xbox_message_t;
typedef struct
{
uint8_t cap_level : 2; ///< 电量等级 0马上没电,1低电量,2中电量,2满电量
uint8_t mode : 2; ///< 供电模式 0 USB供电 1 干电池供电(或者非官方的充电电池) 2 官方可充电电池供电
uint8_t charging : 1; ///< 正在充电(官方电池)
uint8_t error : 1; ///< 出现异常
uint8_t reserve : 1; ///< 保留字段
uint8_t online : 1; ///< 在线,始终是1
} xbox_bat_info_t;
/* XBOX RUMBLE TYPE */
#define XBOX_RUMBLE_NONE 0x00
#define XBOX_RUMBLE_WEAK 0x01
#define XBOX_RUMBLE_STRONG 0x02
#define XBOX_RUMBLE_MAIN (XBOX_RUMBLE_WEAK | XBOX_RUMBLE_STRONG)
#define XBOX_RUMBLE_RIGHT 0x04
#define XBOX_RUMBLE_LEFT 0x08
#define XBOX_RUMBLE_TRIGGERS (XBOX_RUMBLE_RIGHT | XBOX_RUMBLE_LEFT)
#define XBOX_RUMBLE_ALL 0xff
typedef struct
{
uint8_t enable; ///<