【问题标题】:Raspberry Pi Python Code Won't Move ServoRaspberry Pi Python 代码不会移动伺服
【发布时间】:2016-09-26 08:24:45
【问题描述】:

所以我正在使用 Raspberry Pi 做一个涉及移动伺服电机的小项目。在 Python 3 中的以下代码中,我首先在大约 45 度处启动伺服。在后面的代码中,根据之前的角度确定了不同的角度,并改变了占空比。

def main():   
    #Import functions
    import measure, move
    import time
    import RPi.GPIO as GPIO
    #Declare Variables
    Servo_pin = 35
    angle = 45
    freq = 50
    #Setup board
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(Servo_pin, GPIO.OUT)
    servo = GPIO.PWM(Servo_pin,freq)
    #Determine Duty Cycle
    dc = 1/18 * (angle) + 2
    print("Starting Duty Cycle: ",dc)
    #Start servo
    servo.start(dc)

    i = 1
    #Determine angle based on previous angle
    while True:
        if (i == 0):
            angle = 45
        elif (i == 1):
            angle = 90
        elif (i == 2):
            angle = 180
        elif (i > 2):
            angle = 45
            i = 0
        i = i+1
        #Change servo's position
        #Convert angle to Duty Cycle
        dc = 1/18 * (angle) + 2
        print("Setting Duty Cycle: ",dc)
        #Change position
        servo.ChangeDutyCycle(dc)
        #Give servo time to finish moving
        time.sleep(0.3)    
main()

我已将伺服器连接到电池组(4 节 AA 电池),但伺服器不会随此代码移动。现在,我承认我是一个初学者,这可能真的很容易,如果是这样,我提前道歉。

感谢任何帮助!

【问题讨论】:

  • 我没有使用 rasp-pi 的经验,但是只要按照代码,你有没有看到输出 Starting Duty Cycle:
  • @downshift 是的,只有在初始程序启动后。 startServo 函数只能被调用一次来启动伺服。
  • 此视频可能会有所帮助或建议检查Servo control using Raspberry Pi.

标签: python python-3.x raspberry-pi servo


【解决方案1】:

需要有一个共同点。我使用了两个单独的面包板,并没有连接一个共同点。一旦我连接了一个公共地线,伺服就开始按我的意愿运行。

感谢您的编码帮助!

【讨论】:

  • 我对这个答案缺乏支持感到非常失望。我可以用万用表进行数小时的“调试”,我确信我的 Raspberry Pi 工作正常。原来我单独的伺服电池组是问题所在。将 Pi、伺服和电池的接地连接在一起是它为我工作的原因。
【解决方案2】:

根据https://sourceforge.net/p/raspberry-gpio-python/wiki/PWM/sourceforge 上的文档,当代表 PWM 的实例变量超出范围时,PWM 将停止。你的两个函数都包含这一行:servo = GPIO.PWM(pin,freq),创建一个局部变量servo,一旦到达函数末尾,它就会超出范围。一种解决方法是移动这些行:

import time
import RPi.GPIO as GPIO
# HERE you need to define which pin you are using
# I can't tell you how to do that
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)
freq = 10.0   # or some other value to get started
servo = GPIO.PWM(pin,freq)

到脚本的顶部,然后从各个函数中删除这些行。现在servo 将成为一个全局变量,在程序的任何时候都不会超出范围。

可能还有其他问题。您是否有电压表或示波器来验证引脚是否按照您的意图进行操作?我一直在处理这种应用程序,在连接所有硬件之前,了解拼图的小部分是否真的在工作会很有帮助。没有什么是第一次就可以正常工作:-)。

【讨论】:

  • 我修复了范围问题,但仍然没有运气。我什至将伺服引脚切换到不同的 GPIO 引脚。
  • 我不知道你的电机是如何工作的。在程序中,您的占空比值(名为dc 的变量)的范围为 2 到 12;完整范围为 0-100(百分比)。您确定您的电机需要 2%-12% 的范围吗?你能用交流电压表看引脚吗?您应该会看到与占空比相关的电压。
  • 我目前正在使用这个伺服:amazon.com/gp/product/B0015H2V72/… 但是,很遗憾我没有电压表。
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多