0


【伺服电机/舵机与Arduino使用教程】

伺服电机/舵机与Arduino使用教程

在这里插入图片描述

什么是伺服电机?

我们已经构建了一些使用电机来移动物体的项目,并且在此过程中我们研究了一些可以通过 Arduino 和 Raspberry Pi 项目控制的不同类型的电机。
我们已经使用过几次基本的直流电机。我们建立了几个基于直流电机的机器人项目,我们还广泛研究了H 桥控制器,该控制器通常用于通过微控制器或微型计算机调节直流电机的速度和方向。

我们使用过的另一种电机是步进电机。这种类型的电机的轴以不连续的步进方式驱动,可以实现非常精确的控制。它们广泛用于打印机和机器人设计。

我们在许多实验中使用了另一种类型的电机,但尚未(尚未)详细研究 - 伺服电机。
在这里插入图片描述伺服电机是一种低速、高扭矩电机,具有多种尺寸。与直流电机和步进电机不同,伺服电机通常不会旋转完整的 360 度。相反,它被限制在 180、270 或 90 度的范围内。

控制信号被发送到伺服系统以将轴定位在所需的角度。这种单一信号的安排使得伺服系统可以简单地用于无线电和遥控设计,以及微控制器。

如果您需要定位船上的方向舵或飞机上的电梯,伺服系统是完美的选择。它们在机器人工作中非常有用,可以定位相机、传感器或机器人附件。

伺服系统也可以用作速度计和转速计等模拟仪表。

伺服电机的类型

伺服电机本质上是一种电机,它具有用于指定电机轴位置的控制信号输入。

伺服系统用于工业以及业余爱好应用。工业伺服系统通常是带有数字控制输入的交流电机,成本高达数百或数千美元。

我们今天不会使用工业伺服电机!

爱好者伺服电机通常是直流电机,可以用数字或模拟信号控制。

数字伺服系统用于需要快速响应的应用,例如飞机上的电梯或直升机上的方向舵。我们也不会使用这些类型的电机,尽管使用 Arduino 驱动它们的连接和代码与我们将用于模拟伺服系统的相同。

我们将使用普通的普通模拟伺服电机,这是最受爱好者使用的类型。它们价格低廉且易于获得。安装硬件也很容易找到,因为这些伺服系统是一组标准尺寸。

然而,应该注意的是,虽然我们今天不会使用数字伺服电机,但它们实际上非常类似于模拟电机。它们使用与模拟伺服电机相同的 PWM 控制信号,并且可以使用相同的电路和代码进行控制。

模拟伺服电机

模拟伺服电机价格低廉,有多种尺寸和额定值可供选择。当您需要一个可以精确定位且不会耗尽资金的微型高扭矩电机时,这是完美的选择。

模拟伺服电机的“模拟”部分是控制信号。模拟伺服电机响应脉冲宽度调制或 PWM 信号来定位其电机轴。

PWM 是一种理想的控制介质。它可以由简单的定时器电路或微控制器生成。它可以通过单根电线发送,也可以通过无线电或光束传输。

Arduino 有许多支持 PWM 的输出引脚,使其成为控制伺服电机的理想选择。

伺服系统如何工作?

伺服电机是一种内置“伺服机构”的电机。

伺服机构使用传感器监测电机轴位置,并使用控制器控制电机。它收到一个信号,指示轴应该设置到的位置。然后它将电机移动到所需位置。

在模拟伺服电机中,我们将使用的控制信号是 PWM 信号,其脉冲宽度决定了电机轴的定位角度。电机本身是一个简单的直流电机,带有许多齿轮装置以降低速度并增加扭矩。

为了正常运行,伺服电机需要一个能够准确测量其轴位置的传感器。在一些工业和高端业余爱好伺服电机上,这是使用光学断续盘完成的,但在大多数标准业余爱好伺服电机中,传感器是一个电位器。这很有效,因为这些伺服系统通常移动 180 到 270 度,正好在电位计的范围内。然而,电位计的精度,尤其是在低成本伺服电机中,会影响伺服机构的整体精度。

连续旋转伺服电机

标准模拟伺服电机的旋转方向受到限制,通常为 180 或 270 度(180 度是目前最常见的)。其内部齿轮以小而便宜的包装提供高扭矩动力组。

