Arduino PyFirmata连接舵机时报PermissionError(13)访问拒绝错误
故障原因
serial.serialutil.SerialException: WriteFile failed (PermissionError(13, 'Access is denied.', None, 5))这个报错的触发原因不是串口被其他程序占用,本质是舵机工作时的瞬时大电流拉低Arduino供电电压,导致主控欠压复位、USB串口临时断开:
- 故障触发时Windows播放USB设备断开提示音,是Arduino掉电后从USB总线枚举消失的直接表现,此时程序持有的原串口句柄已经失效,向不存在的端口写入数据就会抛出这类权限错误。
- 观测到的故障规律完全匹配该成因:拔掉舵机信号线时,舵机收不到动作指令,不会产生大电流负载;断开舵机VCC时舵机完全断电无负载,两种场景下都不会拉低系统供电,Arduino不会复位,报错自然不会触发。
- 更换舵机仍然复现故障属于正常现象:常规小型舵机转动瞬间工作电流普遍在500mA以上,堵转电流甚至可达1~2A,远高于Arduino板载USB 5V引脚的供电上限(多数Uno类主板板载5V稳压芯片最大输出仅500mA,电脑USB2.0端口默认限流同样为500mA),直接通过Arduino板载5V引脚给舵机供电,必然会在舵机启动瞬间拉低电压触发主控复位。
解决方案
- 舵机改用独立供电:选用输出规格为5V/2A及以上的独立电源(专用舵机电源、输出足够的手机充电头、锂电池搭配5V降压模块均可)为舵机供电,必须将舵机电源的GND与Arduino的GND引脚连接共地,否则信号无统一参考电平,舵机无法正常响应指令。
- 按规则调整接线:舵机信号线保持连接Arduino D6引脚,舵机VCC接独立5V电源正极,舵机GND同时连接独立电源负极、Arduino GND引脚,Arduino保持原有USB连接与电脑通信即可。
- 可选抗干扰优化:在舵机VCC与GND引脚之间并联100μF~1000μF的电解电容(注意区分电容正负极,不要接反),滤除舵机启停时产生的电压尖峰,进一步降低主控受干扰复位的概率。
- 接线细节注意:舵机供电回路尽量选用长度短、线径粗的导线,减少线阻带来的额外电压跌落。
按上述方法调整后重新运行测试代码,报错会完全消失,舵机可正常按指令转动。
附测试参考代码:
import time from pyfirmata import Arduino, SERVO PORT = "COM10" servoPin = 6 try: board = Arduino(PORT) except: print("Arduino board not plugged in! (Or not accessible on specified port)") time.sleep(5) quit() board.digital[servoPin].mode = SERVO for i in range (0, 180, 8): board.digital[servoPin].write(i) time.sleep(0.1)
内容的提问来源于stack exchange,提问作者ScrimbloPoster
相关产品推荐
相关产品推荐

