ESP32-C3 SUPERMINI 尝试模拟蓝牙鼠标

本来记录了一篇 esp32-c3 如何安装micropython的文章,结果写这一篇的时候选择了编辑而不是新建,等点击保存的时候才想起来-_-!!有缘再续吧,记录一下模拟蓝牙鼠标的过程,在两台红米手机上测试通过:

  • 红米turbo4
  • 红米note9 4g

获取 MicroPythonBLEHID 库

访问 https://github.com/heerkog/MicroPythonBLEHID下载 ZIP 包并解压

使用 ampy 上传

ampy 这是最常见的技术工具,由 Adafruit 公司开发。它是一个命令行工具,专门用来通过串口与MicroPython或CircuitPython开发板(如ESP32、Raspberry Pi Pico等)进行交互。

# 安装 ampy
pip install adafruit-ampy

# 上传核心库
ampy --port /dev/ttyUSB0 put hid_services.py

# 上传示例代码
ampy --port /dev/ttyUSB0 put examples/simple/mouse_example.py main.py

测试程序

# main.py - 适用于 ESP32-C3 SuperMini 的修正版蓝牙鼠标
from hid_services import Mouse
import bluetooth
import time
import struct

# --- 1. 创建鼠标对象 ---
mouse = Mouse("ESP32-C3 Mouse")  # 这里的名字可以随意改,连接时看到的就是它
mouse.start()

# 等一下,让库内部的服务初始化完成
time.sleep(1)

# --- 2. 获取底层的 BLE 对象并手动启动广播 ---
ble = bluetooth.BLE()

# 构建广播数据包 (Advertising Data)
# 这部分数据告诉周围的设备,我们是一个鼠标。
# 020106 : 标志位,表示这是一台可被发现的 BLE 设备
# 0B09 : 后面跟着一个长度为 11 字节的设备名
# 然后跟上你的设备名 "ESP32-C3 Mouse"
device_name = "ESP32-C3 Mouse"
name_bytes = device_name.encode()
adv_data = bytearray([0x02, 0x01, 0x06])  # Flags
adv_data.append(len(name_bytes) + 1)      # 设备名长度+1
adv_data.append(0x09)                     # 设备名类型
adv_data.extend(name_bytes)               # 设备名字节

# 强制启动广播,持续广播 (间隔 100 毫秒)
ble.gap_advertise(100, adv_data=adv_data)

print("=== 蓝牙鼠标已启动 ===")
print("请在你的电脑/手机蓝牙设置中搜索并连接:", device_name)
print("等待连接...\n")

# --- 3. 主循环:等待连接并发送数据 ---
last_connected = False
while True:
    # 检查鼠标对象是否已连接
    if mouse.is_connected():
        if not last_connected:
            print("\n>>> 设备已连接!开始移动鼠标... <<<\n")
            last_connected = True
        
        # 发送鼠标移动数据: (X偏移, Y偏移, 按键状态)
        # 注意:这里是相对移动,-127到127之间的值
        # 向右移动 10 个单位
        mouse.set_axes(10, 0)
        mouse.notify_hid_report()
        time.sleep(0.5)
        
        # 向下移动 10 个单位
        mouse.set_axes(0, 10)
        mouse.notify_hid_report()
        time.sleep(0.5)
        
        # 向左移动 10 个单位
        mouse.set_axes(-10, 0)
        mouse.notify_hid_report()
        time.sleep(0.5)
        
        # 向上移动 10 个单位
        mouse.set_axes(0, -10)
        mouse.notify_hid_report()
        time.sleep(0.5)

    else:
        if last_connected:
            print(">>> 设备已断开,正在等待重新连接... <<<")
            last_connected = False
        # 如果未连接,每2秒打印一次状态,避免你干等
        print("未连接,等待中...")
        time.sleep(2)

体验

同有线连接相比,同样的程序参数跑在蓝牙上,相对坐标的定位准确率感觉低了不少,联想到使用有线手柄与蓝牙手柄时微秒的操作手感差异。个人结论是稳定性不如有线连接,但免插拔的优势以及可持续性(手机的口空出来可以连接充电器)还是挺吸引人的。

标签: esp32

移动端可扫我直达哦~

推荐阅读