小尺寸和大扭矩的结合也使伺服系统在小型玩具和机器人等小型设备的设计中用作标准直流电机的替代品具有吸引力。这促使一些人通过移除电位器来修改标准模拟伺服系统,使伺服系统能够旋转 360 度。

制造商得到了消息,现在提供“连续旋转伺服电机”,本质上是伺服机构脱离的伺服电机。

在连续旋转伺服电机中,轴旋转的速度和方向由传统模拟伺服电机中使用的相同 PWM 信号控制。

具有简单的单线控制信号和与标准伺服电机相同的物理封装使得连续旋转伺服电机对许多应用具有吸引力。

伺服电机控制信号

为了使用模拟伺服电机,您需要了解如何使用 PWM 控制它们的运行。这两个品种,常规和连续旋转,使用相同的定时信号,但对它们的响应略有不同。

让我们来看看大多数模拟伺服电机中使用的 PWM 信号。

常规伺服电机时序
在传统的模拟伺服电机中,周期为 20 毫秒的 PWM 信号用于控制电机。20 ms 的信号具有 50 Hz 的频率。

脉冲宽度在 1 到 2 毫秒之间变化,以控制电机轴位置。
在这里插入图片描述1.5ms 的脉冲宽度将使伺服轴停留在 90 度位置,即其行程的中心。
1ms 的脉冲宽度将使伺服轴停在 0 度位置。
2ms 的脉冲宽度将使伺服轴停留在 180 度位置。
在 1ms 和 2ms 之间改变脉冲宽度将使伺服轴移动 180 度。通过相应地调整脉冲宽度,您可以将其置于任何您想要的角度。

连续旋转伺服电机时序

在连续旋转的伺服电机中,相同的 PWM 信号会导致电机运行不同。

在这里插入图片描述
1.5ms 的脉冲宽度将导致伺服轴停止旋转。
1ms 的脉冲宽度将导致伺服轴逆时针全速旋转。
2ms 的脉冲宽度将使伺服轴顺时针全速旋转。
在 1ms 和 1.5ms 之间改变脉冲宽度将使电机逆时针旋转,较短的脉冲宽度会使电机旋转得更快。

在 1.5ms 和 2ms 之间改变脉冲宽度将导致电机顺时针旋转,脉冲越长,速度越快。

商用连续旋转伺服电机将有一个调节电位器,可用于在电机输入 1.5ms 脉冲宽度时将速度归零。

速度

伺服电机的速度指定为将伺服轴移动 60 度所需的时间。
在这里插入图片描述示例评级为 0.25 秒/60°,这意味着需要四分之一秒才能移动 60 度。

伺服速度更适用于传统伺服电机,连续旋转电机与任何直流电机一样额定为最大 RPM。

高速舵机用于模型飞机和直升机应用,以控制通常需要快速移动的升降舵和方向舵。其中许多使用数字控制和内部光学位置传感器而不是电位计,以实现更快速的运动。

对于业余爱好应用,例如控制摄像机的位置或超声波传感器速度通常不是关键因素。

力矩

扭矩是一个非常重要的参数,它从字面上说明了电机的强度。

扭矩定义为伺服可以施加到杠杆上的力的大小,或者换句话说,它可以承受多少重量。

它以盎司英寸或千克厘米为单位。您可以手动转换如下:

将千克厘米乘以 13.88 得到盎司英寸。
将盎司英寸除以 13.88 得到千克厘米。
另一种方法是使用在线变矩器。

要了解扭矩数据与现实世界条件的关系,请考虑以下示例:

在这里插入图片描述
伺服电机的额定重量为 5 kg-cm。这也与 69.4 盎司英寸 (5 x 13.88 = 69.4) 相同。

伺服电机在距离轴心 1 厘米的杠杆上最多可承受 5 千克的负载。如果您更喜欢英制尺寸,那么它可以在 1 英寸的距离处承受 69.4 盎司(约 4.3 磅)的负载。

距离增加一倍时,负载将减半,因此在距离轴 2 厘米处,杠杆可以支撑 2.5 千克。

一半的距离使可支撑的负载增加一倍,达到 10 公斤。

