在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: 将串行监视器设置为“无行尾”。它可以在串行监视器的底部找到。像这样:
很高兴为您效劳!
我正在尝试使用 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: 将串行监视器设置为“无行尾”。它可以在串行监视器的底部找到。像这样:
很高兴为您效劳!