如何让控制树莓派让舵机转起来
前面讲了使用pycharm配置树莓派代码远程调试,目前手里面只有舵机,没有舵机支架,这篇文章就说一下如何让控制树莓派让舵机转起来。
首先说下舵机的工作原理,伺服电机通常被称为舵机,它是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只要控制信号持续不变,伺服机构就会保持轴的角度位置不改变。如果控制信号发生变化,输出轴的位置也会相应发生变化。
舵机的工作原理
舵机内部的控制电路,电位计(可变电阻器)和电机均被连接到电路板上,如内部结构图的右边部分。控制电路通过电位计可监控舵机的当前角度。
如果轴的位置与控制信号相符,那么电机就会关闭。如果控制电路发现这个角度不正确,它就会控制马达转动,直到它达到指定的角度。舵机角度根据制造商的不同而有所不同。比如,一个180度的舵机,它可以在0度至180度之间运动。由于限位装置被安装在主输出装置上,超出这个范围机械结构就不能再转动了。
舵机的输出功率与它所需要转动的距离成正比。如果输出轴需要转动很长的距离,马达就会全速运转,如果它只需要短距离转动,马达就会以较慢的速度运行,这叫做速度比例控制。
如何让舵机转到指定角度?
控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的:
0.5ms————-0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
看完原理后,试着看让舵机动起来,这里我们使用GPIOzero这个库,先安装下sudo pip3 install gpiozero,
安装完后先看看这个库的帮助说明, https://gpiozero.readthedocs.io/en/stable/recipes.html#servo,帮助给的示例代码如下:
from gpiozero import Servo
from time import sleep
servo = Servo(18)
while True:
servo.min()
sleep(2)
servo.mid()
sleep(2)
servo.max()
树莓派与舵机的具体的接线图如下:
舵机由2块3.7V的18650电池串联提供7.4的电压,树莓派的(0V)与舵机的0V共地,舵机的pwn线接树莓派的12pin(默认情况下,所有 GPIO 引脚编号都使用 Broadcom (BCM) 编号)。
然后运行上面的Python代码,这样舵机就动起来了。
问题出现:这段代码虽然可以使舵机转动,但是如果在调用time.sleep()函数时,舵机会不规则的抖动,最后查阅资料https://gpiozero.readthedocs.io/en/stable/api_output.html?highlight=pigpio,给出这样的解释:
To reduce servo jitter, use the pigpio pin driver rather than the default RPi.GPIO driver (pigpio uses DMA sampling for much more precise edge timing). See Changing the pin factory for further information.大意就是说"要减少伺服抖动,请使用pigpio引脚驱动器,而不是默认的RPi"。
使用pigpio库调整代码:
先安装pigpio库,sudo pip3 install pigpio ,然后我继续修改代码:
import pigpio
import time
pin = 18 #要控制的io口
pi = pigpio.pi()
pi.set_PWM_range(pin, 20000)#pin是要输出PWM的IO口, 20000设定PWM的调节范围,
#我们的舵机的控制信号是50Hz,就是20ms为一个周期。就是20000us。
#设为20000,就是最小调节为1us
pi.set_PWM_frequency(pin, 50) #设定PWM的频率,pin是要设定的IO口, 50 是频率
# pi.set_PWM_dutycycle(pin, 1500) #设定占空比
while True:
for i in range(500, 2500 1,5):
pi.set_PWM_dutycycle(pin, i) #设定pwm的脉宽, pin为引脚,i为脉宽
time.sleep(0.01)
time.sleep(10)
for i in range(2500, 500-1,-5):
pi.set_PWM_dutycycle(pin, i)
time.sleep(0.01)
time.sleep(10)
这样舵机会连续转动,而且在调用time.sleep()期间没有抖动现象。
至此,树莓派控制单舵机的教程完毕!
,