基于Pico微控制器创建虚拟USB设备求技术指导
使用CircuitPython在Pico上创建自定义虚拟USB设备指南
核心实现流程
- 确认使用最新稳定版CircuitPython(需支持USB自定义设备/HID功能)
- 配置USB核心参数(VID/PID、厂商/产品信息等)
- 编写对应功能的代码(HID类设备或自定义协议设备)
- 上传代码到Pico,主机端识别并测试
VID/PID及关键参数设置
- VID(厂商ID):非商用项目可使用微软预留的测试VID
0x1209,配套测试PID范围为0x0000-0xFFFE;避免使用已注册的官方VID(如树莓派的0x2E8A) - 参数配置方式:在CircuitPython中通过
usb_hid模块的自定义描述符字典设置,示例代码:
import usb_hid # 自定义USB设备参数 CUSTOM_USB_CONFIG = { "vid": 0x1209, "pid": 0xAAAA, "manufacturer": "Your Lab", "product": "Pico Custom USB Device", "usage_page": 0x01, # HID通用桌面设备页 "usage": 0x06 # 键盘设备类型 } # 替换默认USB配置 usb_hid.enable((usb_hid.Device.KEYBOARD,), custom_descriptor=CUSTOM_USB_CONFIG)
- 非HID类自定义设备:需要手动编写完整的USB设备描述符、配置描述符、接口描述符字节码,需熟悉USB协议规范。
自定义HID设备实现示例
以下代码实现一个自定义HID键盘设备,可发送按键信号:
import board import usb_hid from adafruit_hid.keycode import Keycode from adafruit_hid.keyboard import Keyboard import time # 自定义HID报告描述符(定义设备功能与数据格式) CUSTOM_REPORT_DESC = b"\x05\x01\x09\x06\xA1\x01\x05\x07\x19\xE0\x29\xE7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x26\xFF\x00\x05\x07\x19\x00\x29\xFF\x81\x00\xC0" # 定义自定义USB设备 CUSTOM_DEVICE = usb_hid.Device( report_descriptor=CUSTOM_REPORT_DESC, usage_page=0x01, usage=0x06, report_ids=(0,), in_report_lengths=(8,), out_report_lengths=(1,), vid=0x1209, pid=0xAAAA, manufacturer="Custom Maker", product="Pico Custom Keyboard" ) # 启用自定义设备 usb_hid.enable((CUSTOM_DEVICE,)) keyboard = Keyboard(usb_hid.devices) # 测试按键发送 while True: keyboard.send(Keycode.A) time.sleep(2) keyboard.release_all() time.sleep(1)
提示:HID报告描述符可通过HID Descriptor Tool工具生成,确保字节码符合USB HID规范。
常见问题排查
- 主机无法识别设备:检查CircuitPython版本兼容性,确认VID/PID未被占用,重启Pico并重传代码
- 参数设置无效:验证自定义描述符格式,特别是
usage_page、usage需匹配设备类型,报告描述符字节码不能出错 - 文档缺失:可查看CircuitPython源码中
usb_hid模块的实现逻辑,重点关注设备描述符的构造过程
内容的提问来源于stack exchange,提问作者StackyOvery
相关产品推荐
相关产品推荐

