Разные данные с ультразвукового дальномера HC-SR04

Тема в разделе "Arduino & Shields", создана пользователем enclouder, 2 ноя 2015.

  1. enclouder

    enclouder Нерд

    Доброго времени суток.
    Подскажите, в чем может быть проблема?
    Подключаю дальномер, направляю на стену - показывает точное расстояние.
    Как только ставлю перед ним и стеной палец или жестко зафиксированный предмет, толщиной с палец (например маркер), то показания колеблятся в пределах 5 сантиметров.
    Может показывать как 8, так и 13 сантиметров.
    Пример: 8,13,11,8,8,8,10,8,9,13,11,8,12
    Вот такие значения выходят при том, что препятствие остается неподвижным.
    Если взять расстояние чуть дальше - сантиметров 20-30 от дальномера, погрешность такая же с таким же разбегом значений.
    Что то большая слишком погрешность получается.
    Дальномер закреплен на макетной плате, стена ровная, ничего не шевелится - ни провода ни препятствие.
    Бывает вообще, ставлю препятствие посередине а он его игнорирует.
    Использовал библиотеку Ultrasonic и функцию pulseIn() - результат один и тот же.
    При всем при этом пробовал на 2х дальномерах, дабы исключить неисправность одного из них.
    В интернете где ни читаю, у всех работает с минимальными погрешностями.
    Что сделать, что проверить?

    P.S. подключаю по стандарту в соответствии с типовыми схемами.
     
  2. Onkel

    Onkel Гуру

    ----В интернете где ни читаю, у всех работает с минимальными погрешностями.
    если в стенку лупить - возможно, да, погрешность невелика. В реале даже в картонной коробке может прыгать, проверено на нескольких типах уз, как на аналоговых так и на цифровых, прога в С.
     
  3. enclouder

    enclouder Нерд

    хм.. что теперь? оптические или инфракрасные дальномеры для точности?
     
  4. Onkel

    Onkel Гуру

    хороший уз сонар стоит 150 американских рублей, такие в столбиках стоят.
     
  5. Vetrinus

    Vetrinus Гик

    Для отсева скачков замеров используйте медиану из 10-20 замеров.
    Вам нужно в начале каждого цикла заносить в массив новое измерение, затем обновлять данные в массиве, заменяя более старые данные новыми, затем нужно отсортировать массив в порядке возрастания, и после этого найти медиану. Скачки значений отсутствуют как класс, график получившихся функций монотонный на промежутках возрастания и убывания.
     
    Последнее редактирование: 3 ноя 2015
  6. enclouder

    enclouder Нерд

    Все понял, кроме последнего предложения. Поясните, пожалуйста, поподробнее. Что значит скачки значений отсутствуют как класс? и что вы имеете ввиду под монотонным графиком с промежутками возрастания и убывания?
     
  7. Onkel

    Onkel Гуру

    совет товарища суть совет удалять гланды через задний проход. сугубо имхо. Если вам нужна точность, то покупайте точные дальномеры, либо самому лепить из излучателя, приемника и селективного приемника . Если точность не нужна, то и фигней с 20 замерами заниматься не надо. Что вам нужно регистрировать - палец или стену? На пальце по любому будет ошибка, потому что угол уз порядка 10-15 градусов, соответственно на палец отразится малая часть и точного значения вы вряд ли получите.
     
  8. Onkel

    Onkel Гуру

    "такая же" - относительная такая же или абсолютная? Значения повторяются? Если такая же абсолютная, то может имеет смысл посмотреть на работу таймера, в частности, на сброс предделителя перед измерением. У меня обычно если врет, то врет всегда одинаково, например показывает 20 значение 100 см и один раз 108 см, далее по кругу, при этом 108 может вылететь в любой момент,т.е скорее всего не связано с предделителями и прочими фичами мк.
     
  9. Vetrinus

    Vetrinus Гик

    Мсье знает толк в извращениях) Вообще, при использовании этого (очень дешевого (не 150 американских рублей, ага)) датчика у меня появился ряд выводов:
    1)Датчик реально точный, когда дело касается плоскости, хорошо отражающей звук (что, вообще-то говоря, указано в спецификациях)
    2) Но существуют косяки непонятной природы, когда датчик вместо реального расстояния, показывает что-то около 3338.00... (существует ряд случаев, когда подобные скачки ведут к очень плохим последствиям, если обрабатывать измерения сразу в цикле)
    Именно со вторым я и боролся. В конечном итоге я получил идеально работающую систему с отсевом скачков значений очень дешево.
    Скачки измерений, это то, что описано в п.2
    Под монотонностью графика на промежутках возрастания и убывания я понимал эмпирически выведенный график зависимости расстояния от времени. Монотонность - это определение из начала мат. анализа:
    Функция f (x) называется убывающей на промежутке D, если для любых чисел x1 и x2из промежутка D таких, что x1 < x2, выполняется неравенство f (x1) > f (x2). Если функция возрастает или убывает на некотором промежутке, то она называется монотонной на этом промежутке.
     
    Последнее редактирование: 3 ноя 2015
  10. Onkel

    Onkel Гуру

    1 когда направляешь в стену- иногда выдает +- 10-15% значение, потом опять нормальное. Где-то раз на 50/ 100 отсчетов
    2 3338 - я замечал похожее, причем четко повторялось, когда крутишь сонар - четко при тех же углах. имхо возникает какой-то уз резонанс, если заглушить немного место отражения (бумажкой или салфеткой), то 3338 пропадает и начинает мерять нормально.
    3 отсчет по методу медианы в случае переменного значения будет вести себя примерно как 10-20 значное скользящее среднее, что часто неприемлемо. В моей задаче, например, проще отработать выброс , чем гонять мк и усреднять по 10-20 значениям. дело в том, что , например, на 3 метрах мы не получим отклик ранее, чем через 10 мс, и скользящее по 20 значениям даст нам тау 0,2 с. На скорости 10 м/с это 2 метра пути. Поэтому пусть лучше лишний раз притормозит чем разобьется. Так сказать потеря очков, но не потеря матча. А метод медианы работает, когда мк нечего делать и он будет считать, сортировать и опять считать. Ну и как бы помягче сказать - если тс не совсем понимает последнее предложение вашего предыдущего совета, то вряд ли он без посторонней помощи реализует весь алгоритм, так что в следующий раз когда будете давать такой совет сразу пишите и весь код.
     
  11. Vetrinus

    Vetrinus Гик

    Нашел еще одну либу для работы с этим датчиком:
    http://playground.arduino.cc/Code/NewPing#.UzGBePl_sXw
    Как поведет себя - не знаю, можно попробовать.
    Вот код, как сделано у меня, пользуйтесь:
    Код (C++):
    float distance[20];
    boolean state;

    Ultrasonic us_1 (2, 3); //2 -Триггер, 3- Эхо
    void setup() {
      pinMode(6, OUTPUT);
      //  pinMode(8, OUTPUT);
      Serial.begin(9600);
      for (byte i = 0; i < 20; i++) {
        distance[i] = us_1.Ranging(CM);
      }
    }
    void loop() {
      distance[0] = us_1.Ranging(CM); //Новый замер
      delay(150);
      byte previous = 18;
      byte current = 19;
      for (byte i = 1; i < 20; i++) {             //Функция для обновления данных в массиве
        distance[current] = distance[previous];
        previous--;
        current--;
      }
      bool leave = false;          //Функция для сортировки массива в порядке возрастания
      float temp;
      while (!leave) {
        leave = true;
        byte i = 0;
        for (byte counter = 0; counter < 19; counter++) {
          if (distance[i] > distance[i + 1]) {
            temp = distance[i];
            distance[i] = distance[i + 1];
            distance[i + 1] = temp;
            leave = false;
          }
          i++;
        }
      }
      float Median = (distance[9] + distance[10]) / 2; //расчет медианы
      Serial.println(Median);
    Ну а у меня МК занимается учетом количества воды в емкостях, выводом инфы на экран, а также контролем магистрального и скважинного насосов. В первоначальном варианте каждый скачок был чреват выключением-включением скважинного насоса, и следующим за ним гидроударом)) Поэтому я лучше заставлю МК гонять массив (около 70 мс на все расчеты), чем буду терпеть возможные последствия.
     
  12. Onkel

    Onkel Гуру

    а откуда скачки, приводящие к включению насоса? У меня стоят датчики давления 4-20 мА, за примерно 9 лет не было вроде ни одного случая, чтобы откуда - ни-возьмись появились данные , включающие просто так насос. Да и в пром. автоматике - там же датчики не по баксу. Впрочем, метод работает, когда , как писалось, мк делать нечего и процессы медленные. А с насосом - конечно, куда торопиться, Там характерные времена в лучшем случае - минуты.
     
  13. Vetrinus

    Vetrinus Гик

    Вы меня немного неправильно поняли) Там вообще никаких датчиков изначально не было. Весь контроль вручную производился. Смотреть, чтобы скважина воды в резервуары не перелила, смотреть, чтобы магистральный насос воздуха не хватанул, все это делать без какой-либо индикации уровня воды... Ужс,в общем. А сейчас вполне прилично вышло, по моим скромным меркам.
    А вот в поливной емкости, вы бы видели этот "промышленный датчик"))) Работает раз в полгода. буду на работе, даже сфотографирую.
     
    Последнее редактирование: 4 ноя 2015
  14. Onkel

    Onkel Гуру

    в какой-то теме про cонары обсуждалось, ушло , попробую тут - зависимость отсчета сонара от угла между лучом сонара и отражателем (картонка). Красные - плацебо перпендикуляр, остальные - три прокрутки картонки. Расстояние в мм. Крестики просто для ясности, величина лучей крестика произвольна (не отражает ошибку).
     

    Вложения:

  15. Onkel

    Onkel Гуру

    пы сы получается несимметрично - если с одной стороны, то чует стенку чуть ли не параллельную (со стороны видимо излучателя, от 5 градусов), если со стороны приемника - то при угле (к стенке) менее 20 градусов сонар стенку не видит.