You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino循线机器人红外遥控调速失效问题求助

问题分析

你的代码存在几个核心问题导致红外调速失效:

  • 循线逻辑覆盖调速指令:循线的if语句在红外判断之后执行,每次循环都会强制把电机速度设为固定的175,完全覆盖了红外调速的设置。
  • 无速度状态变量:没有用变量保存当前速度,每次调速都是直接写死数值,无法在循线过程中持续生效。
  • 红外按键逻辑错误:你写的红外触发逻辑里,电机输出完全不符合循线要求(直接停掉左电机,只开右电机),而且没有处理红外按键的重复触发(遥控器长按会发送重复码)。
  • 红外解码状态未持久化:results.value只有在收到新红外信号时才会更新,没有信号时会保留旧值,可能导致误触发。

修正后的代码

#include <IRremote.h>
const int RECV_PIN = A5;
IRrecv irrecv(RECV_PIN);
decode_results results;

int cs;         // CENTER SENSOR
int lmt1 = 5;   // LEFT MOTOR 1
int lmt2 = 3;   // LEFT MOTOR 2
int rmt1 = 6;   // RIGHT MOTOR 1
int rmt2 = 11;  // RIGHT MOTOR 2
int motorSpeed = 175; // 全局速度变量,默认低速
const uint32_t SPEED_UP_CODE = 0xFE58A7; // 加速按键码,根据你的遥控器实际值调整
const uint32_t SPEED_DOWN_CODE = 0xFE10EF; // 减速按键码,示例值,需替换为你的遥控器实际码

void setup() {
  pinMode(8, INPUT);
  pinMode(lmt1, OUTPUT);
  pinMode(lmt2, OUTPUT);
  pinMode(rmt1, OUTPUT);
  pinMode(rmt2, OUTPUT);

  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop() {
  // 先处理红外输入,更新速度
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if (results.value == SPEED_UP_CODE || results.value == 0xFFFFFFFF) { // 0xFFFFFFFF是重复码,对应长按
      motorSpeed = 255; // 切换到高速
    } else if (results.value == SPEED_DOWN_CODE || results.value == 0xFFFFFFFF) {
      motorSpeed = 175; // 切换回低速
    }
    irrecv.resume(); // 准备接收下一个信号
  }

  // 再处理循线逻辑,使用当前速度变量
  cs = digitalRead(8);
  if (cs == LOW) {
    // 左拐(保留原传感器逻辑)
    analogWrite(lmt1, 0);
    analogWrite(lmt2, motorSpeed);
    analogWrite(rmt1, motorSpeed);
    analogWrite(rmt2, 0);
  } else {
    // 右拐(保留原传感器逻辑)
    analogWrite(lmt1, motorSpeed);
    analogWrite(lmt2, 0);
    analogWrite(rmt1, 0);
    analogWrite(rmt2, motorSpeed);
  }
}

关键修改说明

  • 新增全局速度变量:用motorSpeed保存当前速度,循线逻辑直接调用这个变量,确保调速后持续生效。
  • 调整代码顺序:先处理红外输入更新速度,再执行循线逻辑,避免循线指令覆盖调速设置。
  • 处理红外重复码:添加对0xFFFFFFFF的判断,支持遥控器长按切换速度(大部分红外遥控器长按会发送重复码)。
  • 修正电机逻辑:红外调速不再改变循线的转向逻辑,只调整速度值,保证调速时仍保持循线状态。
  • 按键码可配置:把按键码定义为常量,方便你根据串口打印的实际按键值修改。

额外检查点

  • 打开串口监视器,按下红外遥控器按键,确认打印的十六进制码和你定义的SPEED_UP_CODE、SPEED_DOWN_CODE一致,不一致的话替换为实际值。
  • 确认L298N的接线正确,电机引脚连接到Arduino的PWM引脚(你用的5、3、6、11都是PWM引脚,没问题)。
  • 确认红外接收器接线正确,VCC接5V,GND接GND,信号脚接A5。

内容的提问来源于stack exchange,提问作者Shreyas Tandon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:00:59