1. 智能循迹小车的基础搭建
第一次做智能小车时,我对着满地零件发愁——电机、轮子、电路板散落一地,就像乐高缺了说明书。其实核心就三部分:STC89C52单片机是大脑,L298N是肌肉,红外传感器是眼睛。先说最关键的硬件选型:
- 单片机:STC89C52RC性价比超高,8K Flash够存复杂逻辑,关键是淘宝5块钱包邮。我试过用Arduino,但比赛现场看到清一色的51单片机,就知道老将依然能打。
- 电机驱动:L298N模块自带散热片,双H桥能同时驱动两个电机正反转。注意它的供电逻辑:12V口接锂电池(我用三节18650串联),5V输出口可以给单片机供电(记得共地!)。
- 传感器:TCRT5000红外模块最实用,DO数字输出直接接单片机IO口。建议买五路模块,中间三路密集排列应对直道,两侧放宽检测急弯。
组装时有个坑:电机固定螺丝千万别装反!我有次螺帽朝外,轮子转半圈就卡死。后来学乖了——先用吹风机加热贴纸,螺丝刀顶住内侧螺帽慢慢拧。接线时按这个顺序最稳:
- 电池正极→L298N的12V输入
- L298N的5V输出→单片机VCC
- 所有GND用杜邦线连成共地
- IN1~IN4接P1.0~P1.3(后面PWM调速要用)
// 电机控制极简代码示例 sbit IN1 = P1^0; // 左电机正转 sbit IN2 = P1^1; // 左电机反转 void main() { IN1 = 1; IN2 = 0; // 左轮前进 while(1); }2. 红外循迹的实战逻辑设计
五路红外怎么排布直接影响循迹效果。我的血泪史:最初按等距排列,结果小车在弯道蛇形走位。后来改成"中三密两侧疏"布局(中间三个间距1cm,两侧间隔2cm),稳定性立竿见影。
传感器状态判断有讲究:
- 黑线检测:TCRT5000遇到黑线输出高电平(实际可能相反,用万用表测最靠谱)
- 抗干扰技巧:在传感器探头周围贴一圈黑色电工胶带,防止环境光干扰
这段代码实现了基础循迹逻辑:
if(mid==1 && left_1==0 && right_1==0) go_forward(); // 直行 else if(left_1==1) turn_left(30); // 左微调 else if(right_1==1) turn_right(30); // 右微调遇到十字路口怎么办?我试过延时刹车,但惯性会导致过冲。后来改用状态标志位:
if(所有传感器==1) open=0; // 停车 while(传感器不全为1) open=1; // 继续前进实测小车会在路口"顿一下"自然通过,比硬刹车流畅得多。
3. L298N的进阶驱动技巧
新手常犯的错——直接给IN1/IN2高低电平让电机全速转动,结果小车起步像火箭,撞墙刹不住。后来改用PWM调速,速度控制瞬间丝滑:
- 定时器配置:用T0定时器生成PWM波
TMOD |= 0x01; // 16位定时器模式 TH0 = 0xFC; // 1ms中断 TL0 = 0x18; ET0 = 1; EA = 1; TR0 = 1;- 中断服务程序:
void Timer0() interrupt 1 { static uchar pwm_count = 0; TH0 = 0xFC; // 重装初值 pwm_count++; if(pwm_count >= 100) pwm_count = 0; if(pwm_count < left_speed) IN1=1,IN2=0; else IN1=IN2=0; // 左电机PWM }- 差速转向优化: 直角弯时单纯反转一侧电机容易卡顿。我的方案是内外轮不同速:
void sharp_turn_left() { left_speed = 30; // 内轮低速 right_speed = 70; // 外轮高速 }4. 系统优化与故障排查
调试时最抓狂的是小车"抽风式"循迹,可能的原因和解决方案:
传感器问题:
- 现象:误检测白线为黑线
- 解决:调节TCRT5000上的蓝色电位器,用螺丝刀边调边观察DO指示灯
电源问题:
- 现象:电机启动时单片机复位
- 解决:给单片机单独供电,或在L298N的12V输入并联470μF电容
机械问题:
- 现象:小车走偏但传感器正常
- 解决:用手机水平仪调平底盘,轮子打滑可缠一圈电工胶带增大摩擦
代码优化技巧:
- 状态机管理:将直行、转弯、停车等状态用枚举变量管理
- 加入死区保护:电机换向时先延时5ms再反转,避免H桥短路
- 速度渐变:突然变速会导致车轮打滑,用for循环逐步调整PWM占空比
最后分享一个调试神器:在关键变量处添加串口打印,比如:
printf("L1:%d M:%d R1:%d\n", left_1, mid, right_1);配合蓝牙模块或USB转TTL,就能在手机上看实时传感器数据。