繁体   English   中英

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

[英]how to create an interrupt or return value for servo motor?

从 Arduino tuts 那里学习是令人沮丧的一天。

我正在设置伺服电机。 我解决了为什么我无法让它接收数据的问题,现在我通过串行端口读取并转向适当的角度。 但是现在似乎每次循环时它都会尝试将其值重置为 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 电源并接收指令正常。 它在通过 void setup() 运行时不会重置位置,因此这一定是导致此问题的循环。 我只是不知道为什么或如何解决它。

在开始解析消息之前,您已确保接收到整个消息。 在使用前将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字符后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM