带伺服的串行 I/O 功能

Serial I/O functions with Servo

本文关键字:功能 伺服      更新时间:2023-10-16

所以我将伺服电机连接到Arduino上的数字引脚6。我想在串行端口中键入一个数字,并让伺服器旋转到该度数。

我正在尝试制作两个函数,

1) 从 10 到 170 之间的串行端口询问和接收一个号码。如果无效,则要求重新输入。仅在数字良好时返回。

2)接受度数参数,将参数写为伺服度数,打印出状态:"伺服将 x 刻度移动到 y 度。

#include <Servo.h>
Servo myServo;
int deg;
int degree;
int inputDeg;
int ang;
int angle;
int inputAng;
int servoMin = 10;
int servoMax = 175;
int recieveNum(int inputDeg) {
  inputDeg = Serial.parseInt();
  if (inputDeg >= 0 && inputDeg <= 180) {
     Serial.println("You did great!");
     return degree;
  } else {
     Serial.println("Hey! Try giving me a number between 0 and 180 this time.");
  }
 }
int servoTranslate(int inputAng) {
  angle = map(degree, 0, 180, servoMin, servoMax);
  return angle;
}
void setup() {
  Serial.begin(9600);
  myServo.attach(6);
}
void loop() {
  if (Serial.available() == 0) {}
  else {
    recieveNum(deg);
    int finalAng = servoTranslate(degree);
    Serial.print("  Servo moved ");
    Serial.print(degree);
    Serial.print(" tick(s) to ");
    Serial.print(finalAng);
    Serial.println("º");
    myServo.write(finalAng);
  }
}

我对 c++ 仍然很陌生,我认为这可能只是变量混淆的问题。使用指针似乎也是一种选择,但并没有尝试实现这些指针。

这应该适合您:

函数recieveNum应返回指标无效输入-1

int recieveNum(int inputDeg) 
{
  inputDeg = Serial.parseInt();
  if (inputDeg >= 0 && inputDeg <= 180) {
    Serial.println("You did great!");
    return degree;
  } else {
    Serial.println("Hey! Try giving me a number between 0 and 180 this time.");
  }
  return -1; 
  ^^^^^^^^^
}
void loop() 
{
  if (Serial.available() != 0) 
  {
     if(-1 != recieveNum(deg))
     { // Valid 'deg'
       int finalAng = servoTranslate(degree);
       Serial.print("  Servo moved ");
       Serial.print(degree);
       Serial.print(" tick(s) to ");
       Serial.print(finalAng);
       Serial.println("º");
     }
  } 
  myServo.write(finalAng);
}