使用五路循迹模块可以识别比较复杂的路况,比如十字路口,T型路口,以及没有路了。
  首先,要有一个扫描路况的函数,这个函数要有唯一的函数出口。在扫描函数里边要包括五路的循迹情况,也就是说执行一次扫描函数,就要知道(几乎)同一时间内五个循迹模块的情况。可以使用这种办法:给每一个循迹模块定一个值,五个模块分别是abcde,要求任意的值,不是其他任意若干个值的和。举个栗子

#define SIG_MID  1//中间
#define SIG_LEFT  10//左转
#define SIG_RIGHT 20//右转
#define SIG_LEFT_LITTLE  2//中左
#define SIG_RIGHT_LITTLE  4//中右

  这是一个示意图(俯视图)

  圆圈表示某个红外循迹模块,数字是它的值。以下是扫描函数的示例

char SearchSignal(void)//检测循迹模块的情况
{char CMD_back = 0;//用于返回检测到的信号if(SEARCH_M_IO == WHITE_AREA){CMD_back += SIG_MID;}if(SEARCH_ML_IO == WHITE_AREA){CMD_back += SIG_LEFT_LITTLE;}if(SEARCH_MR_IO == WHITE_AREA){CMD_back += SIG_RIGHT_LITTLE;}if(SEARCH_L_IO == WHITE_AREA){CMD_back += SIG_LEFT;}if(SEARCH_R_IO == WHITE_AREA){CMD_back += SIG_RIGHT;}return CMD_back;//用累加的方法得到一个唯一值,可方便处理,提升效率
}

  如果扫描的结果返回3就是中和中左一起扫描到了白线(默认黑路白线)
  如果扫描的结果返回25就是中和中右,最右一起扫描到了白线
  后边使用数值来表示某个位置的循迹模块
  2和4之间的距离要大于循迹线的宽度,而1和2的水平方向的距离要小于循迹线的宽度。
  例如,我使用了1.5cm的线,那么24的距离选择了2.5cm,12的距离就是1.25cm
  如此做的好处是:在正常行驶的时候(非急转弯),至少总有一个模块扫描到黑线。理想状态是在直线行驶时总是只有1扫描到白线。当然,由于车子自身的原因和道路不完全笔直(也可能人为弄弯曲来考验车子的性能),所以需要2和4来辅助循迹。在右边的循迹模块遇到白线的时候,说明车子偏左了,可以往右挪一点。
  对于扫描结果的处理分成两部分,先是根据扫描到的循迹模块的结果来判断路况,务必要判断清楚路况之后再行驶。
  以下是没遇到转弯时的处理函数

void GowithCorrect(void)//控制小车整体修正着走直线,正常情况下使用此模式
{ctrl_comm =  SearchSignal();
/****************************************************************/
/****************************************************************/if(ctrl_comm == 1 ){ctrl_comm_flag = GO_LINE;}
/****************************************************************/      else if (ctrl_comm == 5)//{ctrl_comm_flag = RIGHTMORE;}
/****************************************************************/      else if (ctrl_comm == 4)//{ctrl_comm_flag = RIGHTLITTLE;}
/****************************************************************/      else if (ctrl_comm == 3){ctrl_comm_flag = LEFTMORE;}
/****************************************************************/      else if (ctrl_comm == 2){ctrl_comm_flag = LEFTLITTLE;}/****************************************************************/if(ctrl_comm_flag == GO_LINE){CarGo();}else if(ctrl_comm_flag == RIGHTMORE){MoveRightMore();}else if(ctrl_comm_flag == RIGHTLITTLE){MoveRightLittle();}else if(ctrl_comm_flag == LEFTMORE){MoveLeftMore();}else if(ctrl_comm_flag == LEFTLITTLE){MoveLeftLittle();}
}

  5代表中间和右边的循迹模块(也就是循迹模块)同时扫到,说明偏左一点点,可以往右边挪一点。
  4代表只有右边的循迹模块扫到,说明偏左比较多,可以多挪一点。但是,要尽可能避免这种情况,尽量保持中间的循迹模块始终能扫描到白线。
  MoveRightLittle函数是左边轮子转得快,右边轮子转的慢的函数。
  以上是正常行进的判断。如果函数写的得当,这3个循迹模块的配合就可以完成正常行驶+有平缓弧度的转弯了。下面来说一下如何进行直角转弯,和识别T型路口,十字路口。
