龙空技术网

用Arduino控制伺服电机-原理,规格,分类,库函数,驱动板,范例

DIY百事 575

前言:

现在兄弟们对“c控制伺服电机”大约比较珍视,姐妹们都想要学习一些“c控制伺服电机”的相关内容。那么小编也在网上汇集了一些关于“c控制伺服电机””的相关文章,希望咱们能喜欢,小伙伴们一起来了解一下吧!

如果您需要控制船上或飞机上的舵机以控制方向,则伺服系统是完美的选择。它们在机器人工作中非常有用,可以定位相机、传感器或机器人的运动部件。伺服也可以用作模拟仪表,如速度表和转速表。

本文翻译自科普大神donebotWorkshop.com

译者:DIY百事

目录

1 什么是伺服电机?

1.1伺服电机的种类

1.2模拟伺服电机

2 伺服是如何工作的?

2.1连续旋转伺服电机

3 伺服电机控制信号

3.1常规伺服电机时序

3.2连续旋转伺服电机时序

4 伺服电机规格

4.1电机尺寸

4.2齿轮材料

4.3速度

4.4扭矩

4.5工作电压

4.6臂(连杆)和配件

5 测试伺服电机

5.1伺服测试仪

5.2伺服电机连接

6 连接到 Arduino

6.1 PWM 输出

6.2电源注意事项

7 旋转扫描的代码

8 可调节角度的旋转扫描的代码

9 PCA9685 伺服驱动板

10 多个伺服系统——控制 MeArm

11 结论

什么是伺服电机?

伺服电机是一种低速、高扭矩的电机,有多种尺寸可供选择。与直流和步进电机不同,伺服电机通常不会旋转完整的 360 度。相反,它被限制在 180、270 或 90 度的范围内。

控制信号被发送到伺服系统以将轴定位在所需的角度。这种具有单一信号的布置使得伺服系统可以简单地用于无线电和遥控设计以及单片机。

我们已经构建了一些使用电机使物体移动的项目,并且在此过程中我们查看了一些可以通过 Arduino 和 Raspberry Pi 项目控制的不同类型的电机。

图1

伺服电机的种类

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

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

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

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

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

模拟伺服电机

模拟伺服电机价格低廉,有多种尺寸和额定值可供选择。当您需要可以准确定位的小型高扭矩电机时,这是完美的选择。

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

PWM 是一种理想的控制方式。它可以由一个简单的定时器电路或单片机产生。它可以通过单根电线发送,也可以通过无线电或光束传送信号。

Arduino 有许多支持 PWM 的输出引脚,非常适合控制伺服电机。

伺服系统如何工作?

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

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

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

为了正常工作,伺服电机需要一个可以准确测量其轴位置的传感器。在一些工业和高端玩具伺服电机上,这是使用光电盘完成的,但在大多数标准业余伺服电机中,传感器是一个电位计。这也是有效的,因为这些伺服系统通常会移动 180 到 270 度,完全在电位计的范围内。然而,电位计的精度,特别是在低成本伺服电机中的精度,会影响伺服机构的整体精度。

连续旋转伺服电机

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

小尺寸和大扭矩的结合也使伺服电机在小型玩具和机器人等小型设备的设计中用作标准直流电机的替代品。有些人会通过移除电位计来修改标准模拟舵机,让舵机可以旋转整整 360 度。

从制造商得到的消息,现在也提供“连续旋转伺服电机”,其实是剥离了伺服机构的伺服电机。

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

具有简单的单线控制信号和与标准伺服电机相同的物理封装使连续旋转伺服电机能用到许多场合。

伺服电机控制信号

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

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

传统伺服电机时序

在传统的模拟伺服电机中,使用周期为 20 ms 的 PWM 信号来控制电机。20 ms 的信号具有 50 Hz 的频率。

脉冲宽度在 1 到 2 ms 之间变化,以控制电机轴位置。

图2

1.5ms 的脉冲宽度将使伺服轴停留在 90 度位置,即其行程的中心。

1ms 的脉冲宽度将导致伺服轴停在 0 度位置。

2ms 的脉冲宽度将使伺服轴停在 180 度位置。

在 1ms 和 2ms 之间改变脉冲宽度将使伺服轴在 180 度的范围内移动。通过相应地调整脉冲宽度,您可以将其放置在您想要的任何角度。

连续旋转伺服电机时序

在连续旋转伺服电机中,相同的 PWM 信号将导致电机的性能不同。

图3

1.5ms 的脉冲宽度将导致伺服轴停止旋转。

1ms的脉冲宽度将导致伺服轴逆时针全速旋转。

2ms 的脉冲宽度将导致伺服轴顺时针全速旋转。

在 1ms 和 1.5ms 之间改变脉冲宽度将使电机逆时针旋转,较短的脉冲宽度使电机旋转得更快。

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

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

伺服电机规格

市面上有数百种模拟伺服电机可用,了解如何阅读它们的规格对于为您的应用选择正确的电机至关重要。

