Raspberry Pi和GpioZero的基本伺服使用

4

伺服电动机是使用一组齿轮产生旋转运动的电动机。无线电控制的车辆和动画项目经常使用它们来产生运动。它们的大小和功能各不相同,但小型伺服器价格便宜,是将运动引入Raspberry Pi项目的好方法。

这篇文章将解释如何以最少的硬件以最简单的方式将小型伺服器连接到Pi。

部分

塔式9g伺服你会需要 :

  • 树莓派
  • 具有最新Raspbian操作系统的SD卡
  • 小型伺服器(TowerPro 9g或同等产品)

伺服颜色代码

伺服通常有三根电线。两种用于电源,一种用于数据信号。这些线的颜色因制造商而异,但通常遵循以下方案之一:

伺服颜色代码表

我的遵循红色/橙色/棕色方案。

伺服和PWM

有大量的资源可以解释伺服器的工作方式。重要的一点是它们采用PWM(脉冲宽度调制)数据信号。这是一系列高-低脉冲,其中每个脉冲之间的时序决定了旋转位置。

伺服PWM示例波形

在此基本示例中,将使用软件生成PWM信号。这不是’它与硬件产生的PWM信号一样准确,但足以满足基本要求。

硬件设定

最简单的配置是将伺服器直接连接到Pi。这适用于小型伺服系统’期望执行任何艰巨的任务。电源将通过Pi汲取’5V引脚,并受某些限制。如果您的伺服器消耗的电流过多,则可能会影响USB设备或Pi本身的操作。

可以使用任何GPIO引脚

伺服线颜色Raspberry Pi 通用输入输出评论
电源(+)针脚2(5V)
信号/数据白色/黄色/橙色/蓝色引脚11(GPIO17)
地面黑褐色Pin 9可以使用任何接地针

任何Pi’可以使用接地针。请参考 Raspberry Pi 通用输入输出头映像 找到额外的接地引脚。

Raspberry Pi基本伺服示例

在此示例中,我将引脚9(黑色)用于接地。电源线(红色)连接到引脚2。信号线(橙色)可以连接到任何GPIO引脚,但我更喜欢使用引脚11(GPIO17),因为它位于引脚9旁边,并且使接线更简单。如果您使用其他GPIO,请确保使用正确的编号更新示例脚本。

示例Python伺服脚本#1

连接后,最简单的伺服驱动方法是在Python脚本中使用Gpiozero库。默认情况下,它安装在最新的Raspbian映像中。

您可以使用以下Python脚本:

from gpiozero import Servo
from time import sleep

myGPIO=17

servo = Servo(myGPIO)

while True:
    servo.mid()
    print("mid")
    sleep(0.5)
    servo.min()
    print("min")
    sleep(1)
    servo.mid()
    print("mid")
    sleep(0.5)
    servo.max()
    print("max")
    sleep(1)

将上面的代码复制到一个名为的新文本文件中“servo1.py”或使用以下命令从我的Bitbucket存储库直接下载到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo1.py

我建议您使用wget而不是复制和粘贴,这样您就不必’不会丢失正确的缩进。

要运行脚本,请使用以下命令:

蟒蛇 伺服1.py

伺服器现在应该在其最小,中间和最大位置之间移动,并且之间有很小的延迟。

示例Python伺服脚本#2– Calibrating Range

首先script makes use of the Gpiozero defaults. It assumes the servo uses a signal frame width of 20ms. The pulse width for the minimum 和 maximum rotation is assumed to be 1ms 和 2ms. This information should be available in the servo specification 和 I would avoid sellers that don’t provide this data.

我发现使用默认设置时,我的伺服器仅移动了+ 45 / -45度。我更改了脉冲宽度参数,以便在任一方向上完整旋转90度。以下脚本演示了这一点:

from gpiozero import Servo
from time import sleep

myGPIO=17

myCorrection=0.45
maxPW=(2.0+myCorrection)/1000
minPW=(1.0-myCorrection)/1000

servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)

while True:
    servo.mid()
    print("mid")
    sleep(0.5)
    servo.min()
    print("min")
    sleep(1)
    servo.mid()
    print("mid")
    sleep(0.5)
    servo.max()
    print("max")
    sleep(1)

