Подключение 2-ух ультразвуковых дальномеров HC-SR04 (программа)

Тема в разделе "Arduino & Shields", создана пользователем vlasov-serg-27, 21 июн 2014.

  1. Здравствуйте, в проекте требуется подключить 2 ультразвуковых дальномера. При получении данных от дальномеров принимается решение в какую сторону совершить поворот манипулятору. Возникла проблема судя по работе сразу после включения с левого дальномера приходит значение нуля, и совершается поворот в его сторону, хотя предметов нет. Следующее его значение соответствует расстоянию до стены.
    Вот текст программы для определения расстояния (без кусков на повороты манипулятора):
    //PIN UZD
    int uE1=26; //UZD RIGHT ECHO
    int uT1=27; //UZD RIGHT TRIG
    int uE2=28; //UZD LEFT ECHO
    int uT2=29; //UZD LEFT TRIG
    void setup()
    {
    //SETUP SERIAL
    Serial.begin(9600);
    Serial.println("PROJECT TEST");
    pinMode(uE1, INPUT);
    pinMode(uT1, OUTPUT);
    pinMode(uE2, INPUT);
    pinMode(uT2, OUTPUT);
    }
    void loop()
    {
    //UZD RIGHT
    digitalWrite(uT1, LOW);
    delayMicroseconds(2);
    digitalWrite(uT1, HIGH);
    delayMicroseconds(10);
    digitalWrite(uT1, LOW);
    int d1=pulseIn(uE1, HIGH);
    d1=d1/58;
    //UZD LEFT
    digitalWrite(uT2, LOW);
    delayMicroseconds(2);
    digitalWrite(uT2, HIGH);
    delayMicroseconds(10);
    digitalWrite(uT2, LOW);
    int d2=pulseIn(uE2, HIGH);
    d2=d2/58;
    //COM-PORT SERIAL
    //COM-PORT UZD RIGHT
    Serial.print(d1);
    Serial.print(" ");
    Serial.print("cm UZV RIGHT");
    Serial.print(" ");
    Serial.println(" ");
    //COM-PORT UZD LEFT
    Serial.print(d2);
    Serial.print(" ");
    Serial.print("cm UZV LEFT");
    Serial.print(" ");
    Serial.println(" ");
    if (d1<=20)
    {
    //POVOROT RIGHT
    }
    else if (d2<=20)
    {
    //POVOROT LEFT
    }
    else
    {
    //STOP MANIPULATOR
    }
    }

    Монитор COM-Porta:
    PROJECT TEST
    43 cm UZV RIGHT
    0 cm UZV LEFT
    44 cm UZV RIGHT
    77 cm UZV LEFT
    44 cm UZV RIGHT
    68 cm UZV LEFT
    44 cm UZV RIGHT
    77 cm UZV LEFT

    Как видно из монитора COM-Porta: первый опрос правого датчика выдает 43 см, а левый выдает 0 см. В следующий момент все приходит в норму: правый 44 см, левый 77 см.
    Как убрать этот ноль при первом опросе, он портит всю систему. Как только включаю совершает сразу поворот в левую сторону.
     
  2. Unixon

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

    Просто игнорируйте заведомо неверное значение.
     
  3. Как его игнорировать? если от этого значения зависит поворот.
     
  4. Unixon

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

    Пропустить, использовать следующее.
     
  5. Unixon

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

    Перед началом движения считываете дальномеры, выкидываете это измерение, потом начинаете движение и уже ориентируетесь на адекватные показания приборов.
     
  6. все уже решили данный вопрос изменение программы.
    if ((d1<=20) && (d1>0))
    {
    //POVOROT RIGHT
    }
    else if ((d2<=20) && (d2>0))
    {
    //POVOROT LEFT
    }
    Так работает, и не реагирует на первый опрос датчиков
     
  7. 14MR

    14MR Нуб

    По-моему вариант, предложенный выше лучше. Ведь нет гарантии, что расстояние != 0 см.
     
  8. Jedi Kriks

    Jedi Kriks Нерд

    Самый распространенный и эффективный алгоритм забыли: Moving Average

    У меня сейчас такая же задача, но только один HC-SR04 стоит. После экспериментов обнаружил, что он грешит частенько если объект находится дальше чем на дистанции в 50 см. То есть объект допусти на расстоянии 160 см или вообще отсутствует, а сенсор возвращает тебе от 5 до 10 см.
     
  9. кусок кода из сообщения #6, самый оптимальный. У дальномера мертвая зона 2 см, так что однозначно можно сказать что значения 0,1 в см. это ошибочные и их можно откинуть. Кусок кода можно даже изменить вот так:
    if ((d1<=20) && (d1>=2))
    {
    //POVOROT RIGHT
    }
    else if ((d2<=20) && (d2>=2))
    {
    //POVOROT LEFT
    }
    в таком варианте, значения мене 2 см, вообще не воспринимаются.
     
  10. Unixon

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

    Не всегда вариант. Сильные "выколы" имеют интегрально больший вес и сильнее сбивают среднее, чем нормальные измерения. Ну и из-за "окна" реакция получается замедленной...