以下是您在选择伺服电机时会遇到的一些关键参数。

电机尺寸

伺服电机的物理尺寸自然是一个重要的考虑因素,您的应用可能会要求电机符合特定的尺寸限制。

有多种标准伺服电机尺寸,这使得找到适合您的伺服电机的安装支架和硬件变得更加容易。

伺服大小通常指定如下:

纳米亚微小型的标准

也有特殊尺寸。微(Micro) 和 标准(Standard) 尺寸是 Arduino 实验者最常使用的尺寸。

齿轮材料

伺服系统有许多内齿轮和直接在输出轴上的齿轮装置,这些用于降低电机速度并增加其扭矩。

齿轮可以使用塑料或金属制造。

金属齿轮提供更好的性能,通常可以支持更高的扭矩并且不易脱落。金属齿轮伺服系统的成本也更高。

塑料齿轮更容易脱落,并且没有金属齿轮的扭矩能力。然而,它们比金属齿轮伺服电机更安静且更便宜。

相同的伺服电机结构可能会使用不同的齿轮材料。一种常见的实验电机是 SG90,带有塑料齿轮的微型伺服电机。它的金属齿轮对应型号是MG90。由于它们采用相同的外壳并具有相同的电压和驱动器要求,因此它们可以互换,MG90 因其金属齿轮而提供卓越的性能。

伺服电机的质量还受轴承类型和轴承数量的影响。带有多个轴承的电机转动更平稳、更准确。

速度

伺服电机的速度定义为将伺服轴移动 60 度所需的时间。

图4

比如规格0.25 秒/60°,这意味着行进 60 度需要四分之一秒。

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

高速伺服系统用于航模和直升机应用,以控制经常需要快速移动的升降舵和方向舵。其中许多使用数字控制和内部光学位置传感器代替电位计,以实现更快速的移动。

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

扭矩

扭矩是一个非常重要的参数,它从字面上指定了电机的力道。

扭矩被定义为伺服系统可以施加到连杆上的力,换句话说,它可以承受多大的力。

它以千克厘米为单位。

要了解扭矩数字与现实世界情况的关系,请考虑以下示例:

图5

如伺服电机的额定值为 5 kg-cm。也就是说伺服电机可在距轴中心 1 厘米处的杠杆上承受高达 5kg 的负载。

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

一半的距离使可支撑的负载翻倍至 10kg。

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

工作电压

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

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

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

连杆、和配件

大多数伺服电机都有一个齿轮轴,它的中心有螺纹方便坚固。

为了使用伺服电机,您需要在轴上装上另一个零件—平台、齿轮、轮子或任何您试图与伺服电机轴一起移动的东西。

伺服电机配有各种不同形状的杠杆和圆盘,可以与轴配合,以方便将伺服电机连接到您的设计中。这些部件通常被称“连杆”。它们连接到伺服电机轴上并用中心螺钉固定到位,它们可以由塑料或金属制成。

除了连杆,您还应该随伺服电机一起收到各种安装硬件和螺钉,包括轴的中心螺钉(不要丢失它,因为它们往往因伺服类型而异)。

您还可以购买设计用于接受微型和标准等流行伺服尺寸的安装板。

伺服连杆、固定件和附件的可用性和互换性使您可以轻松地将伺服电机集成到您的设计中。

测试伺服电机

与任何组件一样,了解如何测试伺服电机以确保正常运行很有用。

在将伺服电机安装到您的项目中之前,能够将伺服轴旋转到预设位置(例如 90 度)也很有用,以便一切都正确对齐。

您可以使用多种方法来测试伺服。一个简单的 Arduino 代码和连接,就像您将在此处进一步看到的那样,将成为测试伺服并将其轴定位到预设位置的绝佳方法。

另一种方法是使用专用伺服测试仪。

伺服测试仪

正如您想象的那样,伺服测试仪是一种用于测试伺服电机的设备!它们非常有用,而且可能非常便宜,具体取决于您想要的功能。

一个简单的伺服测试仪,如这里所示(并在随附的视频中使用)只需几美元。

更先进的伺服测试仪有多个电机的速度和定心控制,有些还有电流表。加上这些都不到20美元。

这些测试仪可以共用电机本身的电源。它们可以插入标准伺服电机连接器,然后它们将控制伺服电机。

伺服测试仪将允许您手动移动电机并将其置于 90 度位置的中心。这使您可以在连杆固定到电机之前检查电机是否正确运行并对齐其轴位置。

伺服电机接线

模拟伺服电机通常有一个 3 针连接器。

民用伺服电机上使用的颜色代码因制造商而异。然而,大多数制造商使用相同的引脚排列,如下图所示:

图6

伺服电机的三个连接如下:

Ground接地- 电机和逻辑的公共接地。Power电源- 为伺服供电的正电压。Control控制——PWM 控制信号的输入。

