在本教程中,我们将使用树莓派控制伺服电机。在进入伺服之前,让我们谈谈PWM,因为控制伺服电机的概念来自它。
PWM(脉宽调制):
我们之前多次讨论过PWM:使用ATmega32的脉宽调制,使用Arduino Uno的PWM,使用555定时器IC的PWM和带有Arduino
Due的PWM。 PWM 代表“脉宽调制”。PWM是一种用于从稳定电源获得可变电压的方法。为了更好地理解PWM,请考虑以下电路,
在上图中,如果开关在一段时间内连续关闭,则 LED 将在这段时间内连续“亮起”。如果开关关闭半秒并打开下半秒,则 LED
仅在前半秒内亮起。现在,LED在总时间内的开启比例称为占空比,可以按如下方式计算:
占空比 =开启时间/(开启时间 + 关闭时间)
占空比 = (0.5/ (0.5+0.5)) = 50%
因此,平均输出电压将是电池电压的50%。
当我们将ON和OFF速度提高到一定水平时,我们将看到LED变暗而不是打开和关闭。这是因为我们的眼睛无法清楚地捕捉高于25Hz的频率。考虑 100ms
周期,LED 熄灭 30 毫秒,亮起 70 毫秒。我们将在输出端有 70% 的稳定电压,因此 LED 将以 70% 的强度连续发光。
占空比从 0 到 100。“0”表示完全关闭,“100”表示完全打开。该占空比对于伺服电机非常重要。伺服电机的位置由该占空比决定。
伺服电机和脉宽调制器:
伺服电机是直流电机、位置控制系统和齿轮的组合。伺服系统在现代世界中有许多应用,因此,它们有不同的形状和尺寸。我们将在本教程中使用SG90伺服电机,它是流行且最便宜的一种。SG90是180度伺服。因此,使用此伺服器,我们可以将轴定位为0-180度。
伺服电机主要有三根线,一根用于正电压,另一根用于接地,最后一根用于位置设置。红线连接到电源,棕色线连接到地,黄线(或白线)连接到信号。
在伺服中,我们有一个控制系统,它从信号引脚获取PWM信号。它解码信号并从中获取占空比。之后,它将比率与预定义的位置值进行比较。如果值存在差异,它会相应地调整伺服器的位置。因此,伺服电机的轴位置基于信号引脚处PWM信号的占空比。
PWM(脉宽调制)信号的频率可能因伺服电机的类型而异。对于SG90,PWM信号的频率为50Hz。要了解伺服机的操作频率,请查看该特定型号的数据表。因此,一旦选择了频率,这里的另一个重要因素是PWM信号的占空比。
下表显示了该特定占空比的伺服位置。您可以通过相应地选择值来获得两者之间的任何角度。因此,对于 45º 的伺服,占空比应为“5”或 5%。
所需组件:
在这里,我们使用Raspberry Pi 2 Model B和Raspbian Jessie
OS。所有基本的硬件和软件要求之前都讨论过,你可以在树莓派简介中查找它,除此之外我们需要:
连接销
1000uF电容
SG90伺服电机
面包板
电路图:
A1000μF必须连接在+5V电源轨上,否则PI可能会在控制舵机时随机关断。
工作和编程说明:
按照电路图连接所有内容后,我们可以打开 PI 以 在 PYHTON 中编写程序 。
我们将讨论我们将在 PYHTON 程序中使用的一些命令,
我们将从库中导入 GPIO 文件,下面的函数使我们能够对 PI 的 GPIO 引脚进行编程。我们还将“GPIO”重命名为“IO”,因此在程序中,每当我们想引用GPIO引脚时,我们都会使用“IO”一词。
import RPi.GPIO as IO
有时,当我们尝试使用的GPIO引脚可能正在执行其他一些功能时。在这种情况下,我们将在执行程序时收到警告。以下命令告诉 PI 忽略警告并继续程序。
IO.setwarnings(False)
我们可以参考 PIO 的 GPIO 引脚,可以通过板上的引脚编号或功能编号来引用。就像板上的“PIN 29”是“GPIO5”。所以我们在这里告诉要么我们要用“29”或“5”来表示这里的引脚。
IO.setmode (IO.BCM)
我们将 PIN39 或 GPIO19 设置为输出引脚。我们将从该引脚获得PWM输出。
IO.setup(19,IO.OUT)
设置输出引脚后,我们需要将引脚设置为PWM输出引脚,
p = IO.PWM(output channel , frequency of PWM signal)
上述命令用于设置频道,也用于设置频道的频率”。这里的“p”是一个变量,它可以是任何东西。我们使用GPIO19作为PWM“输出通道”。PWM信号的频率“我们将选择50,因为SG90的工作频率为50Hz。
以下命令用于启动PWM信号生成。“ 占空比 ”用于设置前面所述的“开启”比率,
p.start(DUTYCYCLE)
下面的命令用作永久循环,使用此命令,此循环中的语句将连续执行。
While 1:
在这里,使用树莓派控制伺服的程序在GPIO19上提供PWM信号。PWM信号的占空比在三个值之间变化三秒钟。因此,伺服系统每秒都会旋转到由占空比确定的位置。伺服在三秒钟内连续旋转到 0º、90º 和 180º。
import RPi.GPIO as IO # calling for header file for GPIO’s of PI
import time # calling for time to provide delays in program
IO.setwarnings(False) # do not show any warnings
IO.setmode (IO.BCM) # programming the GPIO by BCM pin numbers. (like PIN29 as‘GPIO5’)
IO.setup(19,IO.OUT) # initialize GPIO19 as an output
p = IO.PWM(19,50) # GPIO19 as PWM output, with 50Hz frequency
p.start(7.5) # generate PWM signal with 7.5% duty cycle
while 1: # execute loop forever
p.ChangeDutyCycle(7.5) # change duty cycle for getting the servo position to 90º
time.sleep(1) # sleep for 1 second
p.ChangeDutyCycle(12.5) # change duty cycle for getting the servo position to 180º
time.sleep(1) # sleep for 1 second
p.ChangeDutyCycle(2.5) # change duty cycle for getting the servo position to 0º
time.sleep(1) # sleep for 1 second