Ардуино машинка с датчиками.

Тема в разделе "Arduino & Shields", создана пользователем IzeNik, 28 май 2018.

  1. IzeNik

    IzeNik Нуб

    Добрый вечер имею проблему следующего характера. код не хочет проводить проверку на расстояние. вот сам гомнокод. не серчайте накидал без форматирования.
    Код (C++):
    #include <Servo.h>      
    const int LeftMotorForward = 12;
    const int LeftMotorBackward = 11;
    const int RightMotorForward = 7;
    const int RightMotorBackward = 6;
    const int enA = 13;
    const int enB = 5;
    const int buzzerPin = 3;
    const int DISTANCE_MAX = 450;
    const int DISTANCE_MIN = 2;
    const int DST_STOP = 30;
    #define trig_pin A0
    #define echo_pin A1
    boolean SAFE_DISTANCE = true;
    int distance = 0;

    Servo servo_motor; //
    char btCommand = 'S';
    unsigned long btTimer0 = 2000;
    unsigned long btTimer1 = 0;    

    class Motor
    {
    int enablePin;
    int directionPin1;
    int directionPin2;
    public:
    Motor(int ENPin,int dPin1,int dPin2)
    {
    enablePin = ENPin;
    directionPin1 = dPin1;
    directionPin2 = dPin2;
    };
    void Drive(int speed)
    {
    if(speed>=0)
      {
        digitalWrite(directionPin1, LOW);
        digitalWrite(directionPin2, HIGH);
      }
    else
    {
      digitalWrite(directionPin1, HIGH);
      digitalWrite(directionPin2, LOW);
      speed = - speed;
    }
    analogWrite(enablePin, speed);
    }
    };
    Motor leftMotor = Motor(enA, LeftMotorForward, LeftMotorBackward);
    Motor rightMotor = Motor(enB, RightMotorForward, RightMotorBackward);
    void motorInitiation()
    {
    pinMode(enA, OUTPUT);
    pinMode(LeftMotorForward, OUTPUT);
    pinMode(LeftMotorBackward, OUTPUT);
    pinMode(enB, OUTPUT);
    pinMode(RightMotorForward, OUTPUT);
    pinMode(RightMotorBackward, OUTPUT);
    digitalWrite(enA, LOW);
    digitalWrite(enB, LOW);
    digitalWrite(LeftMotorForward, LOW);
    digitalWrite(LeftMotorBackward, HIGH);
    digitalWrite(RightMotorForward, LOW);
    digitalWrite(RightMotorBackward, HIGH);
    }
    int measureDistance()
    {
      long duration;
      int  distance;
      digitalWrite(trig_pin, LOW);
      delayMicroseconds(3); // 3
      digitalWrite(trig_pin, HIGH);
      delayMicroseconds(10); // 10
      digitalWrite(trig_pin, LOW);

      duration = pulseIn(echo_pin, HIGH);
      Serial.print(4);
      distance = duration / 58;
      if (distance < DISTANCE_MIN )
        {Serial.print (DISTANCE_MIN); return DISTANCE_MIN;}
      if (distance > DISTANCE_MAX )
        {Serial.print (DISTANCE_MAX); return DISTANCE_MAX;}
      Serial.print (distance);return distance;
    }
    boolean isSAFE()
    {
        if (1)
        {
          distance = measureDistance();
          if ( distance < DST_STOP ) //20см
            {
                Serial.print (6);
                return false;
                        }
        } else
                {
                 Serial.print (5);
                return true;
                    }
    }

    void beep(unsigned char delayms)
    {
      analogWrite(buzzerPin, 20);
      delay(delayms);
      analogWrite(buzzerPin ,0);
      delay(delayms);
    }
    void moveStop()
    {
      leftMotor.Drive(0);
      rightMotor.Drive(0);
    }
    boolean moveForward()
    {
      servo_motor.write(100);
      if(isSAFE)
      {
        moveStop();
        beep(50);
        beep(50);
        Serial.print (1);
        return false;
        SAFE_DISTANCE=true;
      }
        leftMotor.Drive(255);
        rightMotor.Drive(255);
        return true;
        Serial.print (9);
    }
    void moveBackward()
    {
      leftMotor.Drive(-255);
      rightMotor.Drive(-255);
    }
    boolean turnRight()
    {
      servo_motor.write(50);
      if(isSAFE)
      {
        moveStop();
        beep(50);
        beep(50);
        Serial.print (2);
        return false;
        SAFE_DISTANCE=true;
      }
      leftMotor.Drive(128);
      rightMotor.Drive(255);
      Serial.print (8);
    }

    boolean turnLeft()
    {
      servo_motor.write(170);
      if(isSAFE)
      {
        moveStop();
        beep(50);
        beep(50);
        Serial.print (3);
        return false;
        SAFE_DISTANCE=true;
      }
      leftMotor.Drive(255);
      rightMotor.Drive(128);
      Serial.print (7);
    }
    void moveBackRight()
    {
      leftMotor.Drive(-255);
      rightMotor.Drive(128);
    }

    void moveBackLeft()
    {
      leftMotor.Drive(128);
      rightMotor.Drive(-255);
    }

    void setup()
    {
      Serial.begin(9600);
      pinMode(trig_pin, OUTPUT);
      pinMode(echo_pin, INPUT);
      pinMode(buzzerPin, OUTPUT);
      beep(25);
      beep(25);
      beep(25);
      servo_motor.attach(8); //Пин подключения сервомотора
    }

    void loop()
    {
    if (Serial.available()>0) {
        btTimer1 = millis();
        btCommand = Serial.read();
        switch (btCommand)
      {
       
        case 'F':
          moveForward();
          break;
        case 'B':
          moveBackward();
          break;
        case 'L':
          turnLeft();
          break;
        case 'R':
          turnRight();
          break;
        case 'S':
          moveStop();
          break;
        case 'I':  //FR
          turnRight();
          break;
        case 'G':  //FL
          turnLeft();
          break;
        case 'J':  //BR
          moveBackRight();
          break;
        case 'H':  //BL
          moveBackLeft();
          break;
            }
        }
      }
     
    В участок с проверкой по монитору вообще не заходит((
    Код (C++):
    int measureDistance()
    {
      long duration;
      int  distance;
      digitalWrite(trig_pin, LOW);
      delayMicroseconds(3); // 3
      digitalWrite(trig_pin, HIGH);
      delayMicroseconds(10); // 10
      digitalWrite(trig_pin, LOW);

      duration = pulseIn(echo_pin, HIGH);
      Serial.print(4);
      distance = duration / 58;
      if (distance < DISTANCE_MIN )
        {Serial.print (DISTANCE_MIN); return DISTANCE_MIN;}
      if (distance > DISTANCE_MAX )
        {Serial.print (DISTANCE_MAX); return DISTANCE_MAX;}
      Serial.print (distance);return distance;
    }
    boolean isSAFE()
    {
        if (1)
        {
          distance = measureDistance();
          if ( distance < DST_STOP ) //20см
            {
                Serial.print (6);
                return false;
                        }
        } else
                {
                 Serial.print (5);
                return true;
                    }
    }
    В чем ошибка.
     
  2. Daniil

    Daniil Гуру

    Я правильно разглядел, что измерение дистанции вызывается только процедуре isSave? А где вызывается прoцедура isSave? Для Си есть разница в написании:
    isSave; или isSave();?
     
  3. ZAZ-965

    ZAZ-965 Гуру

    Я бы в функцию pulseIn() добавил третий параметр timeout.
    Код (C++):
    duration = pulseIn(echo_pin, HIGH, 30000);
     
  4. parovoZZ

    parovoZZ Гуру

    В Си++ есть разница. Первый - это вызов объекта. Дальше должен идти метод объекта. Си компилятор должен ругаться. Но абдурино - это Си++.
     
  5. Daniil

    Daniil Гуру

    У ТС в if проверяется IsSave, а не isSave()
     
  6. parovoZZ

    parovoZZ Гуру

    У ТС таких функций вообще нет)))
     
  7. Daniil

    Daniil Гуру

    Оу( учу английский дальше
    isSafe, конечно
     
  8. IzeNik

    IzeNik Нуб

    ребят. вы космос. поставил скобки все работает
     
  9. Daniil

    Daniil Гуру

    совет.
    Именуйте процедуры через глагол.
     
  10. parovoZZ

    parovoZZ Гуру

    Пользуйся нормальными IDE, а не огрызками от них.
     
  11. parovoZZ

    parovoZZ Гуру

    Я так понимаю, у тебя в абдурино логирование выключено? Значит предупреждения ты не видишь.