普通的90°左转:
  10必然读到,扫描的结果是10到17
普通的90°右转:
  扫描结果20到27
①先看十字路口,所有的循迹模块都扫到,和为37,肯定是十字路口。

T型路口分为左转,右转和不能直行的T路口三种情况。如上图所示
情况判别如下:
②T型路口左转,90°的左转+延时,然后判断1,2,4循迹模块的情况,如果扫描到白线,说明是T型路口左转
③T型路口左转,90°的右转+延时,然后判断1,2,4循迹模块的情况,如果扫描到白线,说明是T型路口右转
④不能直行的T路口与十字路口:
  出现30到37的结果时,稍微延时一下,使得那一排4个循迹模块所在的直线超过白线,然后判断循迹模块1,2,4的情况,如果这三个循迹模块有白线说明是十字路口,否则是不能直行的T路口。
  注意①②③③这些情况都是理想状态,实际上即便车子完全垂直于循迹线到达这些路口时,如T路口左转,10和2也可能不会同时扫描到。因为器件差异和比较电压的差异,即便10和2同时到达了线的上方,这次扫描的结果也可能不是12。可以通过多次判断来确保不判断错。如果一次判断对的几率只有0.9的话,那么判断两次(只需要一次判断对,结果就是对的),判断对的几率就是0.99了。
  下面是一个判断直角左转或者T路口左转的例子。由于到了十字路口或不能直行的T路口也可能是先读到10,再读到20,所以这些情况也需要在读到10的时候讨论。

    else if ((ctrl_comm > 9)&&(ctrl_comm < 19) )//最左侧的循迹模块读到{CarGo();Delayms(50);ctrl_comm_temp = SearchSignal();if ((ctrl_comm_temp > 9)&&(ctrl_comm_temp <19))//略微延迟以后还是最左侧的循迹模块{CarGo();Delayms(450);ctrl_comm_temp = SearchSignal();}else if((ctrl_comm_temp>30)&&(ctrl_comm_temp<37))//最外侧两边都扫描到,可能是T路口{ctrl_comm_flag_tmp = T_ROAD;//暂时设置为T路口}else//未知的情况,让停车。{ctrl_comm_flag = UNKNOW_ROAD;}if((ctrl_comm_temp < 6)&&(ctrl_comm_temp > 0))//判断是不是左转T路口{ctrl_comm_flag = T_LEFT;}else if(ctrl_comm_temp == 0) //否则是直角左转的路口{ctrl_comm_flag = RT_LEFT;}}

  建议将路况的判断与转弯的过程分开,直到判断清楚路况以后再根据命令直行或转弯。下面是直角左转的例子。
  CarLeft()是左侧轮子倒转,右侧正转,实现了小车基本上以左后轮为轴的左转。转到1循迹模块或者4循迹模块扫描到即可。

                else if (ctrl_comm_flag == RT_LEFT)//左转直角路口{char tmp;do{CarLeft();tmp = SearchSignal();}while((tmp != 1)&&(tmp != 4));}

T路口的左转,先左转,使20扫过线,然后继续左转,转到1或4.

    else if (ctrl_comm_flag == T_LEFT)//左转T路口 -|{if(CMD_Next == CMD_LEFTONT)  //如果下一个命令是T路口左转{char tmp;do{CarLeft();tmp = SearchSignal();}while(tmp < 19);                       do{CarLeft();tmp = SearchSignal();}while((tmp != 1)&&(tmp != 4));CMD_Next_Index++;}else if(CMD_Next == CMD_GOSTRAIGHT){CarGo();Delayms(500);CMD_Next_Index++;}else//可能未知的情况,停车{CarStop();CMD_Now = CMD_STOP;}}

