当我在一个动作后停止伺服并想再次启动它时,伺服运动异常。伺服器似乎超出了范围。
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()
伺服通常应重新启动并运动。它认为这可能会将起始位置设置为错误,并希望朝另一个方向移动。
答案 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()