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
相关产品推荐
相关产品推荐

