创工坊平台巡线程序
这次机器 人比赛,把创工坊平台的循线程序 底层逻辑彻底分析清楚,并整理成c代码记录下来,这套寻线算法,从左到右,传感器4、5是侦测路口,中间1、2、3用来寻线,但是有一点不足的地方是4、5号传传感器,没有参与寻线判断 。
#include
using namespace std;
black=0;//这是判断红外传感器是否在黑线上的阈值
flag=0;//此变量用来存路口值
mark1=0;//转弯状态值记录,到路口=0,转弯过=1,防止不停转弯
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=1DCMotor(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值+1int 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值+1flag= flag+1;DCMotor(1,0,15);//侦测到路口,小车继续前进DCMotor(2,0,15);V_Sensor4=infraredSensor(4);//再次获取4号红外传感器的值V_Sensor5=infraredSensor(5);//再次获取5号红外传感器的值while(V_Sensor4=black){//此循环判断1号传感器有没有到达黑线,如果到达就跳出循环DCMotor(1,2,11);//这个转弯速度相比预转速度低一点DCMotor(2,0,11);V_Sensor1=infraredSensor(1);//循环获取1号红外传感器的值 }V_Sensor3=infraredSensor(3);//获取3号红外传感器的值while(V_Sensor3>=black){//此循环判断3号传感器有没有到达黑线,如果到达就跳出循环DCMotor(1,2,3);//这个转弯速度相比1号传感器转到黑线的速度更慢,这样防止惯性,小车转过头,实现一个转弯过程中逐级减速的效果DCMotor(2,0,3);V_Sensor3=infraredSensor(3);//循环获取3号红外传感器的值 }mark=1;//标示转弯状态值,防止小车一直转弯
}
void right(void){//此子程序 用3号和1号传感器来判断小车是否右转完成int V_Sensor3=0;//3号传感器初始化int V_Sensor1=0;//1号传感器初始化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号红外传感器的值 }while(V_Sensor1>=black){//此循环判断1号传感器有没有到达黑线,如果到达就跳出循环DCMotor(1,2,3);//这个转弯速度相比3号传感器转到黑线的速度更慢,这样防止惯性,小车转过头,实现一个转弯过程中逐级减速的效果DCMotor(2,0,3);V_Sensor1=infraredSensor(1);//循环获取1号红外传感器的值 }mark=1;//标示转弯状态值,防止小车小直转弯
}
int main(){while(1){//此算法循环执行循环和标志路口,下面判断是第几个路口,人为判断 该如何转弯,缺点:如果循线流程较长,数路口比较麻烦,容易乱,优点,代码行数少go();//循环执行循线mark();//循环执行标志路口if(flag==1&&mark1==0){//如果到达路口1,并且转弯状态值=0说明才侦测到路口可以转弯,下面右转right();}if(flag==2&&mark1==0){//如果到达路口2,并且转弯状态值=0说明才侦测到路口可以转弯,下面左弯left();}}return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
