伺服电机如何工作&如何使用Arduino控制伺服

在本教程中,我们将学习伺服电机如何工作,以及如何使用Arduino和PCA9685 PWM驱动器控制伺服。你可以观看下面的视频或阅读下面的书面教程。

推荐 2019年最佳Arduino入门套件
概述

有许多类型的伺服电机,它们的主要特点是能够精确地控制其轴的位置。伺服电机是一个利用位置反馈来控制其运动和最终位置的闭环系统。

闭环系统

在工业型伺服电机中,位置反馈传感器通常是一个高精度编码器,而在较小的RC或业余伺服电机中,位置传感器通常是一个简单的电位器。这些设备捕获的实际位置被反馈到误差检测器,并与目标位置进行比较。然后根据误差对电机的实际位置进行修正,使其与目标位置相匹配。

伺服电机闭环系统

在本教程中,我们将详细了解爱好伺服电机。我们将解释这些伺服系统如何工作,以及如何使用Arduino来控制它们。

使用Arduino和PCA9685 PWM驱动程序控制多个伺服电机

爱好伺服是小尺寸的执行机构,用于控制遥控玩具汽车,船,飞机等。它们也被工程专业的学生用来制作机器人原型,制造机械臂,受生物启发的机器人,类人机器人等等。

机械臂六足人形机器人

RC / Hobby伺服是如何工作的

伺服器内部有四个主要部件,直流电机,齿轮箱,电位器和控制电路。直流电动机是高速和低扭矩,但变速箱将速度降低到60转左右,同时增加扭矩。

伺服内部元件如何工作直流电机电位器控制电路

电位器连接在最终齿轮或输出轴上,因此电机旋转电位器旋转,因此产生与输出轴的绝对角度有关的电压。在控制电路中,将该电位计电压与来自信号线的电压进行比较。如果需要,控制器激活集成的H桥,使电动机能够在任一方向上旋转,直到两个信号达到零差。

通过通过信号线发送一系列脉冲来控制伺服电机。控制信号的频率应为50Hz或每20ms出现一次脉冲。脉冲的宽度决定了伺服的角度位置,这些类型的伺服通常可以旋转180度(他们有一个物理的旅行限制)。

RC伺服电机控制信号

一般1ms持续时间的脉冲对应0度位置,1.5ms持续时间对应90度,2ms持续时间对应180度。尽管脉冲的最小和最大持续时间有时会因品牌不同而不同,0度时为0.5ms, 180度时为2.5ms。

Arduino伺服电机控制

让我们把上面置于使用Arduino控制业余爱好伺服的实际示例。我将使用MG996R,这是一个高扭矩伺服,具有金属齿轮,具有10kg-cm的扭矩。高扭矩以一个价格出现,这是2.5A的伺服的档位。运行电流为500mA至900mA,工作电压为4.8至7.2V。

Arduino伺服电机控制

根据目前的评级,我们不能直接将这个伺服连接到Arduino上,我们必须为它使用单独的电源。这是这个例子的电路原理图。

Arduino伺服电机控制电路图

我们只需要将伺服的控制引脚连接到Arduino板的任意数字引脚上,将地线和正极连接到外部5V电源上,同时将Arduino接地连接到伺服接地上。

你可以从下面的链接中获得这个例子所需的组件:

必威外围提钱披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

Arduino伺服电机控制代码

现在让我们来看看用于控制伺服电机的Arduino代码。代码非常简单。我们只需要定义伺服连接的引脚,将该引脚定义为输出,并且在环形部分中,在我们之前解释的情况下,在具有特定持续时间和频率的情况下产生脉冲。

