Выполнение условий

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем elctpo, 12 янв 2015.

  1. elctpo

    elctpo Нерд

    Добрый вечер! Помогите разобраться с кодом. В программировании я еще новичок. Объясните, пожайлуста, как сделать, чтобы не выполнялось одновременно 3 условия. Дело в том, что когда робот находит два значения, больше нужного, по идеи он должен развернуться, что он иделает, но при этом выполняются два других условия(поворот направо и налево) и получается, что он разворачивается на 180, потом направо, а уж затем налево.
    Код (Text):
    #include <Servo.h>  //инцилизация библиотеки серводвигателя
    const int dangerThresh = 30;//переменная для хранения информации о расстоянии при котором робот остановиться
    const int patch = 40;
    int leftDistance, rightDistance; //переменные для хранения информации о расстоянии в двух направлении
    Servo panMotor;
    const int Trig = 11;
    const int Echo = 12;
    long distance_sm;
    long time_us;

    struct MOTOR    // структура для хранения номеров pin-ов, к которым подключены моторчики
    {
      int in;    // INVERTOR INPUT
      int enable;  // ENABLE1
    };

    // определяем порты, к которым подключены моторчики
    MOTOR MOTOR1 = { 7, 9 };
    MOTOR MOTOR2 = { 8, 10 };

    int FORWARD = HIGH;
    int BACK = LOW;

    void setup()
    {
      panMotor.attach(6); //присоединяем серво к пину ардуино
      panMotor.write(90); //ставим датчик по центру
      pinMode(Trig, OUTPUT);//ввод и вывод датчка
      pinMode(Echo, INPUT);
      pinMode(MOTOR1.in, OUTPUT); // настраиваем выводы
      pinMode(MOTOR2.in, OUTPUT);
    }

    void loop()
    {
      int distanceFwd =ping();
      if (distanceFwd>dangerThresh) //если путь чист
      {
        motor1(FORWARD,255);
        motor2(FORWARD,255);
      //движемся вперед
      }
      else //если путь заблокирован
      {
        motor1(FORWARD,0);//останавливаемся
        motor2(FORWARD,0);
        panMotor.write(0);
        delay(500);
        rightDistance = ping(); //сканируем правую сторону
        delay(500);
        panMotor.write(180);
        delay(700);
        leftDistance = ping(); //сканируем левую сторону
        delay(500);
        panMotor.write(90); //возвращаем датчик в центр
        delay(100);
        if(rightDistance>patch)//сравниваем правую сторону
        {
          motor1(FORWARD,0);
          motor2(FORWARD,255);
          delay(100);
        }
        if(leftDistance>patch)//сравниваем левую сторону
        {
          motor1(FORWARD,255);
          motor2(FORWARD,0);
          delay(100);
        }
        if(leftDistance && rightDistance<patch)//если правая и левая сторона меньше значению переменной
        {
          motor1(BACK,255);
          motor2(BACK,125);
          delay(1500);
        }
        if(leftDistance && rightDistance>patch)//если правая и левая сторона больше знаения переменной
          {
          motor1(BACK,0);
          motor2(FORWARD,255);
          delay(800);
        }
      }
    }
      long ping()
      {
        digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
        delayMicroseconds(10); // Удерживаем 10 микросекунд
        digitalWrite(Trig, LOW); // Затем убираем
        time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
        distance_sm=time_us/58; // Пересчитываем в сантиметры
        return distance_sm;
      }


    void motor1(int dir, int pwm) // первый вперёд
    {
      digitalWrite(MOTOR1.in, dir);
      analogWrite(MOTOR1.enable, pwm);
    }

    void motor2(int dir, int pwm) // второй вперёд
    {
      digitalWrite(MOTOR2.in, dir);
      analogWrite(MOTOR2.enable, pwm);
    }
     
     
  2. Unixon

    Unixon Оракул Модератор

    А что вы конкретно хотели проверить в 3 и 4 условии?

    Код (Text):

    if((leftDistance<patch) && (rightDistance<patch))
    {
     ...
    }
    if((leftDistance<patch) && (rightDistance>patch))
    {
     ...
    }
     
    Может вы это имели ввиду?
     
  3. elctpo

    elctpo Нерд

    Щас попробую