直角转弯4驱差动小车的设计思想相关推荐

  1. 基于单片机的自动分拣小车的设计--毕业设计参考

    基于单片机的自动分拣小车的设计 第1章.课题内容 1.系统应用单片机的基础功能,设计相关的电子电路,搭配合适的电子器件和传感器技术等,实现自动分拣的功能. 2.对方案的总体成份进行论证和设计. 3.根 ...

  2. 单片机寻迹小车ppt_基于单片机循迹小车的设计.doc

    目录 [摘   要]  2 第一章  绪论  3 1.1智能小车的来源  3 1.2研究智能小车的目的和意义  4 1.3智能小车的现状及未来  4 第二章  方案的设计与论证  4 2.1主控系统  ...

  3. 51单片机迷宫小车的设计

    51单片机迷宫小车的设计 前言 本次迷宫小车设计,使用C51进行编程,实现小车的功能.本次完成的小车功能可分为两大模块,分别是硬件功能和软件功能. 总共有两部分来写,分别为: 硬件功能上实现了小车的底 ...

  4. 51单片机小车的立项书_毕业论文:基于51单片机智能避障小车的设计报告(范文1)...

    <毕业论文:基于51单片机智能避障小车的设计报告.doc>由会员分享,可免费在线阅读全文,更多与<毕业论文:基于51单片机智能避障小车的设计报告>相关文档资源请在帮帮文库(ww ...

  5. 直角转弯与外轮差内轮差

    直角转弯与外轮差内轮差 右转弯-直角转弯(内轮差和外轮差的尺寸可能不对) 右直角转弯的时候, 你打死方向的时候, 前轮所在的轴距的延长线, 你右转转过直角弯之后,你的右前轮就在这个延长线上. 上图中的 ...

  6. 单面机51小车程序_车辆工程学院举行“51单片机智能小车”电子设计成果答辩展示...

    用理论指导实践,以实践检验理论.6月28日,车辆工程学院在汽车科技馆二楼举行了"51单片机智能小车"电子设计成果展示,旨在加强学生学以致用能力,提升学生实践创新水平.2017级教改 ...

  7. 电控无碳小车需要单片机吗_电控无碳小车的设计及研究

    龙源期刊网 http://www.qikan.com.cn 电控无碳小车的设计及研究 作者:谢明升 元帅 张志研 王子栋 肖强 来源:<山东工业技术> 2017 年第 14 期 摘 要:根 ...

  8. 2WD远程控制小车——云端设计

    2WD远程控制小车--云端设计 1. 简介 2. 创建云端设备 3. 应用开发 4. 云端设备间通信 1. 简介 前面提到过有两种方式可以与主控板进行交互,一种是手机控制,一种是PS2控制.手机控制就 ...

  9. PLC 博涂V15 运料小车课程设计仿真程序配程序讲解视频

    PLC 博涂V15 运料小车课程设计仿真程序配程序讲解视频 需要程序文件的邮箱联系:2757749528@qq.com

最新文章

  1. CDCN 活体检测笔记
  2. [蓝桥杯]回形取数-方向向量+模拟
  3. 使用IDEA创建Maven项目和Maven使用入门(配图详解)
  4. Windows - Windows下安装MSI程序遇到2503和2502错误
  5. SpringBoot入门系列: Spring Boot的测试
  6. Scala go java_Java、Scala和Go语言多线程并发对比测试结果和结论
  7. 全球芯片厂商今年设备支出将再增10% 超过980亿美元
  8. python中delta是什么意思_python – 根据dataframe中的值计算delta
  9. ListView乱谈之ListView的布局
  10. 数据结构与算法 php pdf,数据结构与算法之美(完结)云盘分享_IT教程网
  11. 深度学习技术发展趋势浅析
  12. 【万人围观】20位著名作家,100句惊艳了时光的名句
  13. tensorflow2 serving
  14. bandzip和360解压_360压缩和bandizip哪个好 360压缩和bandizip软件功能对比详情
  15. 批量合并word文档
  16. Error:间接寻址级别不同——C++真的魔鬼
  17. Keras_examples
  18. 宝塔 Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed 解决办法
  19. 100个python算法超详细讲解:存钱
  20. 新概念英语学习方法--摘自net130

热门文章

  1. CondaValueError: no package names supplied, try conda remove -h for more details
  2. lighttpd绑定域名
  3. 成都艾司博讯拼多多网店产品推广有哪些作用?
  4. python怎么控制鼠标_Python使用pyautogui控制鼠标键盘
  5. 10天学会flutter DAY7 flutter 玩转基础Widget
  6. 投诉腾讯公司=是非不分=客服不受理,让黑客逍遥法外,冤枉好人,封我QQ空间--解开我空间
  7. linux echo 指向文件夹,Linux 命令每日一练:echo命令
  8. 物联网历史发展二三事
  9. Android系统级保活方案
  10. php获取芝麻分,PHP编程:PHP 芝麻信用接入的注意事项