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

如何让舵机仅运行指定时长?基于树莓派RPi.GPIO的控制问题

问题根源

你现有的代码存在3个核心问题导致舵机无限转动:

  1. 占空比设置后的sleep参数为0,相当于设置完转动信号后没有停留就执行停止逻辑
  2. 拼写错误:ChangeDutyCylce应为ChangeDutyCycle,这行错误代码无法执行,导致舵机一直保持转动占空比不会停止
  3. 导入逻辑混乱,up_function中调用time.sleep但未导入time模块,会提前抛出异常中断停止逻辑

完整修改后代码

import RPi.GPIO as GPIO
from time import sleep

# 公共GPIO初始化
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
pwm = GPIO.PWM(17, 50)
pwm.start(0)

def up_function(run_duration: int = 2):
    # 设置拉起占空比
    pwm.ChangeDutyCycle(2)
    # 持续转动指定时长
    sleep(run_duration)
    # 停止占空比输出
    pwm.ChangeDutyCycle(0)
    sleep(1)

def down_function(run_duration: int = 2):
    # 设置降下占空比
    pwm.ChangeDutyCycle(12.5)
    # 持续转动指定时长
    sleep(run_duration)
    # 停止占空比输出
    pwm.ChangeDutyCycle(0)

if __name__ == "__main__":
    try:
        # 可选:增加自定义时长输入,不需要可以删除此行直接用函数默认值
        run_time = int(input("请输入舵机运行秒数:"))
        cmd = input("Please Input Up or Down: ")
        if cmd == 'up':
            up_function(run_time)
        elif cmd == 'down':
            down_function(run_time)
        else:
            print('Exiting Program')
    except Exception as e:
        print(f"运行出错:{e}")
    finally:
        # 清理GPIO资源,避免多次运行出现引脚占用警告
        pwm.stop()
        GPIO.cleanup()

核心修改说明

  • 把公共的GPIO初始化、模块导入提到全局,避免重复执行冗余逻辑
  • 给两个控制函数增加了run_duration参数,设置完转动占空比后会等待对应时长再执行停止逻辑
  • 修复了拼写错误和导入错误,保证停止逻辑可以正常执行
  • 增加了finally块做GPIO资源清理,避免多次运行出现引脚占用警告
  • 可选加入了运行时长的输入入口,你可以每次运行时自定义转动时长,也可以直接修改函数默认的run_duration值固定时长

内容的提问来源于stack exchange,提问作者gwagner209

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:04