使用Python的RaspberryPi:如何停止伺服并重新启动

时间:2019-07-02 08:05:34

标签: python raspberry-pi servo

当我在一个动作后停止伺服并想再次启动它时,伺服运动异常。伺服器似乎超出了范围。

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()

伺服通常应重新启动并运动。它认为这可能会将起始位置设置为错误,并希望朝另一个方向移动。

3 个答案:

答案 0 :(得分:1)

或者,您可以使用我的库,它隐藏了大部分 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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不确定它是否正确,但是在停止之后,如果再次创建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()