树莓派Python脚本运行后GPIO26引脚无法保持高电平问题排查
问题描述
我正在搭建一个基于树莓派和步进电机的摄影测量系统。Python脚本运行正常,但遇到一个问题:脚本运行完成后无法将GPIO26引脚设置为高电平并保持。
步进驱动器的使能输入引脚为高电平时会禁用电机,因此我通过pigpio在开机时将GPIO26引脚设为高电平,这一操作正常生效。运行Python脚本时,我将该引脚设为低电平以驱动步进电机,希望脚本结束后能再次将其设为高电平。
我尝试了以下命令:
os.system('pigs w 26 1')subprocess.call("pigs w 26 1", shell=True)
这些命令能短暂生效,但脚本退出后引脚又变回低电平,仿佛命令在脚本结束后被重置了。
当我在终端中输入pigs w 26 1时,该命令能正常工作。
相关代码
import os, sys import subprocess from time import sleep from gpiozero import DigitalOutputDevice as stepper def InitGPIO(): try: global step_pul #pulse global step_en #enable step_pul=stepper(21) step_en=stepper(26) print ("GPIO initialisiert.") except: print ("Fehler bei der GPIO-Initialisierung.") def motor_step(): SPR=40000 #steps per rotation step_count = SPR delay = .000025 for x in range(step_count): step_pul.on() sleep(delay) step_pul.off() sleep(delay) InitGPIO() step_en.off() for i in range(1): #camTrigger(1) motor_step() #os.system('sudo -u root -S pigs w 26 1') subprocess.call("pigs w 26 1", shell=True)
问题原因与解决方法
原因
你用gpiozero的DigitalOutputDevice初始化了GPIO26(step_en),而gpiozero自带自动清理机制:当脚本退出时,它会自动将所有由它管理的GPIO引脚重置为默认状态。你调用pigs命令确实会短暂把引脚设为高电平,但紧接着脚本执行完毕,gpiozero的清理逻辑会触发,覆盖你设置的电平,导致引脚变回低电平。
解决方法
方案1:用gpiozero直接设置并关闭自动清理
不需要调用pigs,直接通过gpiozero的API设置高电平,然后手动关闭设备以阻止自动重置:
# 替换原来的subprocess调用 step_en.on() step_en.close() # 手动关闭设备,避免gpiozero自动重置引脚
方案2:全程使用pigpio控制引脚,避免混用
既然已经在用pigpio工具,直接用其Python库控制引脚,彻底规避gpiozero的自动清理冲突:
import pigpio import time pi = pigpio.pi() if not pi.connected: exit() # 初始化引脚为输出模式 pi.set_mode(21, pigpio.OUTPUT) pi.set_mode(26, pigpio.OUTPUT) pi.write(26, 0) # 拉低使能引脚,允许电机运转 # 驱动步进电机 SPR=40000 delay = .000025 for x in range(SPR): pi.write(21, 1) time.sleep(delay) pi.write(21, 0) time.sleep(delay) pi.write(26, 1) # 拉高使能引脚,禁用电机 pi.stop() # 关闭pigpio连接,不会重置引脚状态
这种方式下,pi.stop()不会修改引脚的当前电平,设置的高电平会保持。
验证
修改脚本后运行,结束后在终端执行pigs r 26,若返回1则说明引脚已保持高电平。
内容的提问来源于stack exchange,提问作者Mi GRSNS
相关产品推荐
相关产品推荐

