设为首页收藏本站

极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 135|回复: 0

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

[复制链接]
发表于 2017-4-18 10:25:02 | 显示全部楼层 |阅读模式
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,再进行寻迹。   方案1.png
结果:小车会一直直行,不进行寻迹,而且到十字路口也不停车。

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

方案3: 方案3.png
结果:前面判断黑线没问题,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;
      }  
}
回复

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号  

GMT+8, 2017-4-26 15:57 , Processed in 0.094026 second(s), 11 queries , File On.

Powered by Discuz! X3.3 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表