极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 147569|回复: 59

arduino学习笔记21 - 舵机控制实验

  [复制链接]
发表于 2011-10-9 21:35:07 | 显示全部楼层 |阅读模式
本帖最后由 董董soul 于 2017-2-15 11:52 编辑

舵机是什么这里就不详细介绍了,详情请看论坛里《舵机详解》帖子

这里使用arduino duemilanove通过电位器控制一个舵机转动

使用原件:
arduino duemilanove一块
10K电位器一个
舵机一个
面包板一个
面包板连接线若干

这里要注意,不要使用电脑usb供电,因为如果电流需求大于500ma,会有烧毁usb的可能,推荐使用电池外置供电。

电位器左右两脚分别接3.3V和GND,中间接模拟口0。
舵机接5V和GND,信号口接数字7号口。

先上硬件连接图






把下面代码下载进入arduino,然后再进行线路连接,运行时一定要使用电池供电。
  1. int readPin = 0;   //用来连接电位器
  2. int servopin = 7;    //定义舵机接口数字接口7

  3. void servopulse(int angle)//定义一个脉冲函数
  4. {
  5.   int pulsewidth=(angle*11)+500;  //将角度转化为500-2480的脉宽值
  6.   digitalWrite(servopin,HIGH);    //将舵机接口电平至高
  7.   delayMicroseconds(pulsewidth);  //延时脉宽值的微秒数
  8.   digitalWrite(servopin,LOW);     //将舵机接口电平至低
  9.   delayMicroseconds(20000-pulsewidth);
  10. }

  11. void setup()
  12. {
  13.   pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
  14. }

  15. void loop()
  16. {
  17.   //读取电位器(传感器)的读数,接到3.3V,值范围从0到660左右
  18.   int readValue = analogRead(readPin);
  19.   //把值的范围映射到0到165左右
  20.   int angle = readValue / 4;
  21.   //发送50个脉冲
  22.   for(int i=0;i<50;i++)
  23.   {
  24.     //引用脉冲函数
  25.     servopulse(angle);
  26.   }
  27. }
复制代码
下面是实验效果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-7-29 12:24:29 | 显示全部楼层
Valyrian 发表于 2015-7-29 10:32
我觉得是把一个周期走完

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

使用道具 举报

发表于 2014-6-15 21:48:00 | 显示全部楼层
HLX 发表于 2013-3-21 23:35
为什么要将角度转化为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度——即电位器点位最高的电平的旋转角度

不知道是否正确?
回复 支持 1 反对 0

使用道具 举报

发表于 2011-10-19 22:13:25 | 显示全部楼层
如果我使用的是MAP函数呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-10-19 22:37:47 | 显示全部楼层
ck59505 发表于 2011-10-19 22:13
如果我使用的是MAP函数呢

map函数?map是啥。。。。。
回复 支持 反对

使用道具 举报

发表于 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
这是我们老师说的,比如。。这样,用的是9号口
   

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

使用道具 举报

发表于 2011-12-2 13:49:02 | 显示全部楼层
map函数在20版本里面有哦,控制电机精度很准,就是里面的延时时间好像有点长,稍微改一下,效果很好。
回复 支持 反对

使用道具 举报

发表于 2011-12-7 23:10:24 | 显示全部楼层
弘毅 发表于 2011-10-19 22:37
map函数?map是啥。。。。。

为啥我的舵机抖个不停呢,而且电位器控制不了··
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-8 11:30:06 | 显示全部楼层
回复地方 发表于 2011-12-7 23:10
为啥我的舵机抖个不停呢,而且电位器控制不了··

有外部供电嘛,不要用usb供电
回复 支持 反对

使用道具 举报

发表于 2012-2-28 15:57:09 | 显示全部楼层
弘毅 发表于 2011-12-8 11:30
有外部供电嘛,不要用usb供电

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

使用道具 举报

发表于 2012-2-28 16:29:06 | 显示全部楼层
本帖最后由 树·水·风 于 2012-2-28 16:31 编辑
弘毅 发表于 2011-10-20 20:25
哦,这段代码是使用Servo库,map函数确实不错,使用后的程序很简练。我看了下官网的,这段程序是官网的程 ...
  1. #include <Servo.h>

  2. const int pinPotentiometer = 5;
  3. const int pinServo = 3;
  4. Servo servo;
  5. int value;
  6. int angle;

  7. void setup(){
  8.   servo.attach(pinServo);
  9.   Serial.begin(9600);
  10. }

  11. void loop(){
  12.   value = analogRead(pinPotentiometer);
  13.   Serial.println(value);
  14.   angle = value / 4;
  15.   servo.write(angle);
  16.   delay(10);
  17. }
复制代码
这是我写的,没有用外接电源。效果正常,就是抖动有点厉害,手一触碰电位器,就能感觉舵机的震动,虽然整体角度不变。下一步打算找办法消除抖动。
我不明白的是以下几个问题:
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
这是我写的,没有用外接电源。效果正常,就是抖动有点厉害,手一触碰电位器,就能感觉舵机的震动,虽然整体 ...

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

使用道具 举报

发表于 2012-6-16 23:14:44 | 显示全部楼层
求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?
回复 支持 反对

使用道具 举报

发表于 2012-6-16 23:16:39 | 显示全部楼层
求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-17 07:51:04 | 显示全部楼层
arduino-tinker 发表于 2012-6-16 23:16
求解,使用servo库的话,好像只能用9、10两个端口吧?怎么可以控制更多的舵机?

用软PWM来进行控制,可以参考这篇帖子
http://www.geek-workshop.com/forum.php?mod=viewthread&tid=125
回复 支持 反对

使用道具 举报

发表于 2012-7-3 14:55:44 | 显示全部楼层
舵机能改成驱动轮子的不?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 20:04 , Processed in 0.062532 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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