我也玩循迹小车

    上周和机电的同学组队参加了学校的“伊顿杯”,我们做的题目就是循迹小车。一周的时间搞定全部,到后面时间上确实感觉有点仓促,不过最后还好作品做出来了 大笑 。好了,不多说,进入今天的主题:记录做车的过程。

    先把元件的清单列一下吧:STC89C52、红外循迹模块(如下图)、L298N电机驱动模块(可提供5V电源)、电池使用两节3.7V(一节6800mAH)串联供电,两个减速直流电机,一个万向轮。大概就这样了,小车可以说是模块拼起来的,难就难在程序的调试。

    粗略说明一下红外模块的工作原理咯。模块里面用到的主要器件是LM339集成运放,里面集成了4个同样的运放。每个运放和外部构成的电路如下图。从电路图可以知道运放的接法是同相放大,电压增益可以根据运放的虚短虚断特点算得:Av=1+R3/R2。电路图左侧的是红外对管,接收管接收到发射管反射回来的红外光线就会导通,阻值减小,相反,没有接收到红外光时阻值很大几乎不导通。因此可以通过改变可调电阻RES3和红外接收管的阻值比例来调节运放正向输入端的电压值,从而实现灵敏度的调节。模块的原理不难理解,基本都是模电的基础知识,所以就讲这么多。

    电机驱动模块L298N的使用也很简单,4个电机正反转控制信号输入端,4个电机控制输出端,2个使能端,其他的就是电源的输入和输出端。每组正反转信号控制端输入为(0,0)时电机是不动的,占空比PWM通过使能端来实现控制,最好是用单片机的定时器中断来实现。电机的转速的均匀与否由PWM的频率决定。个人觉得单纯文字讲这些有点空洞,看看代码就一目了然了。

void PWM_Timer0(void) interrupt 1  
{
	TH0 = (65536-1000)/256;
	TL0 = (65536-1000)%256;
	
	if(Timer0_num == 0)
	{
		L_Now = L_Speed;
		R_Now = R_Speed;	
	}
	
	if(Timer0_num<L_Now) 
       PWM_Left=1; 
    else 
       PWM_Left=0;
    
    if(Timer0_num<R_Now)
       PWM_Right=1;
    else 
       PWM_Right=0;
 
    Timer0_num++;     
    if(Timer0_num>=50)
    Timer0_num = 0;
}

其中L_Speed和R_Speed是全局变量,是自己想要调的速度。



接着给一张比赛时候的循迹路线图:


图中示意的红线是到时候比赛要求小车要走的黑线路迹,右边的蓝色示意线是干扰线,也是用同样的黑线做成的。

一开始同学查了一些资料后没有考虑寻迹线宽就直接在车的前端的平面车架上用钻机开了四个排成一字的孔用来安装4个红外传感器。装上去之后调试程序时各种不行,总体反应就是小车的行走偏差太大,歪来歪去的,很难综合运用到红外对管采集回来的数据。

硬件和循迹路线很难兼容,想要进行软件调试是一件非常难和痛苦的事情。所以遇到这个问题时果断放下软件先,先要把传感器的安装最佳位置确定下来。经过讨论决定使用3个红外对管,排列方式是,一对在车头中间,另外两对在两边对称位置排放,距离中间那对红外对管的距离略大于16mm(因为循迹线宽就是16mm),太宽了,小车容易歪来歪去,太窄了就会错误处理红外对管采集回来的数据的情况。

对十字路口的处理和干扰线的识别就是这次的难点了。处理十字路口时我是让小车的传感器调整到一个确定情况的位置后再采取下一步行动,识别障碍线是由变量标记的方法来实现。说的有点抽象,具体怎样通过代码来体会就是再好不过的了。如果感兴趣可以跟我要代码。

前段时间玩ARM9,估计有一个多学期没有玩51了,现在再玩玩好有亲切感啊。就写到这里,哈哈,算是记录一点比赛的过程吧。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值