创工坊平台巡线程序

        这次机器 人比赛,把创工坊平台的循线程序 底层逻辑彻底分析清楚,并整理成c代码记录下来,这套寻线算法,从左到右,传感器4、5是侦测路口,中间1、2、3用来寻线,但是有一点不足的地方是4、5号传传感器,没有参与寻线判断 。

#include <bits/stdc++.h>
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=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 left(void){//此子程序 用1号和3号传感器来判断小车是否左转完成
	int V_Sensor1=0;//1号传感器初始化
	int V_Sensor3=0;//3号传感器初始化
	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_Sensor1=infraredSensor(1);//获取1号红外传感器的值
	while(V_Sensorl>=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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值