最常见的连接器是标准的杜邦连接器,间距为 0.1 英寸。这使得使用标准杜邦接头将伺服电机连接到您的项目变得容易。

您还可以将面包板电线直接插入伺服 3 针连接器,以便您可以使用伺服电机进行原型设计。

连接到 Arduino

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

单片机在能够更有效地控制伺服方面自然具有许多优势。Arduino 是一个很好的选择。

Arduino IDE 已经包含一个伺服库,因此您很快就会看到,将伺服添加到您的代码中非常简单。

PWM脉宽调制输出

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

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

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

电源注意事项

大多数伺服电机都可以在 5 伏电压下运行,因此很容易使用 Arduino 板上的 5 伏输出为伺服供电。

但这不是一个很好的主意。

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

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

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

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

伺服扫描旋转的代码

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

连接硬件以用于我们的第一个演示非常简单。您需要一个 Arduino(任何类型)、一个伺服电机和一个伺服电机电源。

图7

连接再简单不过了。伺服由自己的电源供电,接地连接也连接到 Arduino 接地。然后来自伺服的控制引线连接到 Arduino 上的引脚 9。

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

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

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

将显示示例代码列表。它分为几个部分,向下滚动列表直到到达“来自库的示例”部分。

在“库中的示例”部分,您将看到“伺服”。突出显示以显示两个代码,旋钮扫描

加载代码。

/* Sweep by BARRAGAN <; This example code is in the public domain.  modified 8 Nov 2013 by Scott Fitzgerald */ #include <Servo.h> Servo myservo;  // create servo object to control a servo// twelve servo objects can be created on most boards int pos = 0;    // variable to store the servo position void setup() {  myservo.attach(9);  // attaches the servo on pin 9 to the servo object} void loop() {  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 上的伺服电机控制线。

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

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

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

您刚刚使用 Arduino 进行了伺服运动!

旋钮代码

让我们继续看 Arduino IDE 附带的另一个演示代码,即旋钮代码。在我们做之前,我们需要在我们的电路中添加一个组件。

图8

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

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

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

修改实验以包含电位计后,打开 Arduino IDE 并返回示例代码。这次从伺服菜单中选择扫描

 /* Controlling a servo position using a potentiometer (variable resistor) by Michal Rinott <;  modified on 8 Nov 2013 by Scott Fitzgerald */ #include <Servo.h> Servo myservo;  // create servo object to control a servo int potpin = 0;  // analog pin used to connect the potentiometerint val;    // variable to read the value from the analog pin void setup() {  myservo.attach(9);  // attaches the servo on pin 9 to the servo object} void loop() {  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 value  delay(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!

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

图9

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

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。

多舵机——控制 MeArm

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

我按如下方式连接所有内容:

图10

你会注意到我还添加了四个电位器,和以前一样,它们可以是 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 模块,因此我没有短路任何地址焊盘。

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

 /*  PCA9685 PWM Servo Driver Example  pca9685-servomotor-demo.ino  Demonstrates use of 16 channel I2C PWM driver board with 4 servo motors  Uses Adafruit PWM library  Uses 4 potentiometers for input   DroneBot Workshop 2018  */ // Include Wire Library for I2C Communications#include <Wire.h> // Include Adafruit PWM Library#include <Adafruit_PWMServoDriver.h> #define MIN_PULSE_WIDTH       650#define MAX_PULSE_WIDTH       2350#define FREQUENCY             50 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // Define Potentiometer Inputs int controlA = A0;int controlB = A1;int controlC = A2;int controlD = A3; // Define Motor Outputs on PCA9685 board int motorA = 0;int motorB = 4;int motorC = 8;int motorD = 12; void setup(){  pwm.begin();  pwm.setPWMFreq(FREQUENCY);}  void moveMotor(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); } void loop() {   //Control Motor A  moveMotor(controlA, motorA);    //Control Motor B  moveMotor(controlB, motorB);      //Control Motor C  moveMotor(controlC, motorC);    //Control Motor D  moveMotor(controlD, motorD);  }

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

打开 Arduino IDE。从顶部的菜单中选择Sketch选择包括库。将出现一个子菜单。从子菜单中选择管理库...。库管理器将打开。在库管理器中搜索“Adafruit PWM”Adafruit的PWM伺服Library驱动程序应该是第一个结果。单击“更多信息”链接以显示“安装”按钮。使用此按钮将库安装到您的 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。如果您为电机使用不同的连接器,请更改这些值。

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

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

我们的函数叫做moveMotor。它有两个输入,controlIn代表电位计输入,motorOut代表PCA9685上的电机连接。

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

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

结果是 MeArm 中的四个伺服电机将响应电位计。在演示中,我使用了滑动电位计,这使得精确定位 MeArm 变得更加容易。

结论

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

希望本文及其相关视频有助于阐明伺服电机的使用,伺服电机可以直接连接到 Arduino,也可以使用 PCA9685 PWM 控制器通过 I2C 连接。

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

标签: #c控制伺服电机