更大的伺服电机往往具有更大的扭矩能力,具有更大扭矩的电机往往更昂贵。它们的重量也更重,消耗的电流也更多。

工作电压

大多数业余爱好模拟舵机的额定电压为 4.8 至 6 伏,并在较高电压下实现其最大性能。

还提供更多的伺服系统,最大额定电压为 7.5 至 8.5 伏。由于模型飞机、船只、车辆和四轴飞行器的 7.4 伏锂聚合物电池的可用性,这些电池变得越来越流行。

伺服电机,尤其是高扭矩型号,会消耗相当多的电流,在为您的项目选择电源或电池时需要考虑到这一点。

伺服电机连接

模拟伺服电机通常有一个 3 针连接器。在一些更昂贵的电机上,电机电缆可以在电机底座上拆下并在需要时更换,其他电机的连接器永久连接到短的 3 线电缆上。

爱好者伺服电机上使用的颜色代码因制造商而异。然而,大多数制造商观察到相同的引出线,如下图所示:
在这里插入图片描述
与伺服电机的三个连接如下:
GND——电机和逻辑的公共地。
VCC——为伺服器供电的正电压。
PWM——PWM 控制信号的输入。
最常见的连接器是标准的杜邦连接器,间距为 0.1 英寸。这使得使用标准杜邦头条将伺服电机连接到您的项目变得容易。

您还可以将面包板电线直接插入伺服系统 3 针连接器,这样您就可以使用伺服电机制作原型。

连接到 Arduino

正如我们已经描述的,伺服电机需要 PWM 控制信号才能正常运行。您可以通过多种方式生成此信号——简单的定时器电路、专用控制芯片或使用具有 PWM 输出功能的微控制器。

微控制器自然有很多优势,能够更有效地控制舵机。Arduino 是一个很好的选择。

Arduino IDE 已经包含一个伺服库,因此向您的草图添加一个伺服器非常简单,您很快就会看到。

脉宽调制输出
所有 Arduino 板都有一些能够进行脉冲宽度调制或 PWM 的输出引脚。在 Arduino Uno 上有 6 个支持 PWM 的引脚。

请记住,要生成 PWM 信号,伺服库需要使用一些内部 Arduino 定时器,特别是定时器 1。这可能会干扰其他也需要相同定时器的库。解决此问题的一种方法是为 servo of= 或其他所需功能寻找替代库,这是绕过这些限制的常用方法。

一种更高级的方法是使用外部 PWM 控制器板并释放 Arduino 定时器。这将在本文中进一步讨论。

电源注意事项
大多数伺服电机都可以在 5 伏电压下正常运行,因此很想使用 Arduino 板上的 5 伏输出为伺服电机供电。

这真的不是一个好主意。

伺服系统会消耗大量电流,尤其是在负载下时。这可能比 Arduino 板上的稳压器承受的电流更大,尤其是在更便宜的克隆板上。虽然大多数 Arduino 板可以支持一个微型伺服器,但它仍然对调节器造成很大负担。

与所有其他电机一样,伺服电机会在电源线上产生电噪声。在为微控制器和其他逻辑设备供电的线路上产生这种噪声通常会导致系统错误。

为伺服电机使用单独的电源是一个更好的主意。5 伏 USB 3 电源可以很好地工作,6 伏灯笼电池或 4 节 AA 或 C 型电池也可以。

如果您真的必须直接从 Arduino 为伺服器供电,请将其限制为一个微型伺服器。在伺服器附近的电源线上放置一个 100uf 或更大的电容器可以帮助吸收这些电涌。

连接图

对于我们的第一个 Arduino 连接图,我们将使用与 Arduino IDE 一起打包的一个内置示例。无需编写代码或安装库!

连接硬件以用于我们的第一个演示非常简单。您需要一个 Arduino(任何类型)、一个伺服电机和一个伺服电机电源。
在这里插入图片描述舵机由自己的电源供电,接地连接也连接到 Arduino 地。然后将伺服的控制线连接到 Arduino 上的引脚 9。

Arduino Uno 上的引脚 9 是六个支持 PWM 的引脚之一,在大多数 Uno 板上,您会在 6 个启用 PWM 的 I/O 引脚旁边看到一个符号。

将 Arduino 连接到计算机并启动 Arduino IDE。