/* define servoPin 9 void setup() {pinMode(servoPin, OUTPUT); /* definbet188官方网站e servoPin 9 void setup() {pinMode(servoPin, OUTPUT);} void loop(){//每20ms一个脉冲digitalWrite(servoPin, HIGH);delayMicroseconds (1450);//脉冲持续时间(微秒)digitalWrite(servoPin, LOW);delayMicroseconds (18550);// 20ms -脉冲持续时间//脉冲持续时间:600 - 0deg;1450 - 90度;2300 - 180deg}

经过一些测试,我得出了以下值的脉冲持续时间与我的伺服。0.6ms持续时间的脉冲对应于0度位置,1.45ms对应于90度,2.3ms对应于180度。

我把万用表串联在伺服上,检查电流图。我注意到的最大电流在失速时达到了0.63。这是因为这不是原来的TowerPro MG996R伺服,而是一个更便宜的复制品,显然有更差的性能。

伺服电机电流牵引

不过,让我们来看看使用Arduino控制伺服的一种更方便的方法。那是在使用Arduino伺服库。

/* use the Arduino Servo Library by Dejan, //www.mfxpo.com bet188官方网站*/ #include  Servo myservo;//创建一个伺服对象来控制一个伺服void setup() {myservo.attach(9,600,2300);// (pin, min, max)} void loop() {myservo.write(0);//告诉伺服去一个特定的角度延迟(1000);myservo.write (90);延迟(500);myservo.write (135);延迟(500);myservo.write (180);延迟(1500); }

这里我们只需要包含库,定义伺服对象,并使用attach()函数定义连接到伺服的引脚,以及定义脉冲持续时间的最小值和最大值。然后使用write()函数,我们简单地设置伺服的位置从0到180度。有了这个库,我们可以驱动多达12个伺服同时或48个伺服使用Arduino Mega板。

Arduino和PCA9685 PWM/伺服驱动器

Arduino还有另一种控制伺服的方法,那就是使用PCA9685伺服驱动器。这是一个16路12位PWM和伺服驱动器,通过I2C总线与Arduino通信。它有一个内置时钟,所以它可以驱动16个伺服自由运行,或独立于Arduino。

Arduino和PCA9685 PWM伺服驱动器

更酷的是,我们可以在一辆I2C公交车上串联多达62个这样的司机。因此,理论上,我们可以控制多达992个伺服,仅使用两个I2C引脚从Arduino板。6个地址选择引脚用于为每个附加驱动器设置不同的I2C地址。我们只需要按照这个表格连接焊盘。

PCA9685地址选择引脚表I2CAddress

这是电路原理图,我们可以再次注意到我们需要一个单独的伺服电源。

Arduino和PCA9685电路原理图

你可以从下面的链接中获得这个例子所需的组件:

必威外围提钱披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

现在我们来看看Arduino的代码。为了控制这个伺服驱动器,我们将使用PCA9685库,可以下载GitHub

PCA9685 Arduino代码

/ *伺服电机控制使用Arduino和PCA9685驱动程序由Dejan,//www.mfxpo.com库:https:bet188官方网站//github.com/nachtravevl/pca9685-arduino * / #include  #include“pca9685.h“PCA9685驱动程序;// PCA9685输出= 12位= 4096步// 2.5%的20ms = 0.5ms;12.5%的20ms = 2.5ms // 2.5%的4096 = 102步;12.5%的4096 = 512步PCA9685_ServoEvAluator PWMServo(102,470);//(-90deg,+ 90deg)//第二伺服// pca9685_servoevaluator pwmservo2(102,310,505);//(0deg,90deg,180deg)void setup(){wire.begin();//线必须启动第一线。塞克(400000);//支持的波特率为100khz,400khz和1000khz驱动程序.resetdevices();//软件在线驱动器上重置所有PCA9685设备.INIT(B000000);//地址引脚A5-A0设置为B000000 Driver.SetPWMFrequency(50); // Set frequency to 50Hz } void loop() { driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000); }

因此,首先我们需要包含库并定义PCA9685对象。然后使用Servo_Evaluator实例定义脉冲持续时间或驱动器的PWM输出。注意,输出是12位的,或者分辨率是4096步。因此,0.5ms或0°位置的最小脉冲持续时间对应102步,2.5ms或180°位置的最大脉冲持续时间对应512步。但如前所述,这些值应根据您的伺服电机进行调整。在我的例子中,从102到470的值对应于0到180度的位置。

在设置部分中,我们需要定义I2C时钟速率,设置驱动程序地址并将频率设置为50Hz。

在回路部分,使用setChannelPWM()和pwmForAngle()函数,我们简单地将伺服设置为所需的角度。

