arduino循迹小车源程序

arduino循迹小车源程序
arduino循迹小车源程序

int led1=0,led2=0,led3=0,led4=0,led5=0,led6=0,led7=0; //电压7.8V ;led1~7 分别用来接收七个探头检测回来的值

int in1=9,in2=3,in3=10,in4=11; //数字IO口9,3,10,11用来控制电机

int sum=0;

void setup()

{

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);

}

void motor(char pwmpin,char pin,int val) //给电机两个输入口赋PWM值

{

pinMode(pin, OUTPUT);

analogWrite(pwmpin,val);

digitalWrite(pin,LOW);

}

void turn_led1_0() //in1给20,in2给低电平

{ //in3给250,in4给低电平motor(in1,in2,20); //PWM满值255,差值决定转角度,大小决定速度

motor(in3,in4,250);

}

void turn_led1_1()

{

motor(in1,in2,20);

motor(in3,in4,250);

}

void turn_led2_0()

{

motor(in1,in2,70);

motor(in3,in4,250);

}

void turn_led2_1()

{

motor(in1,in2,130);

motor(in3,in4,250);

}

void turn_led3_0()

{

motor(in1,in2,180); motor(in3,in4,250); }

void turn_led3_1() {

motor(in1,in2,250); motor(in3,in4,250); }

void turn_led4_0() {

motor(in1,in2,250); motor(in3,in4,250); }

void turn_led4_1() {

motor(in1,in2,250); motor(in3,in4,250); }

void turn_led5_0() {

motor(in1,in2,250); motor(in3,in4,180); }

void turn_led5_1() {

motor(in1,in2,250); motor(in3,in4,130); }

void turn_led6_0() {

motor(in1,in2,250); motor(in3,in4,70); }

void turn_led6_1() {

motor(in1,in2,250); motor(in3,in4,20); }

void turn_led7_0() {

motor(in1,in2,250);

motor(in3,in4,20); }

void turn_stop()

{

motor(in1,in2,0);

motor(in1,in2,0);

}

void test() //检测光电管探头。是黑线返回高电平(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);

}

int deal() //对每个探头赋值:从左往右-6,-4,-2,0,2,4,6 记录检测到黑线的探头个数并将值相加

{

int a=0,b=0,c=0,d=0,e=0,f=0,g=0;

int i=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,冲出跑道均没检测到的特殊情况,让小车保持上一次的状态

else if(i<3) value=sum/i; //一般的情况:1个或2个检测到黑线

else

{

if(sum<0) value=-6; //特殊情况:左急弯,右急弯,直道

else if(sum>0) value=6;

else value=0;

}

return value;

}

void loop()

{

static char a[5],j=0; //数组记录上次值

if(j==5) j=0;

if(deal()==8)

{

if(j==0) a[j]=a[4];

else a[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;

case 0:turn_led4_0();break;

case 1:turn_led4_1();break;

case 2:turn_led5_0();break;

case 3:turn_led5_1();break;

case 4:turn_led6_0();break;

case 5:turn_led6_1();break;

case 6:turn_led7_0();break;

default:turn_led4_0();break;

}

j++;

}

/*相比较于数字信号的话,这个处理程序应该比较好了。PWM值,角度,速度与实际情况有较大联系,车的配置,摩擦,电压,车重量,电机转速,轮子大小等,所以各位下载后还需细调。不过,这个程序就在于很好调,你只要改变上面的PWM值就可实现转弯与速度的实际搭配*/

相关主题
相关文档
最新文档