如何让运行MicroPython的USB设备检测是否连接到PC活跃USB端口?
检测MicroPython设备是否连接到PC活跃USB端口的实用方案
思路1:检测USB D+/D-引脚电平
这是最直接且硬件依赖低的方案,核心原理:
- 纯充电的USB充电器/端口通常会把D+和D-短接(电平一致),或保持固定低电平
- PC的活跃USB端口(支持数据传输)在未枚举时,D+或D-会有上拉(USB2.0规范中,全速设备D+上拉3.3V,低速设备D-上拉),因此两者电平不一致
操作步骤:
- 查设备硬件手册,找到对应USB的D+、D-引脚(比如PyBoard的D+是X1、D-是X2;部分ESP32开发板的D+是GPIO20、D-是GPIO19)
- 将两个引脚配置为输入模式,按需启用内部上拉/下拉
- 读取电平并判断:电平一致则为纯电源,不一致则为PC活跃端口
MicroPython代码示例:
from machine import Pin import time d_plus = Pin(20, Pin.IN, Pin.PULL_DOWN) # 替换为你的D+引脚 d_minus = Pin(19, Pin.IN, Pin.PULL_DOWN) # 替换为你的D-引脚 while True: dp_level = d_plus.value() dm_level = d_minus.value() if dp_level != dm_level: print("已连接到PC活跃USB端口") # 执行交互逻辑,比如启动串口通信 else: print("仅连接电源") # 执行常规工作逻辑 time.sleep(2)
思路2:监听USB主机枚举事件
如果设备自带USB设备控制器(比如PyBoard、RP2040系列),可直接通过MicroPython的USB模块检测主机连接状态:
代码示例(以PyBoard为例):
import usb.core import time while True: if usb.core.dev().connected(): print("检测到PC USB主机连接") # 启动交互模式,比如开启文件传输、命令响应 else: print("未连接到USB主机") # 保持常规工作模式 time.sleep(1)
思路3:利用USB串口的CTS引脚状态
如果设备通过USB CDC串口和PC通信,PC连接并打开串口时,通常会拉低CTS引脚(Clear To Send),纯充电时CTS保持高电平:
操作步骤:
- 查硬件手册找到USB串口对应的CTS引脚
- 配置为输入引脚,读取电平状态
代码示例:
from machine import Pin import time cts_pin = Pin(15, Pin.IN, Pin.PULL_UP) # 替换为你的CTS引脚 while True: if cts_pin.value() == 0: print("PC已打开串口,处于活跃连接状态") # 执行交互逻辑 else: print("仅连接电源或PC未打开串口") # 执行常规逻辑 time.sleep(2)
思路4:检测USB总线电流变化(需额外硬件)
纯充电时设备电流相对稳定,PC枚举或传输数据时电流会有明显波动。可在VBUS线路串联0.1Ω采样电阻,通过ADC读取电压差计算电流:
代码示例(以ESP32为例):
from machine import ADC, Pin import time adc = ADC(Pin(34)) adc.atten(ADC.ATTN_11DB) # 支持0-3.3V输入 while True: voltage = adc.read() * (3.3 / 4095) current = voltage / 0.1 # 采样电阻为0.1Ω if current > 0.1: # 假设枚举时电流超过100mA print("检测到PC活跃连接") else: print("仅连接电源") time.sleep(1)
内容的提问来源于stack exchange,提问作者PhilTilson
相关产品推荐
相关产品推荐

