已解决:问题不在于软件,而在于硬件。似乎 pi zero w 没有足够的功率用于微型伺服电机。当我将伺服器连接到外部电源时,问题就消失了。
在以下脚本中调用 time.sleep 后,我的树莓派零 w 挂断了。我必须停止程序并重新连接到 ssh。
import RPi.GPIO as gpio
import time
servo = 18
gpio.setmode(gpio.BCM)
gpio.setup(servo, gpio.OUT)
p = gpio.PWM(servo, 50)
p.start(2.5)
print("7.5")
p.ChangeDutyCycle(7.5)
print("changed duty cycle to 7.5") # <-- this is the last thing printed
time.sleep(3)
print("12.5")
p.ChangeDutyCycle(12.5)
time.sleep(3)
print("ended")
p.stop()
GPIO.cleanup()
这停止工作后print("changed duty cycle to 7.5")
我试图用
t = time.time()
while time.time()-t < 4:
pass
有时会起作用,但并不一致。当我用一些需要一些时间的计算替换 time.sleep 时,我的程序在执行时停止工作p.stop()
。如果我将最后两行注释掉,我的程序将“成功”执行,但之后我无法从命令行执行任何操作而不会导致 pi 崩溃。
我在同一个 pi 上的另一个脚本中测试了 time.sleep,一切正常。因此,我认为问题与对 GPIO 引脚的访问有关。
我将 Raspbian 与 python 3.7.3 一起使用。我的伺服电机 (DS-140BBMG) 连接到 GPIO-18 引脚、+5V 和 GND。
编辑:
我找到了另一种方法来冻结我的 py 而不使用 time 模块。当我第一次执行以下代码时,他成功执行(180度转弯和返回)。但是,当第二次执行它时,代码在大约 90 度处挂起。
import RPi.GPIO as gpio
import time
servo = 18
gpio.setmode(gpio.BCM)
gpio.setup(servo, gpio.OUT)
p = gpio.PWM(servo, 50)
p.start(2.5)
for i in range(1000000):
p.ChangeDutyCycle(2.5 + i*0.00001)
for i in range(1000000):
p.ChangeDutyCycle(12.5 - i*0.00001)
p.stop()
gpio.cleanup()
谢谢你的帮助