风筝
发表于: 2016-11-4 23:02:58 | 显示全部楼层

伺服电机在许多不同的应用中是非常有用的,我们应该好好学习如何控制他们!前面的文章已经介绍过电磁阀和直流电机控制;大多数情况下,它们的电机控制方法都是非常简单的(只需要连接电源和地)。

伺服电机有一些不同,它使用3根线连接(电源、地和信号)将电机移动到某个旋转位置。该位置由信号线上发送的信号决定。一旦电机到达信号指定的位置,它将保持其位置,并抵抗试图将其从该位置移动的任何外力。该电阻称为伺服的转矩额定值,可在数据表中找到。

可以使用下面几种类型的伺服:

固定旋转伺服 - 这些伺服在其旋转方面有固定的限制,因此您无法使其超过其限制。适合用于机器人手臂、拉/推杠杆等;

连续旋转伺服 - 这些伺服允许您无限期地连续顺时针或逆时针旋转。

线性伺服 - 允许通过伺服电机控制进行线性运动。

脉冲宽度调制PWM

伺服电机可以在0-6V范围内工作,特别是我们在Makersphere看到的爱好伺服(hobby servo)。为了控制旋转,我们在信号线上发送一个可变宽度的脉冲(电源线和地线用作信号的参考)。如果你对这个不熟悉,可以理解成,一个脉冲只是一个方波从0V到另一个电压,然后返回到0V的一段时间。伺服点击根据脉冲的宽度向左或向右转动。

首先使用脉冲控制伺服位置的想法看起来有点过时,请看一下这个图,以便更直观地了解它是如何工作的。基本上,存在一个伺服电机电路可以保持的中性位置,该位置定义成一个脉冲宽度(在本示例中称为1ms)。

servo-diagram-rotation.png

假设,保持伺服点解在中性位置的1ms脉冲可以无限期地保持该位置。如果我们发送短于1ms的中性脉冲(<1ms)的脉冲,电机将百分数转向零度。相反发生在另一侧(> 1ms),电机将朝最大旋转(180度)分数旋转。计算该中性点任一侧的旋转分数值的电路会比这个简化模型要复杂得多。但这应该可以给你一个让它工作的好主意。

当我们使用Arduino编程时,这种伺服电机背后的理论并不太重要。我们可以导入一个库来满足大多数的PWM应用场景。该库称为Servo库,您可以在Arduino参考页查看的该库的所有不同函数。

使用伺服库的基本操作如下:

1.  将伺服电机命名servo,可以使用Servo [servo name];函数实现。

2.  将伺服关联到一个引脚,这个引脚将是我们伺服的信号引脚,并使用 [servo name].attach([PinNumber]);

3.  为伺服的位置创建一个变量(或者只是使用一个整数值)

4.  现在我们可以使用[servo name].write([position integer])写入伺服的位置。


在本教程中我们将使用Arduino Uno和一个小型爱好伺服。有时,在使用较大的电机时,伺服器可以在极短的间隔汲取过量的电流。在这种情况下,我们将使用一个电容器(或者可能只是一个具有外部电源的伺服屏蔽),以减少灌入的电流量(考虑Arduino引脚只有20mA!)。因此我们使用的是一个小的爱好伺服,它直接连接到Arduino可以很好的工作。

您的设置应该看起来像这样,请注意,我们使用的PWM引脚10,但可以使用任何PWM引脚!

arduino_servo_fritzing.png


编写代码就像使用Servo库一样简单。

我们将写一个框架程序,可以向后和/或向前移动我们的伺服点击。 你可以在下面看到我们的代码,也可以随时自己写。

  1. #include  //import the servo library

  2. Servo coreservo; //Name the Servo

  3. void setup() {
  4.   coreservo.attach(10);
  5.   /*Attach the named servo object to Digital IO 13, use following syntax:
  6.   servoname.attach(Pin#, minimum Pulse width (ms), maximum pulse width (ms));
  7.   if you want to define the pulse widths for your motor*/

  8. }

  9. void loop() {
  10.   coreservo.write(0);
  11.   delay(200);
  12.   coreservo.write(90);
  13.   delay(200);
  14.   coreservo.write(180);
  15.   delay(200);
  16.   /* If you wanted to read the angle of your servo at any given time, use servoname.read();
  17.    * If you wanted to write a pulse of a certain width use servoname.writemicroseconds(value in microseconds);
  18.    */
  19. }
复制代码

如果你想要构建一个机器人或使用一大堆伺服器的东西,可以看看Adafruit这个强大的伺服扩展板,它允许你在任何时间连接16个伺服电机!

感谢您花时间看看这个教程,如果有任何问题,可以在教程后面留言。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1479



手机版|

GMT+8, 2024-3-29 09:39 , Processed in 0.100045 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表