Arduino循迹小车完成180度转向后无法返回循迹函数的问题
Arduino循迹小车180度转向无法退出问题解决
问题根源分析
- 循环条件逻辑错误:
while(countRW <= 27 && countLW <= 27)意味着只有当两个轮子的编码器计数同时小于等于27时才会继续转向。只要其中一个轮子计数超过27,循环就会停止,导致转向角度不足;如果初始计数未清零,还可能直接跳过转向逻辑。 - 递归调用导致逻辑混乱:
turnAround末尾调用followLine()会触发递归,而loop()本身一直在循环调用followLine(),这会导致函数栈溢出,转向完成后的流程无法正常回到主循环。 - 无中断处理窗口:
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
相关产品推荐
相关产品推荐

