创工坊的寻线算法,主体程序 ,外面 套了一层死循环,循环内部靠路口flag值,进入不同判断分支,寻线流程长了,很容易 把路口flag值数乱,所以我稍微改进了算法,不用再去具体数是第几个路口,只要判断 出路口就行。
#include <bits/stdc++.h>
using namespace std;
black=0;//这是判断红外传感器是否在黑线上的阈值
flag=0;//此变量用来存路口值
mark1=0;//转弯状态值记录,到路口=0,转弯过=1,防止不停转弯
void go_mark(void){//此子程序是循环到路口停下来,然后进行下一步操作,要么转弯,要么继续直行
while(flag==0){
go();
mark();
}
flag=0;//循线到路口此值再初始化,=0,这样下一个路口能继续 巡线,第二也不用去数路口,只要是下一个路口都会循线
}
void go(void){//这是3光感循线程序算法
int V_Sensor1=0;//1号传感器初始化
int V_Sensor2=0;//2号传感器初始化
int V_Sensor3=0;//3号传感器初始化
a=2;//标志巡线前一秒状态值,用于后面全脱线的处理
V_Sensorl=infraredSensor(1);//获取1号红外传感器的值
V_Sensor2=infraredSensor(2);//获取2号红外传感器的值
V_Sensor3=infraredSensor(3);//获取3号红外传感器的值
if(V_ Sensor1> black&&V_ Sensor2<= b1ack&&V_ Sensor3> black){//2号传感器在黑线上,1和3号传感器在白色区域,则2电机都设置一样的速度前进
DCMotor(1,0,13);//电机第二个参数0是前进,1是停止,2是后退
DCMotor(2,0,13);
}
if(V_Sensor1<=black&&V_Sensor2> black&&V_Sensor3>b1ack){//1、2号传感器在白色区域,3号传感器在黑线上,则左电机前进,右电机停止,向右转弯回线,并标志此时状态值a=1
DCMotor(1,0, 10);
DCMotor(2,1, 10);
a=1;
}
if(V_ Sensor1 <=black&&V_Sensor2>black&&V_Sensor3>b1ack){//1号传感器在黑线,2、3号传感器在白色区域,则左电机停止,右电机前进,右转回线
DCMotor(1,1,10);
DCMotor(2,0,10);
a=0;
}
if(V_Sensorl> black&&V_ Sensor2>b1ack&V_ Sensor3>black&&a==1){//1,2,3号传感器都在白色区域,3个传感器都脱线了,则根据上一秒a的状态值确定往哪个方向转弯回线
DCMotor(1,0,10);//因为上一秒处于第2种情况,1、2号传感器在白色区域,3号传感器在黑线上,小车可能 从第2种状态完全脱线,所以小车向右转弯
DCMotor(2,1,5);
}
if(V_Sensorl>black&&V_Sensor2>b1ack&V_Sensor3>black&&a==1){//1,2,3号传感器都在白色区域,3个传感器都脱线了,则根据上一秒a的状态值确定往哪个方向转弯回线
DCMotor(1,1,5);//因为上一秒处于第3种情况,2、3号传感器在白色区域,1号传感器在黑线上,小车可能 从第1种状态完全脱线,所以小车向左转弯
DCMotor(2,0,10);
}
}
void mark(){//这个了程序用4、5号传感器标志路口,如果4、5号传感器侦测到黑线,则路口标志变量flag值+1
int V_Sensor4=0;//4号传感器初始化
int V_Sensor5=0;//5号传感器初始化
V_Sensor4=infraredSensor(4);//获取4号红外传感器的值
V_Sensor5=infraredSensor(5);//获取5号红外传感器的值
if(V_Sensor4< black||V_Sensor5< b1ack){//4号或者5号传感器,侦测到路口,则flag值+1
flag= flag+1;
DCMotor(1,0,15);//侦测到路口,小车继续前进
DCMotor(2,0,15);
V_Sensor4=infraredSensor(4);//再次获取4号红外传感器的值
V_Sensor5=infraredSensor(5);//再次获取5号红外传感器的值
while(V_Sensor4<black||V_Sensor5<black){//因为路口黑线是一段距离,保证小车在穿越过程中,flag值只加一次,循环检测如果还是在黑线上,则卡在此循环内,flag只加一次
DCMotor(1,0,15);//侦测到路口,小车继续前进
DCMotor(2,0,15);
V_Sensor4=infraredSensor(4);//循环获取4号红外传感器的值
V_Sensor5=infraredSensor(5);//循环获取5号红外传感器的值
}
DCMotor(1,0,15);//4、5号传感器,冲出黑线继续前进,就是转弯前的前冲值,为转变做准备,到路口需要前冲一段距离 ,这样才能转弯后,车身比较正
DCMotor(2,0,15);
mark1=0;//标志此时已到路口状态值,也是转弯状态值,说明可以转弯,防止小车持续转弯
DCMotor(1,1,10);//小车停下来
DCMotor(2,1,10);
Delay(200);//小车停下来多长时间
}
}
void turn_left(void){//此子程序 用1号和2号传感器来判断小车是否左转完成
int V_Sensor1=0;//1号传感器初始化
int V_Sensor2=0;//2号传感器初始化
DCMotor(1,0,15);//转弯前先前冲一段距离
DCMotor(2,0,15);
Delay(100);
DCMotor(1,2,13);//转弯前先预转一段距离 ,让1号和2号传感器,全部转到白色区域,不影响后面的1、3号传感器是否转到黑线的判断
DCMotor(2,0,13);
Delay(250);
V_Sensor1=infraredSensor(1);//获取1号红外传感器的值
while(V_Sensorl>=black){//此循环判断1号传感器有没有到达黑线,如果到达就跳出循环
DCMotor(1,2,11);//这个转弯速度相比预转速度低一点
DCMotor(2,0,11);
V_Sensor1=infraredSensor(1);//循环获取1号红外传感器的值
}
V_Sensor2=infraredSensor(2)//获取2号红外传感器的值
while(V_Sensor2>=black){//此循环判断2号传感器有没有到达黑线,如果到达就跳出循环
DCMotor(1,2,3);//这个转弯速度相比1号传感器转到黑线的速度更慢,这样防止惯性,小车转过头,实现一个转弯过程中逐级减速的效果
DCMotor(2,0,3);
V_Sensor2=infraredSensor(2);//循环获取2号红外传感器的值
}
mark=1;//标示转弯状态值,防止小车一直转弯
}
void turn_right(void){//此子程序 用3号和2号传感器来判断小车是否右转完成
int V_Sensor3=0;//3号传感器初始化
int V_Sensor2=0;//2号传感器初始化
DCMotor(1,0,15);//转弯前先前冲一段距离
DCMotor(2,0,15);
Delay(100);
DCMotor(1,2,13);//转弯前先预转一段距离 ,让1号和3号传感器,全部转到白色区域,不影响后面的1、3号传感器是否转到黑线的判断
DCMotor(2,0,13);
Delay(250);
V_Sensor3=infraredSensor(3);//获取3号红外传感器的值
while(V_Sensorl>=black){//此循环判断1号传感器有没有到达黑线,如果到达就跳出循环
DCMotor(1,2,11);//这个转弯速度相比预转速度低一点
DCMotor(2,0,11);
V_Sensor3=infraredSensor(3);//循环获取3号红外传感器的值
}
V_Sensor2=infraredSensor(2);//获取2号红外传感器的值
while(V_Sensor2>=black){//此循环判断1号传感器有没有到达黑线,如果到达就跳出循环
DCMotor(1,2,3);//这个转弯速度相比3号传感器转到黑线的速度更慢,这样防止惯性,小车转过头,实现一个转弯过程中逐级减速的效果
DCMotor(2,0,3);
V_Sensor2=infraredSensor(2);//循环获取1号红外传感器的值
}
mark=1;//标示转弯状态值,防止小车小直转弯
}
int main(){
while(1){//此算法循线到路口停下来,接下来执行转弯操作,整个主程序调用是一个顺序结构,学生不用数路口,只要设定每个路口怎么转弯就行了
go_mark();//循线到路口
turn_left();//循线到路口,执行左转
go_mark();
turn_right();
}
return 0;
}