将上面的代码复制到一个名为的新文本文件中“servo2.py”或使用以下命令从我的Bitbucket存储库直接下载到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo2.py

我建议您使用wget而不是复制和粘贴,这样您就不必’不会丢失正确的缩进。

要运行脚本,请使用以下命令:

蟒蛇 伺服2.py

伺服器现在应该在其最小,中间和最大位置之间移动,并且之间有很小的延迟。

在本例中,最小脉冲宽度从默认值1减小了0.45到0.55ms。最大脉冲宽度从默认值2增加0.45毫秒到2.45毫秒。这使我的伺服器在两个方向上都旋转了90度。价值“0.55” 和 “2.45”除以1000,将其转换为毫秒。

没有什么神奇的“0.45”。只是最适合我的伺服系统的校正。

为了计算这些数字,我从开始:

myCorrection=0
maxPW=(2.0+myCorrection)/1000
minPW=(1.0-myCorrection)/1000

并以0.05为增量增加/减少校正数。这使我能够在伺服系统听起来不满意之前找到最大的改变。

“myCorrection”必须为0到1之间的数字,但不太可能永远需要为1!

伺服脚本示例3– Precise Positioning

一旦您’ve确定了最小和最大脉冲宽度值,您可以使用“value”可以将伺服臂定位在其极限之间的任何位置。

设置“value”参数设置为-1和+1之间的数字可在最小和最大位置之间移动手臂。示例包括:

# Minimum position
servo.value=-1

# Mid-point
servo.value=0

# Maximum position
servo.value=1

# Position between mid-point 和 maximum
servo.value=0.5

以下脚本生成了一系列“value”在最大和最小位置之间扫描伺服的数字:

from gpiozero import Servo
from time import sleep

myGPIO=17

myCorrection=0
maxPW=(2.0+myCorrection)/1000
minPW=(1.0-myCorrection)/1000

servo = Servo(myGPIO,min_pulse_width=minPW,max_pulse_width=maxPW)

while True:

  print("Set 值 range -1.0 to +1.0")
  for 值 in range(0,21):
    值2=(float(value)-10)/10
    servo.value=value2
    print(value2)
    sleep(0.5)

  print("Set 值 range +1.0 to -1.0")
  for 值 in range(20,-1,-1):
    值2=(float(value)-10)/10
    servo.value=value2
    print(value2)
    sleep(0.5)

将上面的代码复制到一个名为的新文本文件中“servo3.py”或使用以下命令从我的Bitbucket存储库直接下载到您的Pi:

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/servo3.py

我建议您使用wget而不是复制和粘贴,这样您就不必’不会丢失正确的缩进。

要运行脚本,请使用以下命令:

蟒蛇 伺服3.py

伺服器现在应该在其最小,中间和最大位置之间移动,并且之间有很小的延迟。

首先“For”循环生成一个介于0和20之间的整数集。该值减去10得出-10到10的范围。然后将该值最后除以10得出-1到+1的范围。原始值集包含20个整数,但序列中仍有20个步骤。要将步数增加到40,您可以将40替换为20,然后减去20而不是10。

第二“For”循环执行相同的操作,但是生成从+1返回到-1的序列。

下一步

一旦这些脚本起作用,您就可以对其进行修改,以使手臂自由移动。例如,您可以随机生成一个介于-1和+1之间的数字,以将手臂定位在其最大和最小限制之间。还是根据传感器或操纵杆的输入来移动它?只要您可以将传感器的值范围转换为-1到+1的范围,就可以使用伺服器指示结果。

看看 Gpiozero的官方文档 有关其他技术信息。

这是使用以下三个示例脚本显示伺服运动的简短视频:


在哪里购买小型伺服

这些伺服器可通过许多渠道获得,包括 [亚马逊][eBay].

您可以在 维基百科页面.

分享。

4条留言

  1. 我想知道有多少伺服’s可以通过这种方式连接到单个覆盆子pi w,并且如何增加专用的外部电源来驱动一些更大的伺服器?

    • It’很难预测您可以添加多少个伺服器,因为它取决于伺服器,以及在停止时会消耗多少电流。外部电源相当简单,我’我打算再写一篇博客文章。

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.