Фильтр данных аналогового дальномера

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Rodstan, 29 янв 2014.

  1. Rodstan

    Rodstan Нерд

    Всем доброго дня.
    Есть такая ситуация: подключил к Arduino аналоговый дальномер, снимаю с него показания, понятно, что они колеблются в определенном диапазоне, но также присутствует кратковременная выдача дальномером резко отличающегося значения.

    Соответственно имею 3 вопроса:
    1. Как отфильтровать резкий скачок значений если он ложный, а не возникновение реального препятствия?
    2. Как получать плавные показания (т.е. фактически построить плавную кривую или возвращать плавно изменяющуюся величину)?
    3. Можно ли решить данную проблему фильтрации несложным аппаратным путем, а не программным? (дальномер подключен к ардуино по 3-м проводам, ничего дополнительного не ставил)
     
  2. Megakoteyka

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

    Самый простой вариант:
    заводим массив для хранения нескольких последних показаний дальномера; все показания пишем в массив; когда массив заполнится, выбрасываем самое старое показание и все сдвигаем (а ля FIFO); считаем среднее по всему массиву и сравниваем с каждым новым показанием дальномера; если показание очень сильно отличается от среднего и считается, что такого произойти не могло - выбрасываем его.
     
  3. Rodstan

    Rodstan Нерд

    А если это не ложные показания, а обнаружение реального препятствия? То эти данные тоже вылетят? Получается так.
     
  4. Rodstan

    Rodstan Нерд

    И еще. Люди предлагают включить между сигнальной линией и землей конденсатор. Это может помочь?
     
  5. Megakoteyka

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

    А люди аргументируют чем-то такое решение?
     
  6. Unixon

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

    1) Кто и как будет определять где реальное препятствие, а где ложный скачок? У системы из одного дальномера нет никакой априорной информации, чтобы различить эти два случая. Можно второй дальномер поставить и сравнивать их показания.

    2) Как обычно, осреднением. Либо RC цепочку на линию, либо вычислять скользящее среднее. Тут даже массива не нужно хранить.

    Код (Text):

    const float weight = 0.01;
    float a = 0.0;

    float distance()
    {
     float x = analogRead(PIN_SENSOR);
     a += (x-a)*weight;
     return a;
    }
     
    3) Можно, RC цепочкой.[/code]
     
    Megakoteyka нравится это.
  7. Rodstan

    Rodstan Нерд

    Про включение конденсатора я прочитал на каком-то форуме четырехлетней давности, ничем его там не аргументируют, просто предлагают как вариант.

    Ну вообще планировал отсеить ложные показания подождав полсекунды и измерить расстояние снова, если подтверждается то это препятствие, если нет то ложные данные. Затем наполнял массив данными и считал среднее арифметическое, при этом сдвигая значения в массиве вверх по мере его наполнения. Но почему-то не заработало как планировалось.

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

    А про RC цепочку можно подробнее. Насколько я понимаю это конденсатор и резистор, что-то вроде делителя напряжения с емкостью, но что даст его включение и как подобрать элементы не очень понял.