在Arduino中通过串行控制伺服

controlling servo via serial in Arduino

我正在尝试使用 Arduino 串行控制我的伺服系统。发生的事情是在终端中给出位置值后,伺服成功地变为该值,但之后我的代码在没有任何输入的情况下占用零并且伺服变为零。我的舵机没有保持原位。我无法理解为什么每次输入一个值后它都占零,请帮助。

查看我的代码。

#include<Servo.h>
Servo myServo;
int pos;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  myServo.attach(9);
  myServo.write(0);
}

void loop() {
  Serial.println("enter position: ");    
  while (Serial.available()==0){}          
  pos = Serial.parseInt(); 
  if(pos>=0&&pos<=180){
     myServo.write(pos);
     Serial.print("Turned to ");                   
     Serial.println(pos);
     Serial.flush();               
     }
     else Serial.println("invalid position");
  }

结果

您遇到这个问题的原因:

你没有犯错。当读取非数字字符时,parseInt() 函数 returns 0 本身。你可能认为你只是输入整数,那么非数字从哪里来呢?但是串行监视器中的每个输入最后都有一个“回车return”或“换行”。这就是为什么 parseInt() returns 0.

解决方法是什么?

我给你两个解决问题的办法。他们每个人都有效。

解决方案 1: 使用 parseInt() 的替代方法,例如 Serial.readString().toInt()。这是相关代码:

#include <Servo.h>
Servo myServo;
int pos;
void setup() {
  Serial.begin(9600);
  myServo.attach(9);
  myServo.write(0);
}
void loop() {
  Serial.println("Enter position: ");
  while(Serial.available() == 0){};
  pos = Serial.readString().toInt();
  if (pos >= 0 && pos <= 180){
    myServo.write(pos);
    Serial.print("Turned to: ");
    Serial.println(pos);
  }
  else {
    Serial.println("Invalid postition!");
  }
}

解决方案 2: 将串行监视器设置为“无行尾”。它可以在串行监视器的底部找到。像这样:

很高兴为您效劳!