You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:18:20