Motor Shield и Arduino

Тема в разделе "Arduino & Shields", создана пользователем Уыфгдщм, 16 май 2017.

  1. Уыфгдщм

    Уыфгдщм Нерд

    Есть такой код:
    Код (C++):
    #include <AFMotor.h>

    AF_DCMotor motor3(3);
    AF_DCMotor motor4(4);

    #define Trig1 13
    #define Trig2 10
    #define Echo1 12
    #define Echo2 11

    long int distance1;
    long int distance2;

    int time1;
    int time2;

    void setup()
    {
      pinMode(Trig1,OUTPUT);
      pinMode(Echo1,INPUT);
      pinMode(Trig2,OUTPUT);
      pinMode(Echo2,INPUT);
      Serial.begin(9600);
    }

    void loop()
    {
      measure1();
      delay(50);
      measure2();
      delay(50);
     
      if(distance1 <= 10 && distance2 <= 10)
      {
        backward();
        Serial.println("backward");
      }
      if(distance1 <10 && distance2 > 10)
      {
        rightward();
        Serial.println("rightward");
      }
      if(distance1 >= 10 && distance2 < 10);
      {
        leftward();
        Serial.println("leftward");
      }
      if(distance1 > 10 && distance2 >= 10)
      {
        forward();
        Serial.println("forward");
      }
    }

    void forward()
    {
      motor3.run(FORWARD);
      motor4.run(FORWARD);
      motor3.setSpeed(255);
      motor4.setSpeed(255);
    }

    void backward()
    {
      motor3.run(BACKWARD);
      motor4.run(BACKWARD);
      motor3.setSpeed(255);
      motor4.setSpeed(255);
    }

    void leftward()
    {
      motor4.run(FORWARD);
      motor4.setSpeed(255);
    }

    void rightward()
    {
      motor3.run(FORWARD);
      motor3.setSpeed(255);
    }

    void measure1()
    {              
      digitalWrite(Trig1, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig1, LOW);
      time1 = pulseIn(Echo1, HIGH);
      distance1 = time1/58;

    }

    void measure2()
    {          
       digitalWrite(Trig2, HIGH);
      delayMicroseconds(10);
      digitalWrite(Trig2, LOW);
      time2 = pulseIn(Echo2, HIGH);
      distance2 = time2/58;
    }

    Но при запуске робот работает некорректно и не поворачивает в зависимости от значений датчиков. Добавил монитор порта,чтобы посмотреть в чём проблема.Увидел,что почему-то выполняются сразу две процедуры.Просьба указать на ошибку в коде.
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    у тебя в коде это явно прописано ;)

    Если должен выпоняться только один if, то перед всеми (кроме первого) надо поставить else:
    И вообще, 6 одинаковых функций можно сократить до двух.
     
    Уыфгдщм нравится это.
  3. serg_admin

    serg_admin Гик

    Код (C++):
    if(distance1 <= 10 && distance2 <= 10)
    Код (C++):
    if(distance1 >= 10 && distance2 < 10);
    Пересечение на равенствах при distance1 = 10 и distance2 < 10
     
  4. Уыфгдщм

    Уыфгдщм Нерд

    Большое спасибо,долго не мог понять в чем ошибка.
     
  5. Уыфгдщм

    Уыфгдщм Нерд

    Спасибо за ответ,но дело оказалось не в этом.