单击屏幕顶部的文件菜单。从那里选择示例子菜单。

将显示示例草图列表。它分为几个部分,向下滚动列表,直到到达“库中的示例”部分。

在“库中的示例”部分中,您将看到“Servo”。突出显示两个草图,Knob和Sweep。

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/#include<Servo.h>

Servo myservo;// create servo object to control a servo// twelve servo objects can be created on most boardsint pos =0;// variable to store the servo positionvoidsetup(){
  myservo.attach(9);// attaches the servo on pin 9 to the servo object}voidloop(){for(pos =0; pos <=180; pos +=1){// goes from 0 degrees to 180 degrees// in steps of 1 degree
    myservo.write(pos);// tell servo to go to position in variable 'pos'delay(15);// waits 15ms for the servo to reach the position}for(pos =180; pos >=0; pos -=1){// goes from 180 degrees to 0 degrees
    myservo.write(pos);// tell servo to go to position in variable 'pos'delay(15);// waits 15ms for the servo to reach the position}}

使用了Arduino IDE 中包含的Arduino 伺服库。顾名思义,它是一个用于使用 PWM 控制伺服电机的库。我们包含库并定义一个名为myservo的对象来表示我们的伺服电机。如果您有多个伺服电机,您可以为每个伺服电机定义一个对象。

然后我们定义一个名为“ pos ”的变量,它保存我们希望伺服电机轴移动到的位置(角度)。

在设置中,我们将伺服对象连接到 Arduino 引脚 9 上的伺服电机控制线上。

然后是循环,它由两个 for 循环组成。第一个循环递增pos变量的值,并使用它来控制使用myservo.write的伺服电机命令控制伺服电机,将轴从 0 度发送到 180 度。

第二个 for 循环是相同的,只是它将值从 180 递减到 0,使轴沿相反方向返回。

将草图加载到 Arduino 中并观察伺服电机轴,它应该从一端移动到另一端。

你刚刚用 Arduino 做了一个伺服动作!

旋钮控制舵机

让我们继续讨论 Arduino IDE 附带的另一个演示草图,即旋钮草图。在我们这样做之前,我们需要向我们的电路添加一个组件。

Arduino 旋钮草图 - 联播

正如接线图所示,您需要一个电位器,10k 以上的任何值都可以正常工作。将锅的一端连接到地,另一端连接到 Arduino +5 伏。雨刮器连接到模拟输入 A0。

电位器将用作定位伺服电机轴的控件,您可以使用它来拨动其 180 度行程的任何位置。它不仅是一个很好的演示,它也是一个有用的功能,可以在将伺服电机安装到您的项目之前设置它们的位置。

如果在电路中替换连续旋转伺服,则可以使用电位计来控制电机旋转的速度和方向。

修改实验以包含电位器后,打开 Arduino IDE 并返回示例草图。这次从Servo菜单中选择Sweep 。

#include<Servo.h>

Servo myservo;// create servo object to control a servoint potpin =0;// analog pin used to connect the potentiometerint val;// variable to read the value from the analog pinvoidsetup(){
  myservo.attach(9);// attaches the servo on pin 9 to the servo object}voidloop(){
  val =analogRead(potpin);// reads the value of the potentiometer (value between 0 and 1023)
  val =map(val,0,1023,0,180);// scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);// sets the servo position according to the scaled valuedelay(15);// waits for the servo to get there}

使用它包含的 Arduino 伺服库,然后创建一个myservo对象来表示伺服电机。

然后我们定义了几个整数。第一个,potpin,代表我们用于电位计雨刮器连接的模拟引脚。另一个val是读取该模拟输入时采用的值。

设置与旋钮草图相同,我们将伺服对象连接到引脚 9。

在循环中,我们首先从模拟引脚读取值,0 到 1023 之间的值将分配给val。接下来我们使用Arduino Map Function来改变val来表示 0 到 180 度之间的角度。

之后,我们使用写入命令将伺服定位到val的值,即电位器选择的角度。

在短暂的延迟让伺服电机跟上之后,我们重新做一遍。

将草图加载到您的 Arduino 并转动电位器。您应该看到伺服电机的轴随锅一起移动。

PCA9685伺服驱动板

