利用Arduino 驱动舵机(附带程序)
学习利用Arduino 驱动舵机(附带程序)
2012-6-30 00:27|发布者: sonxun|查看: 1180|评论: 0
摘要: 什么是伺服电机?想象一下有一个小电机连接到一个可调电阻器。一个电动脉冲或者命令被发送到电机之后,电机旋转到匹配指定的电位值的角度。嗯,那样说听起来有点难以理解。一个更简单的解释是:伺服电机,就是一个可 ... 什么是伺服电机?
想象一下有一个小电机连接到一个可调电阻器。一个电动脉冲或者命令被发送到电机之后,电机旋转到匹配指定的电位值的角度。嗯,那样说听起来有点难以理解。
一个更简单的解释是:伺服电机,就是一个可以被指定旋转到一个特定的角度的电动马达。例如,它通常可以用来控制遥控汽车的转向系统。在这里,我们要再次感谢Arduino和朋友们,要使用一个伺服电机是很容易的,它可以让你创造出
富有想象力的设计,唯一的局限就只有你的时间和资金了。
当你想要使用伺服电机时,需要考虑一些因素,包括:
?旋转范围,指的是电机可以旋转的角度的范围。例如 180 度或者 360 度(全旋),等等。
?旋转速度(通常以旋转每一度所花费的时间来衡量)。
?扭矩,伺服电机能够产生的扭矩 (旋转的力量)。
?在负载的状态下的电流大小。
?重量、成本以及其他因素。
脑海中首先想到的一个问题就是“哇——我能够同时使用多少个电机呢?”答案是……在duemilanove上,可以使用12个;在arduino mega上,可以使用48 个(哇)。请注意当你使用伺服电机函数库时,你不能在第9和第10端口上使用analogWrite(); 函数。你可以在 arduino 伺服电机函数库页面找到更多的细节。
在今天的例子和练习中,我使用了Turnigy TG9伺服电机。它相当的便宜,而且重量轻,非常适合演示实验,这款电机也经常被用于遥控飞机。它的旋转范围是180度。(它真的非常便宜)
我希望你注意到伺服电机上一共有三根导线。一根是 +5V 电源,一根是 GND 接地,另一根是控制信号——连接到arduino的一个数字输出端口上。导线的颜色不是固定的,不过对于这一款adafruit的伺服电机来说,颜色最深的的是地线GND,最浅的是控制信号线,不深不浅的就是 +5V 电源线了。这一款电机非常小,额定电流也不大,所以可以使用你的 Arduino 控制板直接驱动。然而,当你使用更大的电机或者电机有较大的负载时,你就需要为电机独立供电,这样才能提供它所需要的电流。如果你要同时使用两个以上的这类轻量级的电机时,你需要使用外接电源以及一个电机扩展板。
当你使用角度计量时,你最好准备一个量角器,就像这样的:
我们要怎样才能控制伺服电机呢?首先我们需要使用伺服电机函数库。就像我们在第二章中使用LCD显示屏那样,在代码的开头部分写下这样一行:
#include
这样,我们就可以使用伺服电机控制命令了。
接下来需要在代码中创建伺服电机的对象(object),以便于引用,例如:
Servo myservo;
最后,为了控制电机,将电机对象绑定到一个数字端口(在 void setup(); 代码段中 )。
myservo.attach(9); // 在端口9上绑定电机对象
代码的设置部分就只有这些了,接下来所需要做的就只有……
myservo.write(pos);
pos 是一个 0 到 180 (或者多或者少,这决定于伺服电机旋转的角度的范围) 之间的数字。
好了,空谈不如实践,我们要用一个例子来将所有的东西包括伺服电机的旋转都
结合在一起。下面的例子将让你看到指针从左边移动到中间再移动到右边并重复循环: (下载)
/*
例子 3.3 –伺服电机监测
创建于 21/04/2010 —作者 John Boxall —
https://www.360docs.net/doc/96806351.html, — CC by-sa v3.0
*/
#include
Servo myservo; // 创建电机对象
int pos = 0; // 存放电机旋转角度的变量
int del = 100; // 延时(单位:毫秒)
void setup()
{
Serial.begin(9600);
myservo.attach(9); // 将伺服电机控制信号连接到在端口9并绑定电机对象
}
void loop()
{
for (int loopy = 0; loopy<=3; loopy++)
{
for (pos = 180; pos >=0; pos--) // 将Hextronik HXT900电机从左向右旋转{
myservo.write(pos);
delay(del);
}
delay(1000);
}
for (int loopy = 0; loopy<=3; loopy++)
{
myservo.write(180);
delay (1000);
myservo.write(90);
delay (1000);
myservo.write(0);
delay (3000);
}
}
电路板的连接非常的简单,仅仅只有伺服电机的三根导线被连接到了arduino
控制板上。
下面是视频。抱歉的是,我的摄像机没有录下声音,因此你无法听到电机转动时的嗡嗡声。
好了,你应该也已经读够了也看够了,该是你来做些练习的时候了。记得用上到现在为止我们所讨论过的所有的知识……
练习 3.1
我们可以使用数码技术来让一些东西变得更加有用和与众不同——比如带有以下功能的模拟式的(指针式的)数字温度计:
?指针可旋转180度范围的模拟式的温度显示。所表示温度的范围则根据你所在地的气候而不同。在我的例子中将表示 0~40 摄氏度。
?一个可以用来显示是否需要打开加热器或者空调或者关闭的模拟的指针。
也就是练习 2.1的模拟显示版本。
?可以在需要的时候显示最低和最高温度,同时有一个指示器(用LED就好)来说明显示的是什么内容。另外还要有个重置按钮。
你可以把你自己的函数、温度传感器、一些判断语句、数字和模拟输入、数字和模拟的输出以及一些你的创意结合在一起,来完成这个练习。如果要照我的样例
去完成练习的话,你需要以下的元件:
?你的Arduino标准套件。
?水(记得补充水分)。
?Analog Devices 出品的 TMP36 温度传感器(element-14 备件号143-8760)。
? 2 个小的按钮。
? 2 个 10k 0.25W 的电阻。将作为按钮的限流电阻使用。
?两颗LED来说明显示的是最低/最高温度。
? 2 个 390 ohm 0.25 W 电阻,作为LED的限流保护电阻。
可以开始了……如果你有任何问题,你可以在文章最后留言,或者发邮件给 john at tronixstuff dot com 。
实验的成果如下,这是我的电路板的布线照片:
你可以看到用来显示最低/最高温度的按钮和重置按钮。同时两个LED用来说明右边的伺服电机上的指针显示的是最低或是最高的温度,在同时亮起时则是询问你是否需要重置温度记录。当然,还有实验的视频:
这里可以下载到我的实验代码。