arduino学习笔记21 - 舵机控制实验
本帖最后由 董董soul 于 2017-2-15 11:52 编辑舵机是什么这里就不详细介绍了,详情请看论坛里《舵机详解》帖子
这里使用arduino duemilanove通过电位器控制一个舵机转动
使用原件:
arduino duemilanove一块
10K电位器一个
舵机一个
面包板一个
面包板连接线若干
这里要注意,不要使用电脑usb供电,因为如果电流需求大于500ma,会有烧毁usb的可能,推荐使用电池外置供电。
电位器左右两脚分别接3.3V和GND,中间接模拟口0。
舵机接5V和GND,信号口接数字7号口。
先上硬件连接图
把下面代码下载进入arduino,然后再进行线路连接,运行时一定要使用电池供电。int readPin = 0; //用来连接电位器
int servopin = 7; //定义舵机接口数字接口7
void servopulse(int angle)//定义一个脉冲函数
{
int pulsewidth=(angle*11)+500;//将角度转化为500-2480的脉宽值
digitalWrite(servopin,HIGH); //将舵机接口电平至高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW); //将舵机接口电平至低
delayMicroseconds(20000-pulsewidth);
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
}
void loop()
{
//读取电位器(传感器)的读数,接到3.3V,值范围从0到660左右
int readValue = analogRead(readPin);
//把值的范围映射到0到165左右
int angle = readValue / 4;
//发送50个脉冲
for(int i=0;i<50;i++)
{
//引用脉冲函数
servopulse(angle);
}
}下面是实验效果
http://player.youku.com/player.php/sid/XMzExMjAyMTg4/v.swf
Valyrian 发表于 2015-7-29 10:32 static/image/common/back.gif
我觉得是把一个周期走完
不是,后来看了一些资料,好像这个舵机控制信号要求每20Ms一个脉冲,脉冲宽度在1Ms至2Ms之间··· HLX 发表于 2013-3-21 23:35 static/image/common/back.gif
为什么要将角度转化为int pulsewidth=(angle*11)+500;//将角度转化为500-2480的脉宽值
为什么是500-2480
我试一下分析:
1、首先舵机工作原理是用0.5ms到2.5ms之间的脉冲,来对应0到180度左右的角度。那么0.5ms相对应的就是500微秒到2500微秒;
2、电位器取值是3.3伏,对应的值范围从0到675.18(不是文中的660,计算方法:由于5V是1023,那么3.3V就是1023*3.3/5),取值约675;除以4得出168.75,取值168
3、int pulsewidth=(angle*11)+500 代入168,得出2356,相对应的角度就是169.6度——即电位器点位最高的电平的旋转角度
不知道是否正确? 如果我使用的是MAP函数呢 ck59505 发表于 2011-10-19 22:13 static/image/common/back.gif
如果我使用的是MAP函数呢
map函数?map是啥。。。。。 这是我们老师说的,比如。。这样,用的是9号口
11 void setup()
12 {
13 myservo.attach(9);
14 }
15
16 void loop()
17 {
18 val = analogRead(potpin);
19 val = map(val, 0, 1023, 0, 179); //使得角度再0~180
20 myservo.write(val);
21 delay(15);
22 }
ck59505 发表于 2011-10-20 19:43 static/image/common/back.gif
这是我们老师说的,比如。。这样,用的是9号口
哦,这段代码是使用Servo库,map函数确实不错,使用后的程序很简练。我看了下官网的,这段程序是官网的程序,肯定是可以工作的。 map函数在20版本里面有哦,控制电机精度很准,就是里面的延时时间好像有点长,稍微改一下,效果很好。 弘毅 发表于 2011-10-19 22:37 static/image/common/back.gif
map函数?map是啥。。。。。
为啥我的舵机抖个不停呢,而且电位器控制不了·· 回复地方 发表于 2011-12-7 23:10 static/image/common/back.gif
为啥我的舵机抖个不停呢,而且电位器控制不了··
有外部供电嘛,不要用usb供电 弘毅 发表于 2011-12-8 11:30 static/image/common/back.gif
有外部供电嘛,不要用usb供电
“把USB烧毁”是什么意思?是Arduino的USB接口吗?
“电流需求大于500ma”是指带动舵机工作的电流吗?:) 本帖最后由 树·水·风 于 2012-2-28 16:31 编辑
弘毅 发表于 2011-10-20 20:25 static/image/common/back.gif
哦,这段代码是使用Servo库,map函数确实不错,使用后的程序很简练。我看了下官网的,这段程序是官网的程 ...#include <Servo.h>
const int pinPotentiometer = 5;
const int pinServo = 3;
Servo servo;
int value;
int angle;
void setup(){
servo.attach(pinServo);
Serial.begin(9600);
}
void loop(){
value = analogRead(pinPotentiometer);
Serial.println(value);
angle = value / 4;
servo.write(angle);
delay(10);
}这是我写的,没有用外接电源。效果正常,就是抖动有点厉害,手一触碰电位器,就能感觉舵机的震动,虽然整体角度不变。下一步打算找办法消除抖动。
我不明白的是以下几个问题:
1. duemilanove板子的工作电压是5V,但外部输入电压建议是7-12V,我不明白两者有什么区别。我直接用9V的外接电源连上了那个圆形的电源接口,没发现什么异常。另外,是不是接了外接电池就不能连USB了?
2. 用电脑USB口供电时,电脑的输出电压恒定吗?用外接电源供电时,板子上能提供5V和3.3V的电压输出是不是因为板子上有电压转换电路转换过了。
3. 外接电源除了圆形的插口,是不是也可以用导线连接Vin口、Gnd到电池上。 树·水·风 发表于 2012-2-28 16:29 static/image/common/back.gif
这是我写的,没有用外接电源。效果正常,就是抖动有点厉害,手一触碰电位器,就能感觉舵机的震动,虽然整体 ...
1,有LDO把7-12V降压到9V,接了电池也可以接USB,不影响。
2,USB口是恒定5V电压,外接电源用LDO转换过了。
3,是的,可以用导线接VIN和GND 求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机? 求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机? arduino-tinker 发表于 2012-6-16 23:16 static/image/common/back.gif
求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?
用软PWM来进行控制,可以参考这篇帖子
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=125 舵机能改成驱动轮子的不?