pyboard上有4个PWM专用管脚,可用于连接舵机。舵机有三根线,分别是:地线、电源线和PWM信号线。在pyboard上,可以将它们连接在右下角,信号引脚位于最右侧。引脚 X1、X2、X3 和 X4 是 4 个专用PWM信号引脚。
图中的公母双头适配器用于将舵机连接到电路板上的针座。舵机上的接地线通常是颜色最深的那根,黑色或深棕色,电源线一般是红色,信号线通常是黄色。
舵机的电源引脚(标为 VIN)直接连接到pyboard的输入电源。通过USB供电时,VIN 通过一个二极管由 5V USB电源线供电。连接到USB时,pyboard可为4个小舵机供电。
如果用电池为pyboard和舵机供电,对于微型舵机,要确保电池电压不大于6V,这是大多数微型数舵机所能承受的最大电压(有些舵机最高只能承受4.8V,因此要注意检查使用的是哪种类型的电池)。
创建Servo对象
在位置1(即引脚为X1的那个)上插入一个舵机,使用下面的方法可以创建一个舵机对象:
>>> servo1 = pyb.Servo(1)
要改变舵机的角度,可以使用angle()方法:
>>> servo1.angle(45)
>>> servo1.angle(-60)
角度的单位为度,范围约为-90至+90,具体情况取决于具体的舵机,调用不带参数的角度将返回当前角度:
>>> servo1.angle()
-60
注意,对于某些角度,由于设置脉冲宽度时的舍入误差,返回的角度与设置的角度可能不完全相同。
可以向angle方法传递第二个参数,指定达到所需角度所需的时间(毫秒)。例如,若要用1秒(1000 毫秒)的时间从当前位置转到50度,可以使用:
>>> servo1.angle(50, 1000)
该命令会直接返回,但舵机将继续移动到指定的角度,并在到达该角度时停止,所以这个功能可以用于舵机速度的控制,或同步2个或多个舵机。
下面的例子可以让两个舵机一起转动,并在2秒内达到指定角度:
>>> servo1.angle(-45, 2000); servo2.angle(60, 2000)
注意:上述两个表达式之间使用分号是为了在 REPL 提示下按回车键时,它们能顺序执行。在实际的代码中不需要这样做,可以分两行写。
连续转动舵机
以上使用的是都是标准的舵机,可以控制它们移动到一个特定的角度并保持在该角度。这些舵机可用于创建机器人的关节,或类似云台的机构。舵机内部有一个可变电阻(电位计),用于测量当前角度,并根据距离所需角度的远近按比例向电机供电,所需角度由舵机信号线上的脉冲宽度设定,1500微秒的脉冲宽度对应中心位置(0 度)。脉冲发送频率为50赫兹,即每秒50个脉冲。
市面上也可以买到顺时针或逆时针连续转动的舵机,旋转方向和速度由信号线上的脉冲宽度决定,脉冲宽度为1500微秒时,电机停止转动,脉冲宽度小于或大于此值,则表示以给定速度单向或双向旋转。
在pyboard上,连续旋转电机的舵机对象与上面的相同,使用角度可以设置转动的速度,但为了便于理解,还有一个speed方法可以设置速度:
>>> servo1.speed(30)
speed具有与angle相同的功能:可以获取速度、设置速度,并设置达到最终速度的时间。
>>> servo1.speed()
30
>>> servo1.speed(-20)
>>> servo1.speed(0, 2000)
上面的最后一条命令将使舵机停止,但需要2秒才能完成,因为指定了舵机的速度。
舵机速度的最大值是100(或-100),但实际上可以比这更快一些,这取决于特定的电机。
角度法和速度法之间的唯一区别(除了名称之外)在于将输入数字(角度或速度)转换为脉冲宽度的方式。
校准
从角度或速度到脉冲宽度的转换由舵机对象使用其校准值完成。要获取当前校准值,可使用
>>> servo1.calibration()
(640, 2420, 1500, 2470, 2200)
返回一个元组,有5个数字,他们分别代表:
- 最小脉冲宽度;舵机可接受的最小脉冲宽度。
- 最大脉冲宽度;舵机可接受的最大脉冲宽度。
- 中心脉冲宽度;使舵机处于0度或0速度的脉冲宽度。
- 对应90度的脉冲宽度。这设定了角度到脉冲宽度的转换方法。
- 速度100对应的脉冲宽度。设置速度的速度与脉冲宽度之间的转换。
可以通过以下方式重新校准舵机(更改默认值):
>>> servo1.calibration(700, 2400, 1510, 2500, 2000)
当然,也可以根据具体的舵机修改上述数值。