极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 115233|回复: 34

arduino学习笔记23 - 任意输出舵机角度实验

  [复制链接]
发表于 2011-10-29 15:18:13 | 显示全部楼层 |阅读模式
上次舵机实验比较简单,这次使用串口输入舵机转动角度发送给arduino,arduino控制舵机转动到制定角度。

本次实验的器材非常简单,arduino控制板一个,标准舵机一个,电池盒(外接电源)一个。(一定要使用外接电源,直接使用USB供电,有烧毁USB的危险。

先上硬件连接图






然后把下面代码编译,下载进入arduino控制板中。(感谢坏鸟童鞋提供的代码)
  1. int i,val;
  2. char a[3];
  3. boolean display;
  4. #include <Servo.h>
  5. Servo servo1;

  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9.   servo1.attach(4);//舵機一接pin4
  10. }

  11. void loop()
  12. {
  13.   if (Serial.available()){        //如果有数据输入.....
  14.     delay(30);                    //等待30毫秒让所有输入数据从串口传输完毕.....
  15.     if (Serial.available() <= 3){ //如果输入数据位数'<=3'.....
  16.       while (Serial.available()){ //开始读取数据直到[串口输入缓存被清空]
  17.         a[i++] = Serial.read();   //读取数据到[数组"a"]
  18.       }
  19.       display = 1;                    //数据读取完毕以后'打开'显示输出开关
  20.     }
  21.     else {                        //如果输入数据位数'>3'.....
  22.       Serial.flush();             //刷新串口输入缓存
  23.     }
  24.   }
  25. /*======================直接通过串口返回输入数值模块======================
  26.   if (display)                    //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
  27.   {
  28.     for (i = 0; i <= sizeof(a); i++)
  29.     {
  30.      Serial.print("a[");
  31.      Serial.print(i);
  32.      Serial.print("]= ");
  33.       Serial.print(a[i]);
  34.       Serial.print(" | ");
  35.     }
  36.     Serial.println();
  37.     display = 0;                  //显示完毕'关闭'显示输出开关
  38.     Serial.flush();               //刷新串口输入缓存
  39.     for (i = 0; i <= 3; i++)      //重置[数组"a"]
  40.     {
  41.       a[i] = 0;
  42.     }
  43.     i = 0;                        //重置"计数变量"[i]
  44.   }
  45. //=======================通过加减符号控制舵机增减一度转动=================*/
  46. if (a[0] == 43 && display){
  47. val++;
  48. servo1.write(val);
  49. Serial.println(val);
  50.     display = 0;                  //显示完毕'关闭'显示输出开关
  51.     Serial.flush();               //刷新串口输入缓存
  52.     for (i = 0; i <= 3; i++)      //重置[数组"a"]
  53.     {
  54.       a[i] = 0;
  55.     }
  56.     i = 0;                        //重置"计数变量"[i]
  57. }
  58. if (a[0] == 45 && display){
  59. val--;
  60. servo1.write(val);
  61. Serial.println(val);
  62.     display = 0;                  //显示完毕'关闭'显示输出开关
  63.     Serial.flush();               //刷新串口输入缓存
  64.     for (i = 0; i <= 3; i++)      //重置[数组"a"]
  65.     {
  66.       a[i] = 0;
  67.     }
  68.     i = 0;                        //重置"计数变量"[i]
  69. }

  70. //========================判断及修正输入数据位数模块======================
  71. if (display)                    //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
  72.   {
  73.    if (!a[2]){ //如果输入数据为两位数(最后一位空)
  74.    if (!a[1]){ //如果输入数据为一位数(最后两位空)
  75.    a[2] = a[0];
  76.    a[1] = 48;
  77.    a[0] = 48;
  78.    }
  79.    else {
  80.    a[2] = a[1];
  81.    a[1] = a[0];
  82.    a[0] = 48;
  83.    }
  84.    }
  85. //==============转换变量类型后输出给舵机且通过串口返回结果值==============
  86. for (i=0;i<=3;i++){ //变量类型:char to int (48为0的ASCII)
  87. a[i] -= 48;
  88. }
  89. val = 100*a[0] + 10*a[1] + a[2];
  90. // Serial.print("val: ");
  91. servo1.write(val);
  92. Serial.println(val);

  93. /* int val2 = random(50); //int型变量加法测试
  94. val += val2;
  95. Serial.print("+");
  96. Serial.print(val2);
  97. Serial.print("=");
  98. Serial.println(val);
  99. */
  100.     display = 0;                  //显示完毕'关闭'显示输出开关
  101.     Serial.flush();               //刷新串口输入缓存
  102.     for (i = 0; i <= 3; i++)      //重置[数组"a"]
  103.     {
  104.       a[i] = 0;
  105.     }
  106.     i = 0;                        //重置"计数变量"[i]
  107. //    val = 0;
  108. }
  109. }
