如何用ESP32打造蓝牙HID无线控制器?3大核心步骤详解

【免费下载链接】esp32_mouse_keyboard ESP32 implementation for HID over GATT Keyboard and Mouse (Bluetooth Low Energy). Including serial API for external modules (similar to Adafruit EZKey HID) 【免费下载链接】esp32_mouse_keyboard 项目地址: https://gitcode.com/gh_mirrors/es/esp32_mouse_keyboard

项目核心价值

打破有线束缚:ESP32蓝牙HID的3大应用场景

传统输入设备受限于USB线缆长度,而基于ESP32的蓝牙HID方案能实现10米内精准控制。无论是打造智能家居遥控器、游戏手柄,还是为残障人士定制辅助输入设备,都能通过这个开源项目快速实现。项目特有的Serial API接口,让Arduino等外部模块也能轻松接入,扩展出如"脑机接口控制电脑"等创新应用。

低成本方案对比:为何选择ESP32而非专用芯片?

相比传统蓝牙HID芯片(如CSR8510),ESP32方案具有三大优势:一是成本降低60%,单芯片即可实现蓝牙通信与传感器数据处理;二是开发灵活度提升,支持通过menuconfig自定义按键映射和功耗参数;三是扩展性更强,可直接驱动OLED屏幕、连接环境传感器构建多功能控制器。硬件设计文件(位于hardware/目录)已包含KiCad原理图和PCB布局,方便开发者快速打样。

技术实现原理

通俗理解GATT服务:蓝牙通信的"快递系统"

如果把蓝牙通信比作快递服务,GATT服务就像快递公司的分拣中心。ESP32作为HID设备,通过GATT将鼠标移动、键盘按键等数据打包成"快递包裹"(HID报告),发送给电脑或手机。每个"包裹"都有特定的"快递单"(UUID),比如0x1812是HID服务的标准UUID,0x2A4D则代表鼠标输入报告的特征值。项目中main/esp_hidd_prf_api.c文件实现了这套"快递系统"的核心逻辑,确保数据准确送达。

HID协议工作流程:从按键到屏幕响应的3个步骤

当你按下自定义控制器上的按键时,ESP32会执行以下操作:

  1. 数据编码:在hid_dev.c中,按键被转换为符合HID规范的扫描码(如HID_KEY_A对应0x04),鼠标移动则被量化为±127的位移值
  2. 蓝牙传输:通过esp_hidd_send_keyboard_value()函数将8字节报告通过BLE发送,关键代码在main/ble_hidd_demo_main.c的第309行
  3. 主机解析:电脑接收到报告后,操作系统的HID驱动会将其转换为实际操作,整个过程延迟通常低于30ms

⚠️ 注意:macOS对HID报告格式要求严格,需在menuconfig中启用"苹果设备兼容模式",否则可能出现按键无响应

BLE HID与USB HID对比:无线方案的取舍

特性 BLE HID(本项目) USB HID(传统键盘)
延迟 20-50ms <5ms
功耗 10-50mA(通信时) 100-200mA
传输距离 10米(空旷) 受线缆长度限制
设备数量 最多连接3台设备 单设备独占
开发复杂度 需处理蓝牙配对 即插即用

环境搭建指南

零基础环境配置:15分钟完成ESP-IDF部署

  1. 安装依赖包(Ubuntu示例):
    sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev  # 安装编译工具链
    
  2. 获取ESP-IDF:
    mkdir -p ~/esp && cd ~/esp  # 创建工作目录
    git clone https://gitcode.com/gh_mirrors/es/esp-idf.git -b v4.4  # 克隆稳定版框架
    cd esp-idf && ./install.sh esp32  # 安装ESP32专用工具链
    
  3. 设置环境变量:
    . $HOME/esp/esp-idf/export.sh  # 临时生效,建议添加到.bashrc
    

