串口控制舵机程序,不能正常旋转啊!求助!
有段时间没写程序了,今天突发奇想,想写个程序控制舵机但是悲剧了!写出来了,下载好了,但是就是不行啊!
串口输入0-9,舵机相应旋转0-180.
但是在串口输入数据后,舵机动一下然后返回去,然后就听到里面吱吱吱的声音了!
求助各位大侠!
#include <Servo.h>
Servo myservo;//定义舵机变量名
void setup()
{
Serial.begin(9600);
myservo.attach(12);//定义舵机接口,9或10
}
void loop()
{
int a = 0;
a = Serial.read();
map(a,0,9,0,180);
myservo.write(a);//设置舵机旋转的角度
Serial.println(a);
delay(100);
} #include <Servo.h>
Servo myservo;//定义舵机变量名
int a = 0;
void setup()
{
Serial.begin(9600);
myservo.attach(12);//定义舵机接口,9或10
}
void loop()
{
if(Serial.available() > 0)
{
a = Serial.read();
map(a,0,9,0,180);
myservo.write(a);//设置舵机旋转的角度
Serial.println(a);
delay(100);
}
}
这样试试,你源程序,每次运行loop的时候,都把 a 赋值为0,那么舵机就要转到0°,所以就回去了! 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;
}
}
页:
[1]