平台后退,当形参为3时;则控制左轮后退、右轮前进,运动平台左转;当形参为4时,则控制左轮前进、右轮后退,运动平台右转。
子程序入口停止判断形参的值01234停止前进后退左转右转返回图4.3 控制小车动作程序流程图
4. 小车控制子程序清单
void controlcar(unsigned int function) {
IN1=0; IN2=0; IN3=0; IN4=0;
delay(1); //将此状态延时一段时间 switch(function) //判断小车控制指令类型 {
case 0:
{ //小车停止 IN1=0; IN2=0;
IN3=0;
IN4=0;
21
ENA=0;
ENB=0;
//显示字库中的中文
break; } {
left=3;
right=3; CYCLE=12; //周期12ms
IN1=1; IN2=0;
IN3=1;
//显示字库中的中文
IN4=0;
DisplayListChar(0,3,carstatus1);
break;
}
…… //控制小车后退、左转、右转的程序省略 } }
由程序可以看出,根据形参function的值的不同,可以控制运动平台不同的运动状态。同时可以根据全局变量left、right中的值调整左右轮的转速,从而使运动平台平稳运动。
DisplayListChar(0,3,carstatus6);
case 1: //小车径直前行 TR0=1;
4.3红外循迹模块的软件设计
1. 红外对管的工作原理
红外对管分为红外发射管和红外接收管。如图4.4中,D1为红外发射管,D2为红外接收管。R1阻值为180Ω,可以对红外发射管进行分压和限流,对红外发射管起到保护作用。(为可变电阻,最大阻值为1000Ω,调节该电阻阻值,可以对红外发射管进行分压和限流,改变红外发射管所发射红外光的强度。同时对红外发射管的起到保护作用);R2阻值为10KΩ,其功能是将反射回来的光信号转换成电信号。由图4.5可知,电源上电后,D1处于持续工作状态中,会持续发射红外光(类似于发光二极管被点亮),当红外光遇到白色等对光的反射能力较强的物体被反射回来时,D2接收到红外线,当红外光强度达到一定程度时,D2将导通(类似于三极管的导通过程),向单片机引脚送出低电
22
平“0”。反之,遇到黑色等放射能力较差的物体时,向外输出高电平“1”。
图4.5 红外对管工作原理图
2. 循迹与红外对管的关系
使用符号Left1、Left、Right和Right1依次代表小车前方四对红外对管输出端的状态,在程序中,CPU会不断对单片机的I/O口进行查询,并根据各端口电平的高低来判断需要执行哪个子程序。4对红外对管的组合状态与小车要执行的功能的逻辑关系见表4.2。
表4.2小车循迹控制表
Left1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
Left 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
Right 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
23
Right1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
控制小车状态
/ 右转 右转 右转 左转 / 直行 右转 左转 / / / 左转 / 直行 右转
3. 循迹程序设计与流程图
循迹程序是基于遇到需右转的道路时或小车跑偏后进行纠偏而设计的程序,其流程图如图4.6所示。小车在既定轨迹上行驶中,当小车向左偏离黑色道路时,单片机查询到红外对管反馈回来的左偏信号,控制小车右转,并在12864上显示小车状态为“右转”,使小车回到黑色道路上继续行驶;向右偏离道路时,单片机同样查询到红外对官反馈回来的右偏信号,控制小车左转,并在12864上显示小车状态为“左转”,使小车正常行驶。本设计中,当遇见丁字路口时,在寻迹程序中设置小车向右转。
开始N是否在黑线上Y纠偏控制继续前进
图4.6 寻迹程序流程图
4. 循迹程序部分清单
while(1) {
while((Left1==0)&&(Left==0)&&(Right==0)&&(Right1==1)) ;//小车左偏 controlcar(4); //小车右转 while((Left1==1)&&(Left==0)&&(Right==0)&&(Right1==0)); //小车右偏 controlcar(3); //小车左转 while((Left1==0)&&(Left==1)&&(Right==0)&&(Right1==0)); //小车右偏 controlcar(3); //小车左转 while((Left1==0)&&(Left==1)&&(Right==1)&&(Right1==0)); //小车未偏离 controlcar(1); //小车直行
.. .. .. //其他纠偏程序与前面类似,此处省略。 }
可以看出,当运动平台前下方四个红外对管送给主控芯片的信号依次为“低、低、低、高”时,说明只有最右侧的红外对管模块能检测到黑色轨迹,运动平台偏向了左侧,因此需要向转弯以纠正偏离状态。由图4.3知,向右转弯时,形参传递的值应该是4,故调用子函数controlcar(4)来纠正偏运动平台的左偏状态。
4.4超声波测距模块的软件设计
1.超声波测距原理超声波模块采用IO口TRIG触发测距。测距子程序流程图如图4.3所示。
24
开始TRIG端置高电平ECHO端为低电平等待高电平持续时间约为15us是ECHO端置高电平否定时器0开始计时检测到回响信号是定时器0停止计时否计算所测距离返回图4.7超声波测距程序流程图
在程序中只需给TRIG引脚大于10us高电平,然后拉低此引脚电位,该模块便会自动发送8个40khz的方波,并且将ECHO端置为高电平,定时器1开始计时。当ECHO端检测到反射回来的信号时定时器1停止计时,根据定时器1所计ECHO端高电平持续时间,可得到超声波从发射到返回的时间,通过这个时间就可以计算测得的距离。计算公式为:距离=(高电平时间*声速)/2。
由于当系统的运动平台偏离既定路线时,超声波模块由于方向偏离,检测不到货架的位置,因此本设计中仅在移动平台直行前进时进行测距,既提高了测距的精度,又节省了不必要的测距占用CPU的时间。当检测到前方货架距离小于15cm时,则调用提升与抓捕子程序
2. 超声波测距子程序设计如下: 启动子程序:
void ultrasonic(void) {
StartModule(); //计算
25