Помоги пожалуйста!! Дальномер HC-SR04 показывает страные значения

Тема в разделе "Arduino & Shields", создана пользователем TOURERV, 21 ноя 2014.

?

Что не правельно?!

  1. неправельный код

    0 голосов
    0,0%
  2. плохой дальномер

    0 голосов
    0,0%
Можно выбрать сразу несколько вариантов.
  1. TOURERV

    TOURERV Нуб

    Здравствуйте , хочу сделать робота объезжающего препятствия с дальномером :
    HC-SR04 . И для более точных показаний ищу средне арифметическое с помощью оператора For . Но дальномер показывает какую-то фигню((
    Код (Text):
    #define Trig  9
    #define Echo  8
    #define LED_PIN 12
    #define LED_PIN_TWO 13

    void setup ()
    {
      pinMode(Trig, OUTPUT);
      pinMode(Echo, INPUT );
      pinMode(LED_PIN, OUTPUT);
      pinMode(LED_PIN_TWO, OUTPUT);
      Serial.begin(9600); // задаём скорость общения
    }
    unsigned int impulseTime = 0;
    unsigned int distance_sm = 0;
    unsigned int distance_sm_sr = 0;
    unsigned int distance    = 0;

    void loop ()
    {
      for( int i=0; i<=100; i++)
      {
      digitalWrite(Trig, HIGH);  // подаём импульс на выход trig
      delayMicroseconds(10);    // равный 10 микросекунд
      digitalWrite(Trig, LOW);  // отключае
      impulseTime=pulseIn(Echo, HIGH);
      delay(100);
      distance_sm = (distance_sm + impulseTime);
      }
      distance_sm_sr = ( distance_sm / 100);
      distance = (distance_sm_sr / 58);
      Serial.println(distance);
      if (distance < 100)
      {
        digitalWrite(LED_PIN, HIGH);
        digitalWrite(LED_PIN_TWO, LOW);
      }
        else
        {
          digitalWrite(LED_PIN, LOW);
          digitalWrite(LED_PIN_TWO, HIGH);
        }
    }
    [/SIZE]
     
  2. ANV

    ANV Гуру

    1. А distance_sm обнулить после прохода основного цикла?
    2. int не резиновый, переполнение
     
  3. Defender

    Defender Нерд

    При увеличении расстояния больше чем 400 мм, дальномер показывает ноль и всё. "Возвращение" его к меньшим расстояниям ничего не даёт, постоянно пишется ноль в мониторе порта. Что это может быть?

    intechoPin=9;
    inttrigPin=8;

    voidsetup(){
    Serial.begin(9600);
    pinMode(trigPin,OUTPUT);
    pinMode(echoPin,INPUT);
    }

    voidloop(){
    intduration,cm;
    digitalWrite(trigPin,LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin,HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin,LOW);
    duration=pulseIn(echoPin,HIGH);
    cm=duration/58;
    Serial.print(cm);
    Serial.println(" cm");
    delay(100);
    }
     
  4. Tomasina

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

    эээ? 008russian_ru[1].gif Так вы сглаживаете показания, но не делаете их более точными.
     
  5. Defender

    Defender Нерд

    Проверял на разных платах. Эффект один и тот же - датчик зависает при увеличении дистанции более 400-500 см и показывает всё время ноль. Помагает только перезаливка скетча.
    Кто-нибудь сталкивался с такой проблемой? И вообще что должен показывать датчик при увеличении допустимой дистанции? Может это зависание нормальный рабочий процесс и мне не надо париться?
     
  6. Kopilov

    Kopilov Гик

    Вот две аналогичные темы:
    HC SR04 глючит и показывает нули
    HC-SR04: на больших дистанциях показывает нуль, и больше не замеряет расстояние, выводя нули((
     
  7. Kopilov

    Kopilov Гик

    В каком смысле?Если вспомнить лабораторные работы по физике с первого курса -- там мы всё, вплоть до длины и массы, меряли по 5-10 раз, потом считали среднее арифметическое, "чтобы найти точное значение". С точностью до попутно найденной погрешности разброса, конечно.
    Ну а аппаратную погрешность таким образом не победить.
     
    Последнее редактирование: 29 мар 2015
  8. Defender

    Defender Нерд

    Kopilov, ни в одной из этих тем, кроме описания проблемы, нет решения. Поэтому вопрос, что должен показывать нормально работающий датчик при увеличении допустимой дистанции? Может они все зависают в этом случаи и тогда никакой проблемы нет?
     
  9. Kopilov

    Kopilov Гик

    Очевидно, датчик ждёт эха и при большой дистанции не может дождаться (затухание сигнала). Расстояние "бесконечно", вместо бесконечности выводится ноль. Можно воспринимать его, как null/undefined: эха нет -- замер не произведён.

    А какая-то возможность сбросить датчик программно из скетча (альтернативы были: reset/перезаливка скетча, щелчок пальцами -- эмуляция эха), наверно, должна быть. Но у меня сейчас нет ни времени, ни аппаратуры, чтобы проэкспериментировать.
     
    Defender нравится это.
  10. Defender

    Defender Нерд

    Щелчок пальцами конечно помогает, но всё таки это так и должно быть или это брак датчика?
     
  11. Kopilov

    Kopilov Гик

    Так должно быть, если алгоритм: "не посылать новый сигнал, пока не дождались эха от старого" -- надеюсь, понятно, почему. Где этот алгоритм заложен: в Вашем скетче, в библиотеке, в прошивке датчика -- не знаю. Попробуйте добавить условие "отправить новый сигнал, если ответ от старого не пришёл через n миллисекунд".
     
    Defender нравится это.
  12. Defender

    Defender Нерд

    Я уж было думал что проблема с датчиком. Буду совершенствовать скетч. Спасибо большое!