如何使用Raspberry Pi控制伺服电机
注释ⓘ Cet article peut avoir été partiellement ou totalement traduit à l'aide d'outils automatiques. Nous nous excusons des erreurs que cela pourrait engendrer.
本教程是专门介绍如何使用Raspberry Pi发现电子产品的文件的第三部分。如果您还没有阅读它,我建议您参考第一个教程以Raspberry Pi控制LED,以及第二个教程以Raspberry Pi使用RFID阅读器。
当开始家庭自动化时,经典的需求是通过程序来控制现实中的身体运动。
在本教程中,我们将看到如何使用Raspberry Pi控制伺服电机。
控制伺服电机的附件
为了能够遵循本教程并控制伺服电机,我们需要以下材料:
电机,伺服电机和步进电机有什么区别?
在开始将伺服电机连接到Raspberry Pi之前,让我们看一下通常用于电子产品中的不同类型的电机。
在不赘述的情况下,我们可以将电子学中使用的电动机大致分为三类:
- 电动机:只要通电,电动机就会运转。当您想要执行不要求极高精确度的连续运动时,它非常适合。
- 步进电机:它以一种小的连续跳跃的方式转动。就是说,您将能够要求他做50跳或112跳,这将对应于某个动作(例如四分之一转)。当您想进行高精度的连续运动时(例如3D打印机中使用的运动),它非常适合。
- 伺服电机:根据PWM(Pulse Width Modulation,脉冲宽度调制)类型的信号定义一定角度的旋转。小型电机通常受到限制,不能超过一圈。因此,它们被用于高精度的短行程。
关于这些不同的引擎,还有很多其他的事情要说,但是我们将进入机械问题,这远远超出了本教程的范围。
在我们的案例中,我们将使用伺服电机,因为它是从Raspberry Pi进行控制的最简单的精密电机。
将伺服电机连接到Raspberry Pi
要使用我们的伺服电机,要做的第一件事是将其插入Raspberry Pi。
执行器有3个电连接器。颜色可能会因制造商而异,但通常您会发现类似以下内容:
- 红色电线,用作电源。
- 黑色或棕色电线,用作GDN。
- 另一根导线,用于传输控制电机位置的PWM信号。
因此,我们将这些不同的电缆连接到Raspberry Pi,红色的线连接到5伏的GPIO端口,黑色的线连接到GND端口。
另一方面,对于PWM端口,我们必须将其连接到Raspberry Pi的第12 GPIO引脚。实际上,默认情况下,它是唯一支持PWM信号的GPIO引脚。
所以你应该有这样的蒙太奇。
注意,这里我们直接从Raspberry Pi为伺服电机供电。之所以可行,是因为我们使用的伺服电机非常小,但是在较大的型号上,我们将需要专用的电源。
在命令行中控制伺服电机
现在,我们已经连接了伺服电机,我们将能够直接从Raspberry Pi命令行驱动它。
为此,我们将根据处理器编号在端口12(即GPIO 18)上激活PWM模式开始。
gpio -o mode 18 pwm
然后,我们将激活PWM的标记/空格模式,该模式允许产生一个更适合我们使用的信号。
gpio pwm-ms
最后,我们将配置一个周期的持续时间,使用的频率等。
伺服电机设置为以50 Hz的频率运行,即20 ms。Raspberry Pi信号在另一个频率19.2 MHz下工作。使用这两个数字,我们可以计算出一个周期和一个范围(感谢该公式的ramboise314.fr):
50 = 19.2 * 10^6 / 192 / 2000
因此,我们将设置Raspberry Pi使用以下值:
gpio pwmc 192 gpio pwmr 2000
最后,我们将能够使引擎运转!请注意,我们不会将角度传递给伺服电机,而是将一个数字转换为角度。我们的伺服电机从0°到180°。经过一些测试,似乎0°对应于230,90°对应于150,180°对应于70。
因此,要以90°的角度发送电动机,我们将使用以下命令:
gpio -g pwm 18 150
然后,我们将150替换为230以将其设置为0°,将70替换为180°或根据需要设置两者之间的任何值。
请注意,这些小型电机以精确的方式支撑180°的角度,但是它们的余量很小,如果设置的值足够低,则可能导致它们旋转190°或200°,甚至完全旋转。它特定于每种发动机型号。
用Python驱动伺服电机
与本系列以前的教程一样,目标是使用Python而不是直接从命令行控制我们的引擎。我认为您现在已经掌握了Python的基础知识,如果不去阅读以前的教程,可以在本文开头找到链接。
为了从Python脚本控制引擎,我们将再次使用lib Rpi.GPIO
。
在Python和Pi上,电机角度以周期的百分比计算。该百分比称为“占空比”。
0.5ms信号对应于0°,而2.5ms信号对应于180°。知道我们的周期是50 Hz,即20ms,这使我们能够像这样计算0°和180°的占空比:
x = 0.5 / 20 y = 2.5 / 20
然后我们发现对应于0°的占空比为0.025或2.5%,对应于180°的占空比为0.125或12.5%。
但是,小问题是,如果该值在理论上是好的,那么实际上它会触发电动机在0°时完全旋转。因此,我建议您将4%用于0°。180的价值12.5%是好的。
要控制电机,我们只需将引脚12设置为PWM信号,然后使用以下功能 start
和 ChangeDutyCycle
。
因此,您可以创建一个文件 servo.py
并在其中放置以下代码:
#!/usr/bin/env python3
#-- coding: utf-8 --
import RPi.GPIO as GPIO
import time
#Set function to calculate percent from angle
def angle_to_percent (angle) :
if angle > 180 or angle < 0 :
return False
start = 4
end = 12.5
ratio = (end - start)/180 #Calcul ratio from angle to percent
angle_as_percent = angle * ratio
return start + angle_as_percent
GPIO.setmode(GPIO.BOARD) #Use Board numerotation mode
GPIO.setwarnings(False) #Disable warnings
#Use pin 12 for PWM signal
pwm_gpio = 12
frequence = 50
GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)
#Init at 0°
pwm.start(angle_to_percent(0))
time.sleep(1)
#Go at 90°
pwm.ChangeDutyCycle(angle_to_percent(90))
time.sleep(1)
#Finish at 180°
pwm.ChangeDutyCycle(angle_to_percent(180))
time.sleep(1)
#Close GPIO & cleanup
pwm.stop()
GPIO.cleanup()
您所要做的就是通过以下方式运行脚本:
python3 ./servo.py
然后,您应该看到引擎从0°开始,然后移至90°,最后在180°停止。
您要做的就是根据自己的需要调整此脚本!