You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3用CircuitPython实现自动发ESC后如何禁用USB HID?

解决ESP32-S3 CircuitPython发送ESC后禁用USB HID键盘的问题

核心结论

CircuitPython不支持在运行时动态移除或禁用已初始化的USB HID设备——USB设备的配置(包括HID、大容量存储等)是在设备上电启动时由boot.py中的设置决定的,运行时无法修改USB设备描述符。

可行替代方案

方案1:切换到USB大容量存储模式(U盘模式)

发送完ESC键后,让ESP32-S3切换为仅USB大容量存储设备,此时系统会识别它为U盘而非键盘,避免意外输入。

代码示例:

import time, gc
import board
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
import storage
import usb_cdc

# 初始化键盘
kbd = Keyboard(usb_hid.devices)

# 发送ESC键
def send_esc():
    kbd.press(Keycode.ESCAPE)
    time.sleep(0.1)
    kbd.release(Keycode.ESCAPE)
    # 重复发送几次
    for _ in range(2):
        time.sleep(0.5)
        kbd.press(Keycode.ESCAPE)
        time.sleep(0.1)
        kbd.release(Keycode.ESCAPE)

# 执行发送
send_esc()
time.sleep(1)

# 切换到USB大容量存储模式,禁用HID和REPL
storage.enable_usb_drive()
usb_cdc.disable()
# 此时HID设备会自动断开,系统识别为U盘

方案2:发送后进入深度睡眠(彻底断开USB)

如果不需要ESP32-S3继续供电,可以发送完ESC后进入深度睡眠,此时USB会完全断开,不再被识别为任何设备。

代码示例:

import time
import board
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
from adafruit_deepsleep import DeepSleep

# 初始化键盘和深度睡眠模块
kbd = Keyboard(usb_hid.devices)
ds = DeepSleep()

# 发送ESC键
def send_esc():
    kbd.press(Keycode.ESCAPE)
    time.sleep(0.1)
    kbd.release(Keycode.ESCAPE)
    for _ in range(2):
        time.sleep(0.5)
        kbd.press(Keycode.ESCAPE)
        time.sleep(0.1)
        kbd.release(Keycode.ESCAPE)

send_esc()
time.sleep(1)

# 进入深度睡眠,USB断开
ds.sleep()

方案3:预配置USB模式(boot.py控制)

如果希望只有在需要发送ESC时才启用HID,平时禁用,可以修改boot.py,通过引脚状态判断是否加载HID设备:

boot.py代码:

import board
import digitalio
import usb_hid
import storage

# 设置一个引脚作为触发(比如引脚GPIO0,默认接地时禁用HID)
trigger_pin = digitalio.DigitalInOut(board.GPIO0)
trigger_pin.direction = digitalio.Direction.INPUT
trigger_pin.pull = digitalio.Pull.UP

# 如果引脚被拉低(比如接地),则启用HID,否则禁用
if not trigger_pin.value:
    usb_hid.enable((usb_hid.Device.KEYBOARD,))
else:
    usb_hid.disable()
    storage.enable_usb_drive()

发送完ESC后重启设备,若触发引脚未被拉低,设备就不会再加载HID。

为什么之前的方案报错

  • device.disable()错误:CircuitPython中的HID设备对象没有disable()方法,该方法不存在。
  • usb_hid.devices = ()错误:usb_hid.devices是只读属性,无法直接赋值修改。
  • 筛选设备的方法错误:同样因为usb_hid.devices只读,无法重新赋值,且无法通过类型判断移除设备。

内容的提问来源于stack exchange,提问作者AbeFM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:39:59