源码部署与参数配置:3步完成个性化设置

  1. 获取项目代码:
    git clone https://gitcode.com/gh_mirrors/es/esp32_mouse_keyboard.git  # 克隆项目源码
    cd esp32_mouse_keyboard  # 进入项目目录
    
  2. 配置硬件参数:
    idf.py menuconfig  # 启动图形配置界面
    
    • 导航到Component config → HID Device Configuration
    • 设置UART RX Pin<16>(默认值),Indicator LED Pin<2>
    • 启用Joystick Support以兼容游戏手柄模式
  3. 保存配置并退出(按ESC两次,选择Save

功能验证流程

固件烧录与设备连接:5分钟上手测试

  1. 生成固件:
    idf.py build  # 编译项目,首次编译需10-15分钟
    
  2. 连接ESP32到电脑,查询端口:
    ls /dev/ttyUSB*  # Linux系统,通常显示为/dev/ttyUSB0
    # 若未找到设备,需安装CP210x驱动:https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers
    
  3. 烧录固件:
    idf.py -p <COM3> flash  # Windows使用COM端口,Linux/macOS使用/dev/ttyUSB0
    
  4. 监控设备输出:
    idf.py -p <COM3> monitor  # 按Ctrl+]退出监控
    

    成功启动后会显示HID_DEMO: BLE HID device initialized

基础功能测试:3个关键操作验证

  1. 鼠标控制:通过UART发送命令测试(需使用Putty或TeraTerm连接ESP32的UART端口,波特率115200):
    $M1,10,10,0  # 按住左键移动(参数:按键=1, X=10, Y=10, 滚轮=0)
    $M0,0,0,0    # 释放鼠标按键
    
  2. 键盘输入:发送字符"A":
    $K1,4,0      # 按下A键(扫描码4)
    $K0,4,0      # 释放A键
    
  3. 消费者控制:调节系统音量:
    $C1,233,0    # 音量增加(HID_CONSUMER_VOLUME_UP=233)
    $C0,233,0    # 停止调节
    

进阶功能开发:Serial API应用示例

  1. 自定义遥控器:通过Arduino连接红外接收器,解析电视遥控器按键后,通过UART发送到ESP32:
    // Arduino示例代码
    void sendVolumeUp() {
      Serial.write("$C1,233,0\r\n");  // 发送音量+命令到ESP32
      delay(100);
      Serial.write("$C0,233,0\r\n");
    }
    
  2. 姿态控制鼠标:使用MPU6050传感器获取倾斜角度,转换为鼠标移动:
    // ESP32端处理代码(需添加MPU6050驱动)
    int16_t ax, ay;
    mpu.getAcceleration(&ax, &ay, NULL);
    esp_hidd_send_mouse_value(conn_id, 0, ax/1638, ay/1638, 0);  // 转换为±127范围
    

附录:常见故障速查表

问题现象 排查思路 解决方案
烧录失败,提示Failed to connect to ESP32 1. 检查USB线是否接触良好
2. 确认端口号是否正确
1. 按住BOOT键再按RESET键进入下载模式
2. 尝试更换USB端口或线缆
电脑找不到蓝牙设备 1. 检查ESP32是否在广播(LED闪烁)
2. 确认menuconfig中蓝牙已启用
1. 按设备上的复位键重启
2. 执行idf.py menuconfig确认Bluetooth选项已勾选
鼠标移动卡顿 1. 检查电池电压(低于3.0V会导致通信不稳定)
2. 查看附近是否有2.4GHz干扰
1. 更换电池或使用稳压电源
2. 在menuconfig中将Advertising Interval设为50ms
按键无响应(macOS) 苹果系统对HID报告格式要求严格 menuconfig中启用Apple HID Compatibility选项
无法保存配置参数 NVS分区损坏或大小不足 执行idf.py erase_flash擦除整个Flash后重试

🔧 开发技巧:修改按键映射可直接编辑main/hid_dev.h中的扫描码定义,如将HID_KEY_A改为0x05即可将A键映射为B键

【免费下载链接】esp32_mouse_keyboard ESP32 implementation for HID over GATT Keyboard and Mouse (Bluetooth Low Energy). Including serial API for external modules (similar to Adafruit EZKey HID) 【免费下载链接】esp32_mouse_keyboard 项目地址: https://gitcode.com/gh_mirrors/es/esp32_mouse_keyboard

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