嵌入式小车车~如何实现循迹转弯、码盘转弯?

主车左转原理

一、循迹转弯90度

Q:如何让小车左转90°?

A:左转90°的原理是让小车以一定速度向左旋转,同时寻找地图的黑线,由于地图的交叉黑线是90°夹角,所以当小车识别到黑线时,小车停止,此时正好转了90°。所以小车左转90°的函数需要一个参数:速度。或者通过协议理解(如下):

代码如下:


void Car_Left(uint8_t speed)  //主车左转90°函数 参数:速度
{
		Stop_Flag = 0;
		Go_Flag = 0; 
		wheel_L_Flag = 1;
		wheel_R_Flag = 0;
		wheel_Nav_Flag = 0;
		Back_Flag = 0;
		Track_Flag = 0;
		Car_Spend = speed;				 //转弯是原地完成,不需要码盘值
		Control(-Car_Spend ,Car_Spend); //左轮向后转,右轮向前转 就会左转
		while(Stop_Flag != 0x02);//等待左转完成。
}


先 Ctrl+F 找wheel_L_Flag,找到运行状态标志位的判断函数,如下(my_lib→roadway_check.c下148行左右):


/**
	循迹线转弯90°监测函数
*/
uint32_t Mp_Value = 0;
void wheel_Track_check(void)
{ 	
	uint16_t Track_Value = 0;

	if(wheel_L_Flag == 1)
	{
		Track_Value = Get_Host_UpTrack(TRACK_H8); //调用获取、处理循迹数据函数,获取第二排红外管的值并赋值给变量Track_Value
		if(!(Track_Value &0X10)) //找到循迹线,停止 ; 16进制下0x10等于十进制下的16 ;&用来清零,或用来置1,0x10代表内侧第四个灯灭,其他灯亮
		{	
			if(Wheel_flag > 50) //是否经历过循迹灯全亮的状态?如果有就进去,如果没有就跳过此if
			{
				wheel_L_Flag = 0;
				Wheel_flag=0;
				Stop_Flag=2;
				Send_UpMotor(0,0);
			}
		}
		else if(Track_Value == 0Xff)  //0xff代表循迹灯全亮
		{			
			Wheel_flag++;
		}
	} 
	else if(wheel_R_Flag == 1)
	{
		Track_Value = Get_Host_UpTrack(TRACK_H8);

		 if(!(Track_Value &0X08)) //找到循迹线,停止
			{	
				if(Wheel_flag > 50)
				{
					wheel_R_Flag=0;
					Wheel_flag=0;
					Stop_Flag=2;
					Send_UpMotor(0,0);
				}
			}
			else if( Track_Value == 0Xff) 
			{				
				Wheel_flag++;
			}
	}
}




二、码盘转弯

原(手机控制小车)代码


	case 0x08:				//左转弯--角度											
				Roadway_nav_syn();	//角度同步
				Roadway_mp_syn();	//码盘同步
				Stop_Flag = 0; Go_Flag = 0; wheel_L_Flag = 0;wheel_R_Flag = 0;wheel_Nav_Flag = 1;
				Back_Flag = 0; Track_Flag = 0;
				temp_Nav = Wifi_Rx_Buf[5];
				temp_Nav <<=  8;
				temp_Nav |= Wifi_Rx_Buf[4];
				Car_Spend = Wifi_Rx_Buf[3];				
				Send_UpMotor(-Car_Spend ,Car_Spend);					
				break;


改写为(按钮控制小车):


void Car_Nav(uint8_t mode , uint8_t speed , uint16_t temp)
{
		Roadway_mp_syn();  	//码盘同步
		Stop_Flag = 0;
		Go_Flag = 0; 
		wheel_L_Flag = 0;
		wheel_R_Flag = 0;
		wheel_Nav_Flag = 1;
		Back_Flag = 0; 
		Track_Flag = 0;
		temp_Nav = temp;
		Car_Spend =  speed ;				
		if(mode == 1)  //判断mode是左转还是右转,mode=1,为左转
		{
			Send_UpMotor(-Car_Spend ,Car_Spend);		
		}
		else
		{
			Send_UpMotor(Car_Spend ,-Car_Spend);	
		}
		while(Stop_Flag != 0x02);//等待转弯完成。
}





/**
	码盘转弯监测函数
*/
void wheel_Nav_check(void)
{ 	
	uint16_t Mp_Value = 0;

	if(wheel_Nav_Flag)
	{
		Mp_Value = Roadway_mp_Get(); 
		if(Mp_Value >= temp_Nav) //如果当前的码盘值 >= 我们设定的码盘值
		{
			wheel_Nav_Flag = 0;  //码盘转弯标志位赋值为0
			Stop_Flag = 2;    //运行状态标志位赋值为2,对应协议四的0x02--转弯完成
			Send_UpMotor(0,0);  //两个轮子速度降为0
		}
	}
}



(完)