用RaspberryPi 2无法控制任何伺服

时间:2015-10-26 20:45:04

标签: python raspberry-pi gpio pwm servo

我遇到了问题,我无法控制我的任何伺服系统。我有两个伺服电机,一个是模型平面中使用的普通伺服电机,第二个是微型伺服电机。

我将它们分开连接(信号线连接到GPIO引脚,另外两根电缆直接连接到电路板,然后连接到外部电源)。 当我尝试通过类似的python代码运行它们时

...
GPIO.setmode(GPIO.BCM)
GPIO.setup(11, GPIO.OUT)
pwm = GPIO.PWM(11, 50)
pwm.start(2)
timelib.sleep(2)
pwm.ChangeDutyCycle(3)
timelib.sleep(2)
...
舵机有时只是转了一下,但后来停在了一边。在此之后,您仍然可以听到伺服制造噪音,就像它试图进一步运行一样。在它结束之后我无法使其工作或以任何方式转向它。无论我做什么输入,它都会留在那里。如果我手动将它们转回到起始位置,它将再次转向同一端。我无法弄清楚我做错了什么,或者我需要改变自己的做法。

有没有人有任何提示或有类似的问题? 我很感谢每一个进一步的提示和我将要做的进一步的步骤。

提前致谢!

2 个答案:

答案 0 :(得分:0)

伺服系统位置由50 Hz PWM信号的脉冲宽度控制。因此,我们需要以50 Hz的频率打开PWM序列。 请注意,对于50 Hz信号,信号周期为1/50 = .02秒或20毫秒。请记住此期间,因为我们稍后会再回过头来看。我们首先使用命令:

在引脚11上创建一个带有50 Hz信号的PWM对象
pwm=GPIO.PWM(11,50)

我们现在可以通过给出指定信号的DutyCycle的命令来启动pwm序列。在我们这样做之前,我们需要谈谈伺服器的工作原理。典型的伺服系统希望在控制线上看到50 Hz的频率。它移动的位置取决于信号的脉冲宽度。大多数伺服系统大致如此,但您需要为特定的伺服系统调整这些数字。通常,当伺服脉冲宽度为1毫秒时,伺服将进入全左位置,当脉冲宽度为1.5毫秒时,伺服将进入中间位置,当看到脉冲宽度时,伺服将进入正确的位置。脉冲宽度为2毫秒。但请注意,在Raspberry Pi上我们没有指定脉冲宽度,但我们指定了DutyCycle。所以,我们可以使用以下关系:

  

DutyCycle = PulseWidth / Period

请记住期间= 1 /频率,所以:

  

DutyCycle = PulseWidth /(1 / frequency)= PulseWidth * frequency

为我们提供完整左侧位置的PulseWidth 1毫秒。我们现在计算应用的DutyCycle以给我们所需的位置:

  

DutyCycle = PulseWidth * frequency = .001 * 50 = .05 = 5%

因此,对于50 Hz信号,如果我们将DutyCycle设置为5,那么我们应该看到伺服移动到完全左侧位置。同样,如果我们将DutyCycle设置为7.5,我们应该得到中间位置,如果我们将它设置为10,我们应该处于完全正确的位置。您可以通过在5到10之间线性缩放来获得所有中间位置。请注意,这些值会因品牌之间以及各个伺服系统之间的不同而不同,因此请使用伺服系统对其进行校准。我们现在准备应用命令来定位伺服。如果我们想要伺服在完全左侧位置,我们应该将DutyCycle设置为5%。我们使用以下命令执行此操作:

pwm.start(5)

这将启动PWM信号,并将其设置为5%。请记住,在我们之前的命令中创建pwm对象时,我们已经指定了50 Hz信号。现在,如果我们想改变位置,我们可以改变DutyCycle。例如,如果我们想要进入中间位置,我们需要一个7.5的DutyCycle,我们可以通过命令获得:

pwm.ChangeDutyCycle(7.5)

现在,如果我们想要完全正确的位置,我们需要一个10的占空比,我们可以通过命令获得:

pwm.ChangeDutyCycle(10)

请记住,实际控制伺服位置不是DutyCycle,而是PulseWidth。我们正在创建DutyCycles来为我们提供所需的PulseWidth。

现在,玩你的特定伺服,然后找到导致完全左和完全正确位置的特定DutyCycles。对于我的伺服,我发现完全左边是DutyCycle = 2,而右边是DutyCycle = 12。有了这些值,我就可以创建一个线性方程,它可以给出我想要的0到180之间的任何角度。这将使Raspberry Pi的行为更像是Arduino的简单直观操作。

要做线性方程,我需要两点。好吧,我知道对于0的理想角度,我应该应用2的DutyCycle。这将是点(0,2)。现在我也知道,对于所需的180度角,我应该应用12的DutyCycle。这将是点(180,12)。我们现在有两个点,可以计算线的方程。 (请记住,使用你的伺服......你的数字可能与我的略有不同,但如果你使用你的两点,下面的方法将有效)

记住一条线的斜率为:

  

m =(y2-y1)/(x2-x1)=(12-2)/ 180-0)= 10/180 = 1/18

我们现在可以使用点斜率公式得到线的方程。

  

的y Y1 =米(X-X1)

     

Y-2 = 1/18 *(X-0)

     

y = 1/18 * x + 2

输入我们的实际变量,我们得到

  

DutyCycle = 1/18 *(DesiredAngle)+ 2

现在改为那个位置,我们只需使用命令:

pwm.ChangeDutyCycle(DutyCycle)

请参阅: http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-28-controlling-a-servo-on-raspberry-pi-with-python/#sthash.LRmf7708.dpuf

答案 1 :(得分:0)

或者,您可以使用我的库,它隐藏了大部分 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/RaspberryMotorshttps://pypi.org/project/RaspberryMotors/#description