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 很好的方法,谢谢分享.
我想用arduino做个舵机测试仪, 类似Hitec HFP-20 .
再用VB串口编个小程序,搞个滚动条来控制舵机, 即可以通过串口PC来控制,也可以单独用.
?
如果我要用500~2500us来控制的话,程序就不能用<Servo.h>, a也得换成a.
:P要学 1602及按键菜单... ...
zhonghua799 发表于 2011-10-29 16:49 static/image/common/back.gif
很好的方法,谢谢分享.
我想用arduino做个舵机测试仪, 类似Hitec HFP-20 .
期待ing!{:3_46:} 视频里为啥不测试一下输入"+"或者"-"的状态捏~?~? 坏鸟 发表于 2011-11-4 15:02 static/image/common/back.gif
视频里为啥不测试一下输入"+"或者"-"的状态捏~?~?
介个介个。。。。@@ 期待配套程序 :lol我还没入门呢,电子加油 mark一下嗯 感觉将来会用到啊啊== 各位高手,想请教大家一个问题。在程序的第19行
a = Serial.read(); //读取数据到[数组"a"]
这句是什么意思啊,因为之前只是给i定义了类型,没有给i初始值啊,是不是i默认为0啊,从0开始递增吗 Serial.flush(); 这个不是把数据清除的吗,怎么是积累的 airsus 发表于 2012-10-8 09:54 static/image/common/back.gif
各位高手,想请教大家一个问题。在程序的第19行
a = Serial.read(); //读取数据到[数组"a"]
这句是什么 ...
对,int类型默认值是0,很多类型都有默认值的,建议翻翻c的基础书籍 为什么按照arduino里的示例,舵机不转,只听到脉冲一样的吱吱声:dizzy: 如果从IDE的串口监视窗口输入数据,可以使用Serial.parseInt()函数读入输入的数据,这样可以避免用read读入字符然后处理和转换成数字。 比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿 tair8022 发表于 2013-3-2 14:00 static/image/common/back.gif
比較想知道這影片怎麼錄的阿、怎麼有辦法同時錄電腦的根舵機阿
DV+电脑一起录制。。。然后后期做同步