弘毅 发表于 2011-10-29 15:18:13

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

上次舵机实验比较简单,这次使用串口输入舵机转动角度发送给arduino,arduino控制舵机转动到制定角度。

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

先上硬件连接图





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

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

void loop()
{
if (Serial.available()){      //如果有数据输入.....
    delay(30);                  //等待30毫秒让所有输入数据从串口传输完毕.....
    if (Serial.available() <= 3){ //如果输入数据位数'<=3'.....
      while (Serial.available()){ //开始读取数据直到[串口输入缓存被清空]
      a = Serial.read();   //读取数据到[数组"a"]
      }
      display = 1;                  //数据读取完毕以后'打开'显示输出开关
    }
    else {                        //如果输入数据位数'>3'.....
      Serial.flush();             //刷新串口输入缓存
    }
}
/*======================直接通过串口返回输入数值模块======================
if (display)                  //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
{
    for (i = 0; i <= sizeof(a); i++)
    {
   Serial.print("a[");
   Serial.print(i);
   Serial.print("]= ");
      Serial.print(a);
      Serial.print(" | ");
    }
    Serial.println();
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}
//=======================通过加减符号控制舵机增减一度转动=================*/
if (a == 43 && display){
val++;
servo1.write(val);
Serial.println(val);
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}
if (a == 45 && display){
val--;
servo1.write(val);
Serial.println(val);
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
}

//========================判断及修正输入数据位数模块======================
if (display)                  //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
{
   if (!a){ //如果输入数据为两位数(最后一位空)
   if (!a){ //如果输入数据为一位数(最后两位空)
   a = a;
   a = 48;
   a = 48;
   }
   else {
   a = a;
   a = a;
   a = 48;
   }
   }
//==============转换变量类型后输出给舵机且通过串口返回结果值==============
for (i=0;i<=3;i++){ //变量类型:char to int (48为0的ASCII)
a -= 48;
}
val = 100*a + 10*a + a;
// Serial.print("val: ");
servo1.write(val);
Serial.println(val);

/* int val2 = random(50); //int型变量加法测试
val += val2;
Serial.print("+");
Serial.print(val2);
Serial.print("=");
Serial.println(val);
*/
    display = 0;                  //显示完毕'关闭'显示输出开关
    Serial.flush();               //刷新串口输入缓存
    for (i = 0; i <= 3; i++)      //重置[数组"a"]
    {
      a = 0;
    }
    i = 0;                        //重置"计数变量"
//    val = 0;
}
}点击下图箭头指示按钮,打开串口监视器。



实验效果如下:

http://player.youku.com/player.php/sid/XMzE3MDkwMjEy/v.swf

zhonghua799 发表于 2011-10-29 16:49:55

很好的方法,谢谢分享.

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

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

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


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








三水 发表于 2011-10-29 17:33:02

zhonghua799 发表于 2011-10-29 16:49 static/image/common/back.gif
很好的方法,谢谢分享.

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


期待ing!{:3_46:}

坏鸟 发表于 2011-11-4 15:02:28

视频里为啥不测试一下输入"+"或者"-"的状态捏~?~?

弘毅 发表于 2011-11-4 16:51:00

坏鸟 发表于 2011-11-4 15:02 static/image/common/back.gif
视频里为啥不测试一下输入"+"或者"-"的状态捏~?~?

介个介个。。。。@@

wali 发表于 2011-11-17 10:59:01

期待配套程序

夕阳迷上左脸 发表于 2012-2-28 17:38:06

:lol我还没入门呢,电子加油

codfish 发表于 2012-10-7 22:56:50

mark一下嗯 感觉将来会用到啊啊==

airsus 发表于 2012-10-8 09:54:20

各位高手,想请教大家一个问题。在程序的第19行
a = Serial.read();   //读取数据到[数组"a"]
这句是什么意思啊,因为之前只是给i定义了类型,没有给i初始值啊,是不是i默认为0啊,从0开始递增吗

hk386 发表于 2012-10-11 09:47:57

Serial.flush();   这个不是把数据清除的吗,怎么是积累的   

ttyp 发表于 2012-10-11 10:13:43

airsus 发表于 2012-10-8 09:54 static/image/common/back.gif
各位高手,想请教大家一个问题。在程序的第19行
a = Serial.read();   //读取数据到[数组"a"]
这句是什么 ...

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

咯小3虽 发表于 2013-2-3 15:46:07

为什么按照arduino里的示例,舵机不转,只听到脉冲一样的吱吱声:dizzy:

春泥蛋炒饭 发表于 2013-2-3 16:56:07

如果从IDE的串口监视窗口输入数据,可以使用Serial.parseInt()函数读入输入的数据,这样可以避免用read读入字符然后处理和转换成数字。

tair8022 发表于 2013-3-2 14:00:46

比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿

弘毅 发表于 2013-3-4 20:25:19

tair8022 发表于 2013-3-2 14:00 static/image/common/back.gif
比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿

DV+电脑一起录制。。。然后后期做同步
页: [1] 2 3
查看完整版本: arduino学习笔记23 - 任意输出舵机角度实验