Servomoteur SG90

如何使用Raspberry Pi控制伺服电机

更新 29 10月 2019 - 0 注释 - , , , ,

ⓘ 本文可能已使用自动工具部分或全部翻译。对于由此可能引起的任何错误,我们深表歉意。

本教程是专门介绍如何使用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上伺服电机的装配图
红线-> GPIO 2,黑线-> GPIO 6,黄线-> GPIO 12

注意,这里我们直接从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
摘自SG90文档。
发动机文档显示了SG90的周期和占空比的图表。

因此,我们将设置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信号,然后使用以下功能 startChangeDutyCycle

因此,您可以创建一个文件 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°停止。

您要做的就是根据自己的需要调整此脚本!

分享
通讯
作者:
Raspberry Pi FR
加入Raspberry Pi社区
一台售价35美元的计算机已经售出了1000万本
购买新的RASPBERRY PI 4
相关教程
使用Raspberry Pi和Octopi远程控制3D打印机。 Raspberry Pi Imager,基金会发布了一个官方工具,可以在Raspberry上安装操作系统! 在树莓派上安装安卓系统 从Windows和Mac读取Raspberry SD卡的Linux分区。 Raspberry Pi,如何从USB钥匙或外部硬盘驱动器启动。
没有评论
分享
订阅电子报
订阅新闻通讯。
你喜欢这篇文章吗 ?
订阅并保持最新状态!