0

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

我将它们分别接线(信号线连接到 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)
...

伺服系统有时只转动一点,然后停在一侧。之后,您仍然可以听到伺服发出的噪音,就像它试图进一步运行一样。在它走到尽头之后,我无法使其工作或以任何方式使其转动。无论我做什么输入,它都会留在那里。如果我手动将它们转回起始位置,它将再次转到同一端。我无法弄清楚我做错了什么或者我需要改变我的做事方式。

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

提前致谢!

4

2 回答 2

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 =脉冲宽度/周期

请记住Period = 1/frequency,所以:

DutyCycle = PulseWidth/(1/频率) = PulseWidth * 频率

将给我们一个完整的左侧位置的PulseWidth 是 1 毫秒。我们现在计算应用的 DutyCycle 来给我们想要的位置:

占空比 = 脉冲宽度*频率=.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=m(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

于 2015-10-26T21:11:38.743 回答
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/RaspberryMotors或 https://pypi.org/project/RaspberryMotors/#description

于 2021-04-03T02:46:19.750 回答