开始
PWM初始化 定时器初始化 定时器计数初始化 定时器时间到发送一个触发信号 收到回波信号 Y N 计算避障物距离 小于40cm Y N PWM软件自增 驱动动电机加速 小于30cm Y N 驱动电机转向 驱动电机减速 PWM软件自减 图17:避障程序流程图
五、总结分析与结论
在这次设计和制作这个智能遥控寻迹避障小车的过程中,我们经历了许多,既有成功的快乐,也有失败的困惑。在这短短的一个月里,我们学会了许多从课本和课堂上学不到的东西。在制作过程中我们能逐步学习到:光电传感器、无线电遥控电路、电机驱动电路等相关电子知识。
在循迹部分称考虑采用发①光二极管+光敏电阻或者采用②红外光电对管(4路红外线探测系统)。
经讨论分析发现:①该方案发光二极管+光敏电阻缺点明显:易受冻外界光源的干扰,有时甚至检测不到黑线,主要是因为可见光的反射效果跟地表的平坦程度,地表材料的反射情况对检测效果产生直接影响。而且外界的可见光对设备的影响很大。②采用红外光电对管,由于只需分辨黑白,红外光电对管有一个管发射红外线一个于接收红外线,当红外线照射到黑线上时不会发射回来,当红外线照射到白色的地方就会返回,光电对管发射的同时也能接收红外信号,整个检测设备简单,稳定性高,速度快。缺点是检测距离短,但在小车基本适用,成本低。综上分析采用红外光电对管方案。
六、作品程序
/*======主函数======*/ void main(void) {
Init_all(); //定时器和串口中断初始化函数 function=0; //功能选择变量 push_val = 14; //舵机归中
K1=1; K2=1; K3=1; //关闭电源控制口 while(1) /*无限循环*/ { if(flag_REC==1) //数据接收完成标志位 { flag_REC=0; //标志位清零 if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为N,第三个字节为控制码 { switch(buff[2]) { case Remote_control: //蓝牙遥控模式 K1=1; K2=1; //关闭所有电源
function=0; push_val_left = 10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 push_val_right = 10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 stoprun(); //停止 break; case Go_black_line: //走黑线模式 K1=1; K2=0; //开启寻迹电源 function=1; push_val_left = 10; //PWM 调节参数1-10 1为最慢,10是最快 这个值可以改变其速度 push_val_right = 10; //PWM 调节参数1-10 1为最慢,10是最快 这个值可以改变其速度 stoprun(); //停止 break; case Obs_avo: //超声波避障模式 K1=0; //开启避障电源 K2=1; function=2; stoprun(); //停止 break; case LED: //车灯控制 K3=~K3; } if( function==0 ) { switch(buff[2]) { case up : // 前进 run(); break; case down: // 后退 backrun(); break; case left: // 左转 leftrun();
改改 break; case right: // 右转 rightrun(); break; case stop: // 停止 stoprun(); break; } } } } if( function==1 ) //走黑线模式 { tracing(); //调用小车走黑线函数 } if( function==2 ) //超声波避障模式 { if(timer>=1000) //100MS检测启动检测一次 { timer=0; StartModule(); //启动检测 Conut(); //计算距离 // if( Left_1_led==0 || Right_2_led==0 ) //传感器检测到前方有障碍物 // { // ZYX(); //调用小车方向控制函数 // }
if(S<20) //距离小于20CM { stoprun(); //小车停止 COMM(); //调用小车方向控制函数 } if(S>=20 && S<50) //距离在20cm到40cm之间,往前走 { //以中等速度前进
push_val_left = 5; //PWM 调节参数1-10 1为最慢,10是最快这个值可以改变其速度
改 push_val_right = 5; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 run(); //小车前进 } else if(S>=50) //距离大于,40CM往前走 { //以最快速度前进
push_val_left = 10; //PWM 调节参数1-10 1为最慢,10是最快 改这个值可以改变其速度 push_val_right = 10; //PWM 调节参数1-10 这个值可以改变其速度 run(); //小车前进 } } } } }
1为最慢,10是最快改