复制代码
点击下图箭头指示按钮,打开串口监视器。



实验效果如下:

本帖子中包含更多资源

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

x

评分

参与人数 2 +6 收起 理由
幻生幻灭 + 3 支持! 我的舵机已经在路上了,先热热身
三水 + 3 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2011-10-29 16:49:55 | 显示全部楼层
很好的方法,谢谢分享.

我想用arduino做个舵机测试仪, 类似Hitec HFP-20 .

再用VB串口编个小程序,搞个滚动条来控制舵机, 即可以通过串口PC来控制,也可以单独用.

?
如果我要用500~2500us来控制的话,  程序就不能用<Servo.h>, a[3]也得换成a[4].


要学 1602及按键菜单... ...








回复 支持 反对

使用道具 举报

发表于 2011-10-29 17:33:02 | 显示全部楼层
zhonghua799 发表于 2011-10-29 16:49
很好的方法,谢谢分享.

我想用arduino做个舵机测试仪, 类似Hitec HFP-20 .

期待ing!{:3_46:}
回复 支持 反对

使用道具 举报

发表于 2011-11-4 15:02:28 | 显示全部楼层
视频里为啥不测试一下输入"+"或者"-"的状态捏~?~?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-4 16:51:00 | 显示全部楼层
坏鸟 发表于 2011-11-4 15:02
视频里为啥不测试一下输入"+"或者"-"的状态捏~?~?


介个介个。。。。@@
回复 支持 反对

使用道具 举报

发表于 2011-11-17 10:59:01 | 显示全部楼层
期待配套程序
回复 支持 反对

使用道具 举报

发表于 2012-2-28 17:38:06 | 显示全部楼层
我还没入门呢,电子加油
回复 支持 反对

使用道具 举报

发表于 2012-10-7 22:56:50 | 显示全部楼层
mark一下嗯 感觉将来会用到啊啊==
回复 支持 反对

使用道具 举报

发表于 2012-10-8 09:54:20 | 显示全部楼层
各位高手,想请教大家一个问题。在程序的第19行
a[i++] = Serial.read();   //读取数据到[数组"a"]
这句是什么意思啊,因为之前只是给i定义了类型,没有给i初始值啊,是不是i默认为0啊,从0开始递增吗
回复 支持 反对

使用道具 举报

发表于 2012-10-11 09:47:57 | 显示全部楼层
Serial.flush();     这个不是把数据清除的吗,怎么是积累的   
回复 支持 反对

使用道具 举报

发表于 2012-10-11 10:13:43 | 显示全部楼层
airsus 发表于 2012-10-8 09:54
各位高手,想请教大家一个问题。在程序的第19行
a = Serial.read();   //读取数据到[数组"a"]
这句是什么 ...

对,int类型默认值是0,很多类型都有默认值的,建议翻翻c的基础书籍
回复 支持 反对

使用道具 举报

发表于 2013-2-3 15:46:07 | 显示全部楼层
为什么按照arduino里的示例,舵机不转,只听到脉冲一样的吱吱声
回复 支持 反对

使用道具 举报

发表于 2013-2-3 16:56:07 | 显示全部楼层
如果从IDE的串口监视窗口输入数据,可以使用Serial.parseInt()函数读入输入的数据,这样可以避免用read读入字符然后处理和转换成数字。
回复 支持 反对

使用道具 举报

发表于 2013-3-2 14:00:46 | 显示全部楼层
比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-4 20:25:19 | 显示全部楼层
tair8022 发表于 2013-3-2 14:00
比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿

DV+电脑一起录制。。。然后后期做同步
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 22:14 , Processed in 0.055424 second(s), 37 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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