循迹小车的核心代码

循迹核心部分

Author:家有仙妻谢掌柜
Date:2021/2/3

最近收拾屋子,看到了大学时期为了比赛做的循迹小车,由于DIY其他项目,小车已经被拆的七零八落了,写在这里记录自己的成长历程,也分享出去供大家参考!

首先声明在本程序中和移植相关的针对不同MCU等差异所需要的做出的修改如下:
1.ReadPin
  ReadPin(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值在不同的地图上不会出现也是有可能的,这个根据实际情况即可!
*/

到此,循迹小车循迹核心代码部分介绍已经结束,如果有看官姥爷觉得写得还不错的,烦请不吝点赞收藏关注!有发现问题的请在评论区指出,有需要进一步了解的可以私信!
感谢您的支持!

你可能感兴趣的:(循迹小车,c语言,嵌入式,单片机)