【问题标题】:Servo continuous rotation Arduino Serial伺服连续旋转Arduino串口
【发布时间】:2016-08-09 17:54:32
【问题描述】:

我正在开发一个蓝牙控制的 Arduino 机械臂。 我希望当我发送一个整数时,伺服移动,当我发送另一个整数时,它停止。我在论坛上发现的只是伺服移动到特定位置的系统,但我希望它通过增加角度来真正旋转。 这是我的代码,它不起作用:

#include <Servo.h>

int val;
int angle;
int charsRead;
char buffer[10];
Servo servo;

void setup() {
  Serial.begin(9600);
  servo.attach(6);
  angle = servo.read();
}

void loop() {
    servo.write(170);
    serialCheck();
   if(val == 4021){
       servo.write(angle++);
       delay(50);
       }
      }
      else if(val == 4022){
        servo.write(angle);
        }
        serialCheck();
}

void serialCheck(){
  while(Serial.available() > 0){
    charsRead = Serial.readBytesUntil('\n', buffer, sizeof(buffer) - 1);
    buffer[charsRead] = '\0';
    val = atoi(buffer);
    Serial.println(val);
    }
  }

我使用的应用程序基本上在我长按一个按钮时发送'4021',在我释放它时发送'4022'。

我已经为此工作了几个小时,但我在任何论坛上都没有找到遇到同样问题的人...

请帮忙。

【问题讨论】:

    标签: bluetooth arduino serial-port continuous servo


    【解决方案1】:

    你的问题出在这里:

    void loop() {
        servo.write(170);
    ...
    }
    

    这段代码的作用是在每次循环迭代时将伺服角度设置为 170。由于这种情况每秒会发生数千次,因此它基本上会覆盖通过串行命令引入的任何伺服设置。你应该做的是将servo.write(170); 移动到setup(),在servo.read() 之前,我认为这会产生目前的中间位置,甚至是一些未定义的结果。根据 Arduino 文档,它将:

    读取舵机的当前角度(传给最后一次调用的值 写())。

    顺便说一句:伺服的移动范围有限,因此您应该检查所需的角度是否不超过伺服限制。

    【讨论】:

    • 非常感谢!我在这个项目上工作了一个多月,这是我最后一个要解决的问题!它有效!
    • @HugoTrombert:您可能解决了有关角度变量操作的更多问题。如果您不发送任何内容,则 val 将保持在最后一个值,一遍又一遍地重复先前的移动...
    • @HugoTrombert 我还会使用第二个命令以相反方向旋转伺服。正如datafiddler所说,当你不发送任何东西时,伺服将保持在最后一个位置。
    • @mactro 是的,我刚刚这样做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多