极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14312|回复: 2

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

[复制链接]
发表于 2012-11-5 11:10:24 | 显示全部楼层 |阅读模式
有段时间没写程序了,今天突发奇想,想写个程序控制舵机
但是悲剧了!写出来了,下载好了,但是就是不行啊!
串口输入0-9,舵机相应旋转0-180.
但是在串口输入数据后,舵机动一下然后返回去,然后就听到里面吱吱吱的声音了!
求助各位大侠!
  1. #include <Servo.h>
  2. Servo myservo;//定义舵机变量名
  3. void setup()
  4. {
  5.   Serial.begin(9600);
  6.   myservo.attach(12);//定义舵机接口,9或10
  7. }
  8. void loop()
  9. {
  10.   int a = 0;
  11.   a = Serial.read();
  12.   map(a,0,9,0,180);
  13.   myservo.write(a);//设置舵机旋转的角度
  14.   Serial.println(a);
  15.   delay(100);
  16. }
复制代码
回复

使用道具 举报

发表于 2012-11-5 19:33:45 | 显示全部楼层
  1. #include <Servo.h>
  2. Servo myservo;//定义舵机变量名
  3. int a = 0;

  4. void setup()
  5. {
  6.   Serial.begin(9600);
  7.   myservo.attach(12);//定义舵机接口,9或10
  8. }
  9. void loop()
  10. {
  11.   if(Serial.available() > 0)  
  12.   {
  13.     a = Serial.read();
  14.     map(a,0,9,0,180);
  15.     myservo.write(a);//设置舵机旋转的角度
  16.     Serial.println(a);
  17.     delay(100);
  18.   }
  19. }
复制代码
这样试试,你源程序,每次运行loop的时候,都把 a 赋值为0,那么舵机就要转到0°,所以就回去了!
回复 支持 反对

使用道具 举报

发表于 2016-4-16 10:44:14 | 显示全部楼层
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;
  }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-18 14:44 , Processed in 0.039395 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表