舵机位置由 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