循迹核心部分
Author:家有仙妻谢掌柜
Date:2021/2/3
最近收拾屋子,看到了大学时期为了比赛做的循迹小车,由于DIY其他项目,小车已经被拆的七零八落了,写在这里记录自己的成长历程,也分享出去供大家参考!
首先声明在本程序中和移植相关的针对不同MCU等差异所需要的做出的修改如下:
1.ReadPinReadPin(GPIO1);就是读取GPIO1引脚的高低电平。
2.变量定义这里统一用int类型,移植到自己工程上的时候,做相应修改,注意符号。
3.我的设计本循迹小车共采用7个红外对管(循迹模块),当检测到黑线的时候,传感器对应的IO的电平是低电平,黑线用的是黑色的电工胶带,7个infrared sensor并排紧挨着,检测宽度大于黑线宽度。
4.循迹效果足够用!
/******************************************************************************** fuction InfraredDetection* brief 判断当前是那几个探头被触发 * param 无* return value:该值表明是那几个探头被触发*******************************************************************************/ /*
对每个探头赋值,记录检测到黑线的探头个数并将值相加
在这里我的赋值是将7个探头从左往右依次赋值为:-6;-4;-2;0;2;4;6;
也分别对应了GPIO1-7
*/
int InfraredDetection(void)//对每个探头赋值,记录检测到黑线的探头个数并将值相加
{int IR1=0,IR2=0,IR3=0,IR4=0,IR5=0,IR6=0,IR7=0;int sum=0;int i=0,value=0;if(!ReadPin(GPIO1)){IR1=-6;i++;}//最左边探头if(!ReadPin(GPIO2)){IR2=-4;i++;}if(!ReadPin(GPIO3)){IR3=-2;i++;}if(!ReadPin(GPIO4)){IR4= 0;i++;}//中间探头if(!ReadPin(GPIO5)){IR5= 2;i++;}if(!ReadPin(GPIO6)){IR6= 4;i++;}if(!ReadPin(GPIO7)){IR7= 6;i++;}//最右边探头sum = IR1+IR2+IR3+IR4+IR5+IR6+IR7;//求平均值,较精确的确定黑线和探头的相对位置if(i==0) value=7; //没有一个传感器被触发,检测到的是白色else if(i<=2) value=sum/i; //一般的情况:1个或2个检测到黑线else{if(sum<0) value=8; //左急弯else if(sum>0) value=9; //右急弯else value=10;//检测多个黑色情况,十字路口标志 或抬起} return value;
}
/******************************************************************************** fuction TrackingSpeed* brief 根据检测到的探头来配速 * param 无* return 无*******************************************************************************/
void TrackingSpeed(void)
{int k = 0;k = InfraredDetection();//状态检测if(k<11){switch(k) //对各种返回值的响应速度和转弯角度{case -6:T_L_XL();break; //左大case -5:T_L_L(); break; //左中case -4:T_L_M(); break; //左小case -3:T_L_M(); break; //左小case -2:T_L_S(); break; //左微case -1:T_L_S(); break; //左微case 0:T_run(); break; //直走case 1:T_R_S(); break; //右微case 2:T_R_S(); break; //右微case 3:T_R_M(); break; //右小case 4:T_R_M(); break; //右小case 5:T_R_L(); break; //右中case 6:T_R_XL();break; //右大case 7:T_run(); break; //直行case 8:T_L_XL();break; //左急弯case 9:T_R_XL();break; //右急弯case 10:T_run(); break; //直行 }}
}
/*
上述的如:T_L_XL();这一类的函数都是封装起来的对应的左右电机不同的速度,以达到响应的效果,这里
只是按照我的需求写的,移植的时候根据想要实现的具体功能修改这个速度函数就可以了;
有的K值在不同的地图上不会出现也是有可能的,这个根据实际情况即可!
*/
到此,循迹小车循迹核心代码部分介绍已经结束,如果有看官姥爷觉得写得还不错的,烦请不吝点赞收藏关注!有发现问题的请在评论区指出,有需要进一步了解的可以私信!
感谢您的支持!