我连接了第二个伺服到驱动器上,正如我所料,它的定位和第一个不一样,那是因为我使用的伺服是廉价的拷贝,他们不是那么可靠。然而,这不是一个大问题,因为使用Servo_Evaluator实例,我们可以为每个伺服设置不同的输出设置。我们也可以调整90度的位置,以防它不是精确的在中间。这样,所有的伺服系统都将以相同的角度工作。

通过Arduino和PCA9685驱动控制大量伺服

我们将介绍一下更详一例的示例,并使用多个链接的PCA9685驱动程序控制大量伺服。

使用Arduino和PCA9685控制多台伺服电机

为了达到这个目的,我们需要将驱动程序相互连接,并连接适当的地址选择焊锡盘。这是电路原理图:

多PCA9685驱动器Daisy连锁电路

现在我们来看看Arduino的代码。

/ *伺服电机控制使用Arduino和PCA9685驱动程序由Dejan,//www.mfxpo.com库:https:bet188官方网站//github.com/nachtravevl/pca9685-arduino * / #include  #include“pca9685.h“PCA9685驱动程序;// PCA9685输出= 12位= 4096步// 2.5%的20ms = 0.5ms;12.5%的20ms = 2.5ms // 2.5%的4096 = 102步;12.5%的4096 = 512步PCA9685_ServoEvAluator PWMServo(102,470);//(-90deg,+ 90deg)//第二伺服pca9685_servoevaluator pwmservo2(102,310,505);//(0deg,90deg,180deg)void setup(){wire.begin();//线必须启动第一线。塞克(400000);//支持的波特率为100khz,400khz和1000khz驱动程序.resetdevices();//软件在线驱动器上重置所有PCA9685设备.INIT(B000000);//地址引脚A5-A0设置为B000000 Driver.SetPWMFrequency(50); // Set frequency to 50Hz } void loop() { driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000); driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000); }

因此,我们应该为每个驱动程序创建单独的PCA9685对象,为每个驱动程序定义地址,并将频率设置为50Hz。现在只需使用SetChannelpwm()和pwmforangle()函数,我们可以在任何驱动程序处设置任何伺服来定位我们想要的任何角度。

这就是本教程的全部内容,我希望你喜欢它,并学到了一些新的东西。请在下面的评论部分问任何问题,确保你可以Arduino项bet188me目集合

7回复

  1. 巴特

    亲爱的机电一体化,

    关于你在YouTube上的视频“伺服电机如何工作&如何使用Arduino控制伺服”,我写了一个非常快的问题(对你来说可能看起来很傻)。
    我刚刚开始使用Arduino和servos。Servos我去了完全一样的ar在视频中你的,这意味着我也必须使用外部电源。这是一个挑战,我想我使用了错误的电源-因为电线变热了。请您提供更多有关您使用的电源的信息,以及您是如何通过面包板连接电源的?
    电源我用过220V到5V, 15A

    巴特

    回复
    • Dejan Nedelkovski.

      5V是正确的电源,在你的情况下,安培额定值并不重要,它只是意味着它可以处理更多的伺服同时工作(取决于伺服电流绘制)。伺服中线为5V,棕色GND,黄色为信号线。

      回复
      • 阿兰

        你好,我还有一个查询。我正在使用6V -7.4V Hobby King Moto Moto。最初我正在与来自Arduino的电源驱动它。后来我用7 V的直流电源连接它,我也将电流限制设置为最大700 mA,到更安全的一侧,但仍然是我的伺服电机被摧毁。我想知道是什么原因,我如何纠正它。谢谢

      • 德扬

        嘿,Arduino本身不能驱动这样的伺服电机,它不能提供那么多的能量。用单独的电源供电是正确的,你说7v, 700mA,这听起来很合理,不应该破坏电机。问题可能是伺服本身,或者可能7V太高了,你应该尝试6V max,但我不能确定。

留下一个回复

您的电子邮件地址将不会被公布。

推荐

2019年最佳入门级示波器初学者和爱好者

初学者和爱好者最好的示波器

推荐

2019年最佳Arduino入门套件

初学者的8个最佳Arduino Starter Kits

推荐

最佳3D打印机为初学者和爱好者- 3D打印

最好的3d打印机为初学者和爱好者