如何让舵机仅运行指定时长?基于树莓派RPi.GPIO的控制问题
问题根源
你现有的代码存在3个核心问题导致舵机无限转动:
- 占空比设置后的
sleep参数为0,相当于设置完转动信号后没有停留就执行停止逻辑 - 拼写错误:
ChangeDutyCylce应为ChangeDutyCycle,这行错误代码无法执行,导致舵机一直保持转动占空比不会停止 - 导入逻辑混乱,
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
相关产品推荐
相关产品推荐

