主车左转原理
一、循迹转弯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
}
}
}