Python 的 Raspberry Pi:如何停止伺服并重新启动

RaspberryPi with Python: How to stop Servo and Start again

当我在一个动作后停止舵机并想再次启动它时,舵机移动得很奇怪。舵机似乎超出了范围。

import RPi.GPIO as GPIO
import time

GPIO.setup(17, GPIO.OUT)
p = GPIO.PWM(17, 50)
p.start(2.5)
time.sleep(3)
p.ChangDutyCycle(12.5)
time.sleep(3)
p.ChangDutyCycle(2.5)
time.sleep(3)
p.stop()
p.start(2.5)
# this is not working
p.ChangDutyCycle(12.5)
p.stop()

舵机正常应该会再次启动并运动。它认为它可能设置了错误的开始位置并想朝另一个方向移动。

我解决的问题不是很优雅,但我没有找到更好的解决方案。我制作了一个包含所有伺服动作的额外文件,并在主程序中使用 os.system("path to file") 执行它。在单独的文件中,我初始化了伺服引脚并启动了伺服。最后,我停止了伺服系统,只清理了伺服系统的引脚,以免破坏涉及其他引脚的主程序。问题是您必须将舵机设置回单独文件末尾的起始位置。

不确定它是否正确,但是,如果您再次创建 PWM,它会在停止后工作。所以:

p = GPIO.PWM(17, 50)
p.start(2.5)
time.sleep(3)
p.ChangDutyCycle(12.5)
p.stop()

# create it again
p = GPIO.PWM(17, 50)
p.start(12.5)
time.sleep(3)
p.ChangDutyCycle(4)
p.stop()

或者,您可以使用我的库,它隐藏了大部分 pwm 和 GPIO 板的复杂性。示例代码:

from RaspberryMotors.motors import servos
s1 = servos.servo(11)  #create the servo objects , connected to GPIO board pin #11 
s1.setAngleAndWait(45) # move S1 position of 45 degrees
s1.shutdown()  #will clean up the GPIO board as well

您可以通过以下两个链接中的任意一个查看下载代码或库: https://github.com/vikramdayal/RaspberryMotors 要么 https://pypi.org/project/RaspberryMotors/#description