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

Arduino循迹小车完成180度转向后无法返回循迹函数的问题

Arduino循迹小车180度转向无法退出问题解决

问题根源分析

  1. 循环条件逻辑错误:while(countRW <= 27 && countLW <= 27) 意味着只有当两个轮子的编码器计数同时小于等于27时才会继续转向。只要其中一个轮子计数超过27,循环就会停止,导致转向角度不足;如果初始计数未清零,还可能直接跳过转向逻辑。
  2. 递归调用导致逻辑混乱:turnAround 末尾调用 followLine() 会触发递归,而 loop() 本身一直在循环调用 followLine(),这会导致函数栈溢出,转向完成后的流程无法正常回到主循环。
  3. 无中断处理窗口:while 循环内持续执行电机控制代码,没有留出时间让编码器中断服务函数更新计数,可能导致计数器数值不变化,循环无限执行。

修复后的代码实现

修正turnAround函数

void turnAround()
{
  resetCounters(); // 转向开始前先清零计数器,确保从0开始计数
  // 等待两个轮子的编码器计数都达到目标值(27)
  while(countRW < 27 || countLW < 27) {
    printEncoderMesurements();
    // 原地转向电机控制(右轮正转,左轮反转,可根据实际接线调整)
    analogWrite(RWF, 180);
    analogWrite(RWB, 0);
    analogWrite(LWF, 0);
    analogWrite(LWB, 180);
    yield(); // 让出CPU时间,确保编码器中断能正常执行
    delay(10); // 加短延迟,避免循环过于密集
  }
  // 转向完成后停止电机
  analogWrite(RWF, 0);
  analogWrite(RWB, 0);
  analogWrite(LWF, 0);
  analogWrite(LWB, 0);
  // 无需调用followLine,直接返回,主循环会自动再次调用followLine
}

调整核心调用逻辑

去掉turnAround内的followLine()调用后,followLine函数无需修改。转向完成后,turnAround会返回followLine,随后followLine返回loop(),主循环会重新执行makeIRReadings()和followLine(),自动恢复循迹逻辑。

额外检查点

  • 确认编码器中断服务函数正确更新计数:
// 右轮编码器中断服务函数
void rightEncoderISR() {
  countRW++;
}

// 左轮编码器中断服务函数
void leftEncoderISR() {
  countLW++;
}
  • 确认resetCounters()函数正确置零计数:
void resetCounters() {
  noInterrupts(); // 关中断避免计数被篡改
  countRW = 0;
  countLW = 0;
  interrupts(); // 恢复中断
}

核心优化点总结

  • 转向开始前重置计数器,确保计数从0开始
  • 修改循环条件为只要任意一个轮子未达到目标计数就继续转向,保证转向角度准确
  • 移除递归调用,依赖主循环自动恢复循迹逻辑
  • 添加yield()或短延迟,确保编码器中断能正常更新计数
  • 转向完成后停止电机,避免不必要的转动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:56:09