1551675528 发表于 2017-4-18 10:25:02

请教if里面可以嵌套与之相同的if判断条件吗?

0、1、2、3、4是输入指令引脚,6、7接收红外传感器信号,8、9、10、11引脚控制4个舵机,A1、A2、A3、A4控制电机驱动模块,指令完成后12引脚输出信号给PLC。
就说寻迹那块,直线寻迹到达十字路口后,小车停车,arduino12引脚输出高电平给PLC,等待下一个指令。
当PLC继续给它直行信号后,需要首先判断红外传感器是否压在黑线上。如果是,先直行走出黑线再寻迹;如果不是,直接运行寻迹程序直到下一个十字路口停车。(问题在于第一个if判断条件和嵌套if中的判断条件冲突,不知道怎么解决了)

方案1:不管是不是在黑线上,直接先前进0.5s,再进行寻迹。
结果:小车会一直直行,不进行寻迹,而且到十字路口也不停车。

方案2,
结果:小车初始状态在黑线上时,会走出黑线再寻迹,但到达下一个十字路口时小车会执行第一个判断中的程序,不执行最后一句:停车并且12端口输出高低电平

方案3:
结果:前面判断黑线没问题,while循环中不执行寻迹,当到达下一个路口时只执行最后一句。

刚接触arduino,求大神帮忙分析一下是哪里出的问题啊!



源程序:
#include <Servo.h>
Servo myservo0; //舵机0(8)
Servo myservo1; //舵机1(9)
Servo myservo2; //舵机2(10)               
Servo myservo3; //舵机3(11)
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;
int a12;
const int SensorRight =6;//右循迹红外传感器(6)
const int SensorLeft = 7;//左循迹红外传感器(7)
int SL; //左循迹红外传感器状态
int SR; //右循迹红外传感器状态

int Left_motor_back=A1;//左电机后退(IN1)
int Left_motor_go=A2;    //左电机前进(IN2)
int Right_motor_go=A3;   // 右电机前进(IN3)
int Right_motor_back=A4; // 右电机后退(IN4)

void setup()
{
myservo0.attach(8); //8、9、10、11端口输出0、1、2、3舵机控制信号
myservo1.attach(9);
myservo2.attach(10);
myservo3.attach(11);
pinMode(Left_motor_back,OUTPUT);//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT);
pinMode(Right_motor_go,OUTPUT);
pinMode(Right_motor_back,OUTPUT);
pinMode(12,OUTPUT);//12端口信号输出至PLC
pinMode(0,INPUT);    //定义0,1,2,3,4接口为输入接口
pinMode(1,INPUT);
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
pinMode(SensorLeft,INPUT); //定义左循迹红外传感器为输入
}
void run1() //直行
{
digitalWrite(Right_motor_go,HIGH);// 右电机前进
digitalWrite(Right_motor_back,LOW);   
digitalWrite(Left_motor_go,HIGH);   // 左电机前进
digitalWrite(Left_motor_back,LOW);
}
void left()   //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH);      
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);   
digitalWrite(Left_motor_back,LOW);
}
void right()//右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW);   
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,HIGH);
digitalWrite(Left_motor_back,LOW);
}
void turn()   //原地掉头
{
digitalWrite(Right_motor_go,HIGH);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,HIGH);
}

void stop1() //停车
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
}

void cach()//抓取
{
    for (int a=4;a<70;a++) //舵机1下降
{ myservo1.write(a); delay (15);}
    delay(1000);
   
    for (int b=50;b>0;b--) //舵机3抓取
{ myservo3.write(b); delay (15);}
    delay(1000);

    for (int c=70;c>15;c--) //舵机1上升
{ myservo1.write(c); delay (15);}
    delay(1000);
   
    for ( int d=172;d>20;d--) //舵机0转180度
{ myservo0.write(d); delay (15);}
    delay (1000);

    for (int f=70;f>15;f--)//舵机2下转
{ myservo2.write(f); delay (5);}
    delay(1000);
   
   myservo3.write(50);       //舵机3打开
    delay (1000);
   
    for ( int e=10;e<172;e++) //舵机0回转180度
{ myservo0.write(e); delay (15);}
    delay (1000);
}
void loop()
{
   began:
   myservo0.write(172); //舵机初始状态
   myservo1.write(4) ;
   myservo2.write(70);
   myservo3.write(50);

   a0 =digitalRead(0);//a0~a4为输入,0、1低电平有效,2、3、4高电平有效
   a1 =digitalRead(1);
   a2 =digitalRead(2);
   a3 =digitalRead(3);
   a4 =digitalRead(4);

   SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L3亮;没信号表明压在黑线上,车子底板上L3灭
   SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭

   digitalWrite(Right_motor_go,LOW);   //初始化电机驱动为low
   digitalWrite(Right_motor_back,LOW);
   digitalWrite(Left_motor_go,LOW);
   digitalWrite(Left_motor_back,LOW);
   digitalWrite(12,LOW);               //初始化12端口输出低电平

    if(a1==LOW) //a1闭合,直线执行寻迹程序(低电平有效)
      {
   
      run1();
      delay(100);
   
             if (SL == LOW&& SR == LOW ) run1();   //调用前进函数
      else if (SL == HIGH && SR == LOW ) left();   // 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转
      else if (SR == HIGH && SL == LOW ) right();// 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转
      
       }
    else if( a2 == HIGH ) //a2闭合右转90度(高电平有效)
      {
      right(); delay(3000);
      if (SL == HIGH && SR == LOW)
         {
          stop1(); digitalWrite(12,HIGH);delay(500);digitalWrite(12,LOW);goto began;
         }
      }
   
    else if( a3 == HIGH ) //a3闭合,左转90度(高电平有效)
      {
      left(); delay(3000);
      if (SR == HIGH && SL == LOW)
         {
         stop1(); digitalWrite(12,HIGH);delay(500);digitalWrite(12,LOW);goto began;
         }
      }

    else if( a4 == HIGH ) //a4闭合,原地转180度(高电平有效)
      {
      turn(); delay(3000);
      if (SR == HIGH && SL == LOW)
         {
         stop1(); digitalWrite(12,HIGH);delay(500);digitalWrite(12,LOW);goto began;
         }
      }
   
    else if(a0==LOW)      //a0闭合执行抓取程序(低电平有效)
      {
      cach(); digitalWrite(12,HIGH);delay(500);digitalWrite(12,LOW);goto began;
      }
}
页: [1]
查看完整版本: 请教if里面可以嵌套与之相同的if判断条件吗?