正如我们刚刚看到的,直接从 Arduino 控制伺服电机非常简单。但是它有其局限性:

您受 Arduino 上 PWM 引脚数量的限制。如果伺服是需要其他 PWM 设备的设计的一部分,则可能会出现问题。
Arduino 伺服库可能会与其他 Arduino 库发生冲突,因为它们试图使用相同的计时器。这有时可以通过寻找替代库来解决。
您需要控制很多伺服电机,即使是 Arduino Mega 也有其局限性。
一个更好的解决方案是使用单独的伺服驱动板。这将卸载将 PWM 发送到伺服系统的任务,释放您的 Arduino 来做更好的事情。

我们将使用的电路板基于 PCA9685 芯片。这些板非常受欢迎,由几家公司生产。

PCA9685 板使用 I2C 与 Arduino 通信。这意味着只有两个时钟和数据连接到 Arduino。由于电路板的 I2C 地址可以使用一系列焊盘进行配置,因此您可以在同一电路上使用其中的许多焊盘。

每块板最多可控制16台伺服电机。您最多可以级联 62 个板来控制多达 992 个伺服电机!

如果你确实需要控制 992 个伺服电机,你可以使用 I2C 扩展板将多个 I2C 总线连接到你的 Arduino!

与电路板的连接非常简单。

PCA9685引脚图

电路板的每一侧都有一组相同的连接,这使得将多个模块连接成一排很容易。它们如下:

GND——接地连接。
OE——输出使能。您可以使用此引脚启用和禁用所有 16 个输出。通常将其悬空,这将导致启用所有输出。
SCL ——I2C 总线的时钟线。
SDA ——I2C 总线的数据线。
VCC – 逻辑电源,+5 伏。
V+ ——伺服电机的功率。为此,电路板顶部还有另一个连接器,该连接器是首选,因为它具有反极性保护,而 V+ 则没有。V+ 引脚实际上用于级联多个 PCA9685 模块,并通过单个电源为所有伺服系统供电。
顶部还有一个用于伺服电源的 2 针螺丝连接器。如上所述,它具有反极性保护。

电路板底部有 16 组 3 针公头连接器。每个都用于伺服电机。

在电路板的右上角有六个焊盘。这些用于设置开发板的 I2C 地址。如果您使用多个板,则需要跳接其中一个或多个以将其内部 I2C 地址更改为唯一。

没有任何跳线短路的 PCA9685 模块的基地址是 0x40。

如果将 A0 焊盘短路,地址将变为 0x41。

改为桥接 A1,它现在的地址为 0x42。桥接 A0 和 A1,地址将为 0x43。

多伺服系统

为了演示使用 PCA9685 PWM 模块控制多个伺服电机,我决定拿出我之前构建的 MeArm。它有四个伺服电机。

我将所有内容连接如下:

PCA9685 Arduino 联播

你会注意到我还添加了四个电位器,和以前一样,它们可以是 10k 或以上的任何值,并将用于调节四个伺服电机中每一个的运行。

PCA9685 模块连接到 Arduino 上的 SCL 和 SDA 连接。如果您的 Arduino 没有用于这些 I2C 连接的引脚,则将模拟引脚 A4 用于 SDA,将引脚 A5 用于 SCL。

请注意,即使您有单独的 SCL 和 SDA 引脚,您也无法在使用 I2C 时将 A4 和 A5 用作模拟输入。

四个电位器一侧接地,另一侧接地 5 伏。他们的雨刮器连接到模拟输入 A0 到 A3。

Arduino 电源还用于为 PCA9685 模块上的 VCC 电源供电。四个舵机的独立电源连接到模块上的螺丝连接器。

我将我的伺服电机连接到输出 0、4、8 和 12。您实际上可以使用任何四个连接,只需记下它们,以便您可以修改代码以匹配您的选择。

因为这是我连接到 Arduino 的唯一 PCA9685 模块,所以我没有短路任何地址焊盘。

现在让我们看看我用来完成这一切的代码:

