Неправильно работает код.

Тема в разделе "Arduino & Shields", создана пользователем King_Sombra, 13 фев 2019.

  1. King_Sombra

    King_Sombra Нуб

    Делаю робот-пылесос и для определения препятствий стоят два датчика HC-SR04.Глаза должны работать по отдельности для поворота в определённую сторону.Но работают сразу два.В Из-за этого если препятствие видно отдельно на левом или правом ,то робот не поворачивает.
    Помогите пожалуйста.
    Вот код:
    //Глаза
    //Левый
    #define left_trig 2;//левый выход
    #define left_echo 3;//левый вход
    //Правый
    #define right_trig 4;//правый выход
    #define right_echo 5;//правый вход
    //Двигатель
    //Левый
    #define ENA 6
    #define IN1 7
    #define IN2 8
    //Правый
    #define ENB 9
    #define IN3 10
    #define IN4 11
    //переменные для расчётов
    unsigned int impulseTime_left=0;//Имульс левого глаза
    unsigned int impulseTime_right=0;//Импульс правого глаза
    unsigned int distance_left_cm=0;//дистанция с левого глаза
    unsigned int distance_right_cm=0;//дистанция с правого глаза
    int xx=2; //делитель

    void setup() {
    //Назначение пинов
    pinMode(2,OUTPUT);//левый выход
    pinMode(4,OUTPUT);//правый выход
    pinMode(3,INPUT);//левый вход
    pinMode(5,INPUT);//правый вход
    pinMode(6,OUTPUT);//обороты левого
    pinMode(9,OUTPUT);//обороты правого
    pinMode(7,OUTPUT);//двигатель
    pinMode(8,OUTPUT);//двигатель
    pinMode(10,OUTPUT);//двигатель
    pinMode(11,OUTPUT);//двигатель
    }
    void w(){ //вперёд
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    analogWrite(6, 50);
    analogWrite(9, 50);
    analogWrite(6, 100);
    analogWrite(9, 100);
    }
    void a(){ //налево
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW);
    digitalWrite(10, LOW);
    digitalWrite(11, HIGH);
    analogWrite(6, 50);
    analogWrite(9, 50);
    analogWrite(6, 100);
    analogWrite(9, 100);
    }
    void d(){ //направо
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, LOW);
    analogWrite(6, 50);
    analogWrite(9, 50);
    analogWrite(6, 100);
    analogWrite(9, 100);
    }

    //Бесконечный цикл
    void loop() {
    //Глаза смотрят/проверяют
    //Левый глаз
    digitalWrite(2, HIGH);//вкл и импульс вышел
    delayMicroseconds(10);//длинна импулся 10милисекунд
    digitalWrite(2, LOW);//выкл
    impulseTime_left=pulseIn(3, HIGH);//приёмник вкл
    distance_left_cm=impulseTime_left/58; //перевод дистаниции в см
    delay(100);// минус помехи
    delay(200);//на всякий случай
    digitalWrite(4, HIGH);//вкл и импульс вышел
    delayMicroseconds(10);//длинна импулся 10милисекунд
    digitalWrite(4, LOW);//выкл
    impulseTime_right=pulseIn(5, HIGH);//приёмник вкл
    distance_right_cm=impulseTime_right/58; //перевод дистаниции в см
    delay(100);//минус помехи
    //Направление движения
    if (distance_left_cm <= 15 && distance_right_cm <= 15 ) {w();
    } //нет препятствий //вперёд
    if(distance_left_cm <= 15 && distance_right_cm <= 5 ) {d();} //препятствие с права //поворот на право
    if(distance_left_cm <= 5 && distance_right_cm <= 15 ) {a();} //препятствие слева //поворот на лево
    if (distance_left_cm <= 5 && distance_right_cm <= 5 )
    {
    if
    (random(0,100)%xx
    )

    {a();}

    }

    else{d();} //препятствие в плотную //

    }
     
  2. DetSimen

    DetSimen Гуру

    Код работает именно так как написан. В данном случае -бизабразна.
     
    Tomasina, BAR__MEN и parovoZZ нравится это.
  3. Asper Daffy

    Asper Daffy Гуру

    Ну, сам-то смотри. Вот твои условия

    1. if (distance_left_cm <= 15 && distance_right_cm <= 15 )
    2. if(distance_left_cm <= 15 && distance_right_cm <= 5 )
    3. if(distance_left_cm <= 5 && distance_right_cm <= 15 )
    4. if (distance_left_cm <= 5 && distance_right_cm <= 5 )

    Подумай, какое условие сработает, если левое 4, а правое = 10. Одно сработает? Или несколько сразу?