hp198969 发表于 2012-11-5 11:10:24

串口控制舵机程序,不能正常旋转啊!求助!

有段时间没写程序了,今天突发奇想,想写个程序控制舵机
但是悲剧了!写出来了,下载好了,但是就是不行啊!
串口输入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);
}

绿林网页 发表于 2012-11-5 19:33:45

#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°,所以就回去了!

1697884655 发表于 2016-4-16 10:44:14

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]
查看完整版本: 串口控制舵机程序,不能正常旋转啊!求助!