arduino教程系列23-任意输出舵机角度实验 笔记,学习
上次舵机实验比较简单,这次使用串口输入舵机转动角度发送给arduino,arduino控制舵机转动到制定角度。
本次实验的器材非常简单,arduino控制板一个,标准舵机一个,电池盒(外接电源)一个。(一定要使用外接电源,直接使用USB供电,有烧毁USB的危险。)
先上硬件连接图
2011-10-29 15:03 上传
(63.5 KB)
2011-10-29 15:03 上传
(176.65 KB)
然后把下面代码编译,下载进入arduino控制板中。(感谢坏鸟童鞋提供的代码)ARDUINO
int i,val;
char a[3];
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[i++] = 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[i]);
Serial.print(" | ");
}
Serial.println();
display = 0; //显示完毕'关闭'显示输出开关
Serial.flush(); //刷新串口输入缓存
for (i = 0; i <= 3; i++) //重置[数组"a"]
{
a[i] = 0;
}
i = 0; //重置"计数变量"[i]
}
//=======================通过加减符号控制舵机增减一度转动=================*/
if (a[0] == 43 && display){
val++;
servo1.write(val);
Serial.println(val);
display = 0; //显示完毕'关闭'显示输出开关
Serial.flush(); //刷新串口输入缓存
for (i = 0; i <= 3; i++) //重置[数组"a"]
{
a[i] = 0;
}
i = 0; //重置"计数变量"[i]
}
if (a[0] == 45 && display){
val--;
servo1.write(val);
Serial.println(val);
display = 0; //显示完毕'关闭'显示输出开关
Serial.flush(); //刷新串口输入缓存
for (i = 0; i <= 3; i++) //重置[数组"a"]
{
a[i] = 0;
}
i = 0; //重置"计数变量"[i]
}
//========================判断及修正输入数据位数模块======================
if (display) //如果[显示输出开关]被'打开'则显示[数组"a"]的数据
{
if (!a[2]){ //如果输入数据为两位数(最后一位空)
if (!a[1]){ //如果输入数据为一位数(最后两位空)
a[2] = a[0];
a[1] = 48;
a[0] = 48;
}
else {
a[2] = a[1];
a[1] = a[0];
a[0] = 48;
}
}
//==============转换变量类型后输出给舵机且通过串口返回结果值==============
for (i=0;i<=3;i++){ //变量类型:char to int (48为0的ASCII)
a[i] -= 48;
}
val = 100*a[0] + 10*a[1] + a[2];
// 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[i] = 0;
}
i = 0; //重置"计数变量"[i]
// val = 0;
}
}
点击下图箭头指示按钮,打开串口监视器。
实验效果如下: