弘毅 发表于 2011-10-9 21:35:07

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

血阳 发表于 2015-7-29 12:24:29

Valyrian 发表于 2015-7-29 10:32 static/image/common/back.gif
我觉得是把一个周期走完

不是,后来看了一些资料,好像这个舵机控制信号要求每20Ms一个脉冲,脉冲宽度在1Ms至2Ms之间···

pan 发表于 2014-6-15 21:48:00

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度——即电位器点位最高的电平的旋转角度

不知道是否正确?

ck59505 发表于 2011-10-19 22:13:25

如果我使用的是MAP函数呢

弘毅 发表于 2011-10-19 22:37:47

ck59505 发表于 2011-10-19 22:13 static/image/common/back.gif
如果我使用的是MAP函数呢

map函数?map是啥。。。。。

ck59505 发表于 2011-10-20 19:43:04

这是我们老师说的,比如。。这样,用的是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 }

弘毅 发表于 2011-10-20 20:25:10

ck59505 发表于 2011-10-20 19:43 static/image/common/back.gif
这是我们老师说的,比如。。这样,用的是9号口
   



哦,这段代码是使用Servo库,map函数确实不错,使用后的程序很简练。我看了下官网的,这段程序是官网的程序,肯定是可以工作的。

プ汏坏疍 发表于 2011-12-2 13:49:02

map函数在20版本里面有哦,控制电机精度很准,就是里面的延时时间好像有点长,稍微改一下,效果很好。

回复地方 发表于 2011-12-7 23:10:24

弘毅 发表于 2011-10-19 22:37 static/image/common/back.gif
map函数?map是啥。。。。。

为啥我的舵机抖个不停呢,而且电位器控制不了··

弘毅 发表于 2011-12-8 11:30:06

回复地方 发表于 2011-12-7 23:10 static/image/common/back.gif
为啥我的舵机抖个不停呢,而且电位器控制不了··

有外部供电嘛,不要用usb供电

树·水·风 发表于 2012-2-28 15:57:09

弘毅 发表于 2011-12-8 11:30 static/image/common/back.gif
有外部供电嘛,不要用usb供电

“把USB烧毁”是什么意思?是Arduino的USB接口吗?
“电流需求大于500ma”是指带动舵机工作的电流吗?:)

树·水·风 发表于 2012-2-28 16:29:06

本帖最后由 树·水·风 于 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 20:39:58

树·水·风 发表于 2012-2-28 16:29 static/image/common/back.gif
这是我写的,没有用外接电源。效果正常,就是抖动有点厉害,手一触碰电位器,就能感觉舵机的震动,虽然整体 ...

1,有LDO把7-12V降压到9V,接了电池也可以接USB,不影响。
2,USB口是恒定5V电压,外接电源用LDO转换过了。
3,是的,可以用导线接VIN和GND

arduino-tinker 发表于 2012-6-16 23:14:44

求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?

arduino-tinker 发表于 2012-6-16 23:16:39

求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?

弘毅 发表于 2012-6-17 07:51:04

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

yyy_zc 发表于 2012-7-3 14:55:44

舵机能改成驱动轮子的不?
页: [1] 2 3 4
查看完整版本: arduino学习笔记21 - 舵机控制实验