arduino循迹小车源程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

intled1=0,led2=0,led3=0,led4=0,led5=0,led6=0,led7=0;//电压7.8V;led1~7分别用来接收七个探头检测回来的值intin1=9,in2=3,in3=10,in4=11;//数字IO口9,3,10,11用来控制电机intsum=0;voidsetup(){pinMode(0,INPUT);pinMode(7,INPUT);pinMode(1,INPUT);pinMode(8,INPUT);pinMode(2,INPUT);pinMode(3,OUTPUT);pinMode(6,INPUT);pinMode(9,OUTPUT);pinMode(4,INPUT);pinMode(10,OUTPUT);pinMode(13,INPUT);pinMode(11,OUTPUT);pinMode(12,INPUT);pinMode(5,INPUT);digitalWrite(in2,LOW);digitalWrite(in4,LOW);}voidmotor(charpwmpin,charpin,intval)//给电机两个输入口赋PWM值{pinMode(pin,OUTPUT);analogWrite(pwmpin,val);digitalWrite(pin,LOW);}voidturn_led1_0()//in1给20,in2给低电平{//in3给250,in4给低电平motor(in1,in2,20);//PWM满值255,差值决定转角度,大小决定速度motor(in3,in4,250);}voidturn_led1_1(){motor(in1,in2,20);motor(in3,in4,250);}voidturn_led2_0(){motor(in1,in2,70);motor(in3,in4,250);}voidturn_led2_1(){motor(in1,in2,130);motor(in3,in4,250);}voidturn_led3_0(){motor(in1,in2,180);motor(in3,in4,250);}voidturn_led3_1(){motor(in1,in2,250);motor(in3,in4,250);}voidturn_led4_0(){motor(in1,in2,250);motor(in3,in4,250);}voidturn_led4_1(){motor(in1,in2,250);motor(in3,in4,250);}voidturn_led5_0(){motor(in1,in2,250);motor(in3,in4,180);}voidturn_led5_1(){motor(in1,in2,250);motor(in3,in4,130);}voidturn_led6_0(){motor(in1,in2,250);motor(in3,in4,70);}voidturn_led6_1(){motor(in1,in2,250);motor(in3,in4,20);}voidturn_led7_0(){motor(in1,in2,250);motor(in3,in4,20);}voidturn_stop(){motor(in1,in2,0);motor(in1,in2,0);}voidtest()//检测光电管探头。是黑线返回高电平(1),白线返回低电平(0),这与实际电路相关{//0,1,2,6,4,7,8是数字IO口,读取检测值led1=digitalRead(0);led2=digitalRead(1);led3=digitalRead(2);led4=digitalRead(6);led5=digitalRead(4);led6=digitalRead(7);led7=digitalRead(8);}intdeal()//对每个探头赋值:从左往右-6,-4,-2,0,2,4,6记录检测到黑线的探头个数并将值相加{inta=0,b=0,c=0,d=0,e=0,f=0,g=0;inti=0,value=0;test();if(led1==1){a=-6;i++;}if(led2==1){b=-4;i++;}if(led3==1){c=-2;i++;}if(led4==1){d=0;i++;}if(led5==1){e=2;i++;}if(led6==1){f=4;i++;}if(led7==1){g=6;i++;}sum=a+b+c+d+e+f+g;//求平均值,较精确的确定黑线位置if(i==0)value=8;//分母不能为0,冲出跑道均没检测到的特殊情况,让小车保持上一次的状态elseif(i3)value=sum/i;//一般的情况:1个或2个检测到黑线else{if(sum0)value=-6;//特殊情况:左急弯,右急弯,直道elseif(sum0)value=6;elsevalue=0;}returnvalue;}voidloop(){staticchara[5],j=0;//数组记录上次值if(j==5)j=0;if(deal()==8){if(j==0)a[j]=a[4];elsea[j]=a[j-1];}switch(a[j])//对各种返回值的响应速度和转弯角度{case-6:turn_led1_0();break;case-5:turn_led1_1();break;case-4:turn_led2_0();break;case-3:turn_led2_1();break;case-2:turn_led3_0();break;case-1:turn_led3_1();break;case0:turn_led4_0();break;case1:turn_led4_1();break;case2:turn_led5_0();break;case3:turn_led5_1();break;case4:turn_led6_0();break;case5:turn_led6_1();break;case6:turn_led7_0();break;default:turn_led4_0();break;}j++;}/*相比较于数字信号的话,这个处理程序应该比较好了。PWM值,角度,速度与实际情况有较大联系,车的配置,摩擦,电压,车重量,电机转速,轮子大小等,所以各位下载后还需细调。不过,这个程序就在于很好调,你只要改变上面的PWM值就可实现转弯与速度的实际搭配*/

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功