Помогите новичку!

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

  1. elctpo

    elctpo Нерд

    Добрый день, форумчане! Помогите разобраться с кодом!
    вот код:
    Код (Text):
    #include <Servo.h>  //include Servo library
    const int dangerThresh = 10; //threshold for obstacles (in cm)
    int leftDistance, rightDistance; //distances on either side
    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); //attach motors to proper pins
      panMotor.write(90); //set PING))) pan to center
      pinMode(Trig, OUTPUT);
      pinMode(Echo, INPUT);
        Serial.begin(9600);
    }

    void loop()
    {
      int distanceFwd =ping();
      if (distanceFwd>dangerThresh) //if path is clear
      {
        motor1(FORWARD,255);
        motor2(FORWARD,255);
      //move forward
      }
      else //if path is blocked
      {
        motor1(FORWARD,0);
        motor2(FORWARD,0);
        panMotor.write(0);
        delay(500);
        rightDistance = ping(); //scan to the right
        delay(500);
        panMotor.write(180);
        delay(700);
        leftDistance = ping(); //scan to the left
        delay(500);
        panMotor.write(90); //return to center
        delay(100);
        compareDistance();
      }
    }
     
    void compareDistance()
    {
      if (leftDistance>rightDistance) //if left is less obstructed
      {
        motor1(FORWARD,250);
        motor2(FORWARD,0); //turn left
        delay(2000);
      }
      else if (rightDistance>leftDistance) //if right is less obstructed
      {
          motor1(FORWARD,0);
          motor2(FORWARD,250); //turn right
        delay(2000);
      }
        else //if they are equally obstructed
      {
          motor1(FORWARD,0);
          motor2(FORWARD,250); //turn 180 degrees
        delay(2000);
      }
    }

    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. elctpo

    elctpo Нерд

    Все, переписал код, робот начал двигаться нормально!