主控选择:arduino
难点:数据处理不兼容。解决方案:利用while(1).....break; 单独执行然后跳出。
#define motor_A1 9
#define motor_A2 10
#define motor_A 11
#define motor_B1 6
#define motor_B2 5
#define motor_B 3
int Echo = 13;
int Trig = 12;
int C,D;
void setup() {
Serial.begin(9600);
pinMode(Trig,OUTPUT);
pinMode(Echo,INPUT);
pinMode(motor_A1,OUTPUT);
pinMode(motor_A2,OUTPUT);
pinMode(motor_A,OUTPUT);
pinMode(motor_B1,OUTPUT);
pinMode(motor_B2,OUTPUT);
pinMode(motor_B,OUTPUT);
pinMode(8,INPUT);
pinMode(7,INPUT);
}
void xunji()
{
C=digitalRead(8);//左
D=digitalRead(7);//右
if((C==1)&&(D==0)){
zz();
delay(10);}
if((C==0)&&(D==1)){
yz();
delay(10);}
if((C==0)&&(D==0))
{
qj();delay(10);}
}
void xunji2()
{
C=digitalRead(8);//左
D=digitalRead(7);//右
if((C==1)&&(D==0)){
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,0); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,50); //PWM
delay(10);}
if((C==0)&&(D==1)){
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,50); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,0); //PWM
delay(10);}
if((C==0)&&(D==0))
{
qj();delay(10);}
}
int flag = 0;
int flag2 = 0;
void loop() { //循迹
while(1)
{
go();
if(flag ==3)
{
delay(100);
break;
}
}
flag = 0;
int distance;
while(1)
{
distance = Distance_test(); //读取超声波传回来的数据
delay(100);
if((distance >=0) && (distance <=15 ))
{
tz();
delay(200);
break;
}
else
{
xunji2();
delay(100);
}
}
while(1)
{
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,100); //PWM
digitalWrite(motor_B1,0);
digitalWrite(motor_B2,1);
analogWrite(motor_B,100); //PWM
delay(550);
tz();
delay(1000);
break;
}
while(1)
{
xunji();
if(C == 1 && D == 1 && flag2 == 0)
{
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,100); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,0); //PWM
delay(500);
tz();
delay(1000);
flag2=flag2+1;
delay(1000);
}
if(flag2 == 1)
{
xunji();
}
}
}
void go()
{
xunji();
if(C == 1 && D == 1)
{
tz();
flag=flag+1;
delay(1000);
}
if(flag == 2)
{
digitalWrite(motor_A1,0);
digitalWrite(motor_A2,1);
analogWrite(motor_A,0); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,100); //PWM
delay(500);
tz();
delay(1000);
flag = 3;
}
}
float Distance_test(){ //量出前方距离
digitalWrite(Trig,LOW); //给触发脚高电平2us
delayMicroseconds(2); //延时2us
digitalWrite(Trig,HIGH); //给触发脚高电平10us,这里至少10us
delayMicroseconds(10); //延时10us
digitalWrite(Trig,LOW); //持续给触发脚低电
float Fdistance = pulseIn(Echo,HIGH);//读取高电平时间(单位:微秒)
Fdistance = Fdistance/58; //为什么除以58等于厘米 Y=(x秒*344)/2
return Fdistance;
}
void qj()//前进
{
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,50); //PWM调节
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,50); //PWM调节
}
void ht()//后退
{
digitalWrite(motor_A1,0);
digitalWrite(motor_A2,1);
analogWrite(motor_A,100); //PWM
digitalWrite(motor_B1,0);
digitalWrite(motor_B2,1);
analogWrite(motor_B,100); //PWM
}
void zz()//左转
{
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,0); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,100); //PWM
}
void yz()//右转
{
digitalWrite(motor_A1,1);
digitalWrite(motor_A2,0);
analogWrite(motor_A,100); //PWM
digitalWrite(motor_B1,1);
digitalWrite(motor_B2,0);
analogWrite(motor_B,0); //PWM
}
void tz()//停止
{
digitalWrite(motor_A1,0);
digitalWrite(motor_A2,0);
analogWrite(motor_A,0); //PWM
digitalWrite(motor_B1,0);
digitalWrite(motor_B2,0);
analogWrite(motor_B,0); //PWM
}