// Include Wire Library for I2C Communications#include<Wire.h>// Include Adafruit PWM Library#include<Adafruit_PWMServoDriver.h>#defineMIN_PULSE_WIDTH650#defineMAX_PULSE_WIDTH2350#defineFREQUENCY50

Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver();// Define Potentiometer Inputsint controlA = A0;int controlB = A1;int controlC = A2;int controlD = A3;// Define Motor Outputs on PCA9685 boardint motorA =0;int motorB =4;int motorC =8;int motorD =12;voidsetup(){
  pwm.begin();
  pwm.setPWMFreq(FREQUENCY);}voidmoveMotor(int controlIn,int motorOut){int pulse_wide, pulse_width, potVal;// Read values from potentiometer
  potVal =analogRead(controlIn);// Convert to pulse width
  pulse_wide =map(potVal,0,1023, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
  pulse_width =int(float(pulse_wide)/1000000* FREQUENCY *4096);//Control Motor
  pwm.setPWM(motorOut,0, pulse_width);}voidloop(){//Control Motor AmoveMotor(controlA, motorA);//Control Motor BmoveMotor(controlB, motorB);//Control Motor CmoveMotor(controlC, motorC);//Control Motor DmoveMotor(controlD, motorD);}

使用 Adafruit PWM 伺服驱动程序库,您需要安装该库才能完成这项工作。它可以从 Arduino IDE 中的库管理器安装。

打开 Arduino IDE。
从顶部的菜单中选择草图。
选择包含库。将出现一个子菜单。
从子菜单中选择管理库… 。
库管理器将打开。
在库管理器中搜索“Adafruit PWM”
Adafruit PWM 伺服库驱动程序应该是第一个结果。
单击“更多信息”链接以显示“安装”按钮。使用此按钮将库安装到您的 IDE 中。
关闭库管理器。
该库现已安装,可以在您的 IDE 中使用。
我们通过包含 Wire 库来开始草图。它内置于您的 Arduino IDE 中,用于控制 I2C 通信。

接下来,我们包括刚刚安装的 Adafruit PWM 伺服库。

我们现在将定义一些常量。

前两个常量定义了我们将发送给伺服系统的 PWM 信号的最小和最大脉冲宽度。你记得这个脉冲宽度将决定伺服轴的位置。

我们定义的第三个常量是 PWM 频率,对于模拟伺服电机来说是 50 Hz。如果您使用的是数字伺服电机,您可能需要增加它,因为它们通常可以使用高达 200 Hz 的频率。

接下来,我们使用 Adafruit PWM 库创建一个名为pwm的对象。如果您使用默认 0x40 以外的地址,则需要在此处定义它。

现在我们定义一些变量。第一个是电位器输入引脚,A0 到 A3。之后是 PCA9685 板上的电机输出,我在连接电机时使用了 0、4、8 和 12。如果您为电机使用不同的连接器,请更改这些值。

现在进入设置。我们初始化我们之前创建的pwm对象,然后将 PWM 振荡器的频率设置为我们定义的频率,在我们的例子中为 50 Hz。

现在我们创建一个函数来驱动电机响应电位计的位置。然后我们可以为每个电机调用这个函数。

我们的函数称为moveMotor。它有两个输入,代表电位器输入的controlIn和代表PCA9685上的电机连接的 motorOut。

该函数读取电位器值并将其转换为脉冲宽度。然后将此脉冲宽度与 Adafruit PWM 伺服库的setPWM方法一起使用,以将脉冲发送到motorOut变量指定的电机。

在循环中,我们只调用了四次 moveMotor函数,每个电位器-伺服电机组合调用一次。

结果是 MeArm 中的四个伺服电机将响应电位器。在演示中,我使用了滑动电位器,这使得精确定位 MeArm 变得容易得多(我使用“精确”一词带有很多诗意!)。

结论

伺服电机是多功能的小型设备,在爱好者项目中有无数用途,知道如何控制它们是一项基本的 Arduino 编码和接线技能。

希望本文及其相关视频对使用伺服电机有所帮助,可以直接连接到 Arduino 或通过 I2C 使用 PCA9685 PWM 控制器。

因此,为自己准备一堆伺服电机,今天就开始让事情动起来吧!


本文转载自: https://blog.csdn.net/m0_46509684/article/details/128641299
版权归原作者 「已注销」 所有, 如有侵权,请联系我们删除。

“【伺服电机/舵机与Arduino使用教程】”的评论:

还没有评论