You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Arduino Mega 2560串口控制360度舵机通信异常问题求助

解决Arduino串口控制360舵机的异常问题

我来帮你拆解下问题根源,以及给出对应的解决方案:

核心问题分析

你遇到的异常是因为串口读取的是字符的ASCII码值,不是你实际想要的数字。比如你发送字符1,它对应的ASCII编码是49,而串口助手默认会附带换行符(ASCII编码10),所以你看到了--> 49 --> 10的输出。直接把这个ASCII值传给servo1.writeMicroseconds(),相当于让舵机执行49微秒的指令,这完全不符合你需要的1000/1500/2000微秒的控制逻辑。

另外,你的代码里在loop()中重新定义了局部变量int val,虽然这里不会导致严重问题,但会覆盖全局的val变量,建议统一变量作用域。

解决方案1:直接读取整数值(推荐)

使用Serial.parseInt()来读取串口输入的完整数字,它会自动忽略非数字字符(比如换行、回车),直到读取到完整的数值。修改后的代码如下:

#include <Servo.h>
Servo servo1;
int val = 1500; // 全局变量,默认舵机停止

void setup() {
  servo1.attach(7);
  servo1.writeMicroseconds(val);
  Serial.begin(9600);
  Serial.println("Ready to receive commands: send 1000, 1500, or 2000");
}

void loop(){
  if(Serial.available()){
    // 读取串口传来的整数值
    int inputVal = Serial.parseInt();
    // 仅处理有效数字(避免空输入或非数字字符)
    if(inputVal != 0){
      val = inputVal;
      Serial.print("Received value: ");
      Serial.println(val);
      servo1.writeMicroseconds(val);
    }
  }
}

使用说明

现在你可以直接在串口助手中发送1000(顺时针转)、1500(停止)、2000(逆时针转),Arduino会正确识别并控制舵机。

解决方案2:简化指令映射(适合快速调试)

如果你不想输入长数字,也可以把单个字符映射到对应的舵机指令,比如发送1对应1000,2对应1500,3对应2000:

#include <Servo.h>
Servo servo1;
int val = 1500;

void setup() {
  servo1.attach(7);
  servo1.writeMicroseconds(val);
  Serial.begin(9600);
  Serial.println("Ready to receive commands: send 1(clockwise), 2(stop), 3(counter-clockwise)");
}

void loop(){
  if(Serial.available()){
    char inputChar = Serial.read();
    // 过滤掉换行和回车符,避免误触发
    if(inputChar == '\n' || inputChar == '\r') return;

    // 根据输入字符映射到舵机指令
    switch(inputChar){
      case '1':
        val = 1000;
        break;
      case '2':
        val = 1500;
        break;
      case '3':
        val = 2000;
        break;
      default:
        Serial.println("Invalid command! Please send 1, 2, or 3.");
        return;
    }

    Serial.print("Set servo to: ");
    Serial.println(val);
    servo1.writeMicroseconds(val);
  }
}

这样调试时只需要发送单个字符,操作更便捷。

内容的提问来源于stack exchange,提问作者Vagish Sivaramakrishnan

火山引擎 最新活动