如何为伺服电机创建中断或返回值?

时间:2018-10-07 23:58:00

标签: c++ arduino return

这是令人沮丧的一天,向Arduino tut学习。

我正在设置伺服电机。我解决了为什么无法让它接收数据的问题,现在我通过串行端口读取并转至适当的角度。但是现在看来,每次循环时,它都会尝试将其值重置为0度。我尚未将变量分配为0,而while循环在等待用户输入时应该像中断一样工作。所以我不明白为什么要这么做。

我还尝试返回值pos,以防止在每个循环中更改/重置值,但会不断出现编译错误。我有一个说法是pos返回void。然后,当我尝试将int pos声明为循环内的一种方法并将其余代码嵌套在int方法内时,我得到了另一个。

还有一个有趣的旁注:当您在IDE中启动串行端口窗口时,即使没有输入任何输入,它也会使电机旋转少量。输入给定的输入后,它将达到这些程度,然后如前所述进行重置。

代码:

#include <Servo.h> //Including the Servo code library

int servoPin = 6;
int servoDelay = 25;
int pos;

Servo myPointer; // Create a Servo object called myPointer

void setup() {
  Serial.begin(9600);
  //pinMode (servoPin, OUTPUT);

  myPointer.attach(servoPin);

  Serial.println("Hello");

}

void loop() {    


    Serial.println ("Where would you like the servo to point?");
    while (Serial.available()==0){
    }

    pos = Serial.parseInt();

    Serial.println (pos);

    myPointer.write(pos);
}

伺服器正在使用Arduino上的5V电源供电,并收到OK指令。在通过void setup()运行时,它不会重置位置,因此这必须是导致此问题的循环。我只是不知道为什么或如何解决它。

1 个答案:

答案 0 :(得分:0)

在开始解析消息之前,请确保已收到整个消息。在使用前,请将Serial.setTimeout()(默认值为1s)之间的字符间距设置为较大的值:

Serial.setTimeout(2000);    
while (Serial.available() == 0) {}
duration = Serial.parseInt();

或者如果上述方法不能解决您的所有问题,请在Serial.available()Serial.parseInt()之间添加延迟。

while (Serial.available() == 0) {}
delay(4000);
duration = Serial.parseInt();

Serial.available()将落在接收到的第一个字符上。所以:

  • 设置帧间字符超时将延长解析时间,方法是在每个新字符之后等待以查看是否还会接收到其他字符。
  • 解析之前的延迟将确保在尝试解析消息之前已接收到整个消息。

也可能存在诸如\n\r之类的其他字符来触发解析,但是没有有意义的数据。如果Serial.parseInt()未能转换数字,则返回0。所以:

  • 进行1到360度的范围检查,以捕捉这些情况,而不会丢失很多旋转范围。
  • 检查终端是否附加了\n\r
  • 解析为Serial.flush()后的接收缓冲区为空,以摆脱所有剩余的\n\r字符。