Подключение Sharp 2y0a21
- Войдите на сайт для отправки комментариев
Вс, 01/11/2015 - 12:47
Народ, доброго дня, возникла проблема с подключением дальномера Sharp 2y0a21.
Датчик подключил к A5 arduino uno, между gnd и vcc воткнул конденсатор на 10 микрофарад.
Сам датчик выдает сигнал с шумом, т.е например на 5 примерно одинаковых значение приходится 1 значение отличающееся процентов на 70.
Есть ли какие либо еще особенности подключения датчика и как отфильтровать сигнал ?
Набросал небольшой класс, показания в см. считает по графику из даташита апроксимированному 2 линиями.
SHARP_2Y0A21.h
и SHARP_2Y0A21.cpp
Остаеться еще вопрос, датчик по умолчанию показывает значение 19 см, т.е.
analogRead(_iSensorPort); показывает среднее значение 282 при питании от usb компьютреа, хотя большие расстояния он ловит, так если поднести руку и отдалить ее, то можно получить значение 228 (т.е гдето 1.11 в - 25 см, если я правильно понял)...
з.ы. до этого на С не писал, проект первый, буду очень рад критике и конструктивным предложениями.
А pin А5 у Вас к земдле притянут? Как реагирует, если за провод рукой взяться - прямо поверх изоляции?
Сам датчик выдает сигнал с шумом, т.е например на 5 примерно одинаковых значение приходится 1 значение отличающееся процентов на 70.
Есть ли какие либо еще особенности подключения датчика и как отфильтровать сигнал ?
В моей практике наилучшие результаты для фильтрации одиночных импульсных помех на фоне легкой болтанки показаний давало последовательное применение медианного фильтра с апертурой 5 и усредняющего с той же апертурой. Оба фильтра при непрерывном характере измерений должны быть "скользящими". Если помехи действительно одиночные, то апертуру медианы можно ограничить 3-мя отсчетами. Апертура "скользящего среднего" - по вкусу экспериментатора.
А pin А5 у Вас к земдле притянут? Как реагирует, если за провод рукой взяться - прямо поверх изоляции?
Использую стандартную плату arduino uno, про подтягивающий резистор прочел, попробую...
У меня более менне ровные показатели получаются с использованием медианного фильтра с значением от 7... Плюс метод
int
SHARP_2Y0A21::iGetDistanceSm()
выдает целое значение, что тоже в какойто мере устаканивает сигнал...з.ы. Под "скользящим фильтром" имеется в виду, что я беру последниие 3-5-7-9 показаний?
з.з.ы. В моей реализации, мне не очень нравится сортировка пузырьком, да и вообще сортировка при использовании фильтра... Считаю, что задача решина ВЛОБ, возможно не совсем оптимально, но другого варианта я не придумал. Успокаивает только то, что число сортируемых элементов мало, и при таком кол-ве элементов реализация алгоритма сортировки не существенна.
Подтягивающий резистор не нужен. Нужна программная фильтрация получаемых данных, например, как подсказывает уважаемый Duino A.R..
У меня более менне ровные показатели получаются с использованием медианного фильтра с значением от 7... Плюс метод
int
SHARP_2Y0A21::iGetDistanceSm()
выдает целое значение, что тоже в какойто мере устаканивает сигнал...Медиана прекрасно работает как фильтр от одиночных импульсов. Минимальная и реально работающая апертура - 3. Если апертура уходит за 7, то это - "ненормально". Т.е. на ширину импульса помехи приходится несколько отсчетов, что требует увеличения апертуры и снижения эффективности метода. Действенный способ улучшения ситуации - прорежение отсчетов. Сделайте так, чтобы период между измерениями у Вас был регулируемым и на практике подберите его величину так, чтобы действительно было, как Вы указали в начале - на 5 хороших отсчетов один, отличающийся на 70%. В такой ситуации прекрасно сработает и медиана с апертурой 3. Большое количество отсчетов в Вашем случае будет только мешать. Вам не надо исследовать помеху (тогда это было бы необходимо), Вам нужно ее задавить.
Медиана режет только импульсные помехи. Болтанка устраняется другими средствами. Обычно это либо усреднение, либо цифровые ФНЧ, либо еще всяко. Усреднение на практике просто реализуется и работает хорошо при мелкой болтанке значений. Если появляются помехи другого вида, то дело усложняется. Но все конкретно. В своей системе я даже делал возможность интерактивного подбора последовательности и параметров цифровых фильтров для каждого конкретного случая применения. Помогало.
з.ы. Под "скользящим фильтром" имеется в виду, что я беру последниие 3-5-7-9 показаний?
з.з.ы. В моей реализации, мне не очень нравится сортировка пузырьком, да и вообще сортировка при использовании фильтра... Считаю, что задача решина ВЛОБ, возможно не совсем оптимально, но другого варианта я не придумал. Успокаивает только то, что число сортируемых элементов мало, и при таком кол-ве элементов реализация алгоритма сортировки не существенна.
Фильтры со "скользящей" апертурой работают следующим образом. При пуске фильтра сначала набираются разгонные точки, чтобы заполнить реальными отсчетами всю апертуру. Фильтр срабатывает первый раз. Потом все значения в апертуре стдвигаются на одну позицию так, чтобы самый старый отсчет отбросить совсем, а на место самого молодого поместить только что сделанный отсчет. Фильтр срабатывает. Данные в апертуре снова сдвигаются. Добавляется один новый отсчет. Фильтр срабатывает. И так по кругу. Теперь фильтр вышел на стационарный режим.
Может оказаться, что лучшие результаты дадут реккурентные фильтры. Т.е. значения с выхода фильтра не только идут дальше, но и вносятся на место отфильтрованных значений в апертуру фильтра и участвуют в расчетах наравне с "чистыми отсчетами".
з.з.ы. В моей реализации, мне не очень нравится сортировка пузырьком, да и вообще сортировка при использовании фильтра... Считаю, что задача решина ВЛОБ, возможно не совсем оптимально, но другого варианта я не придумал. Успокаивает только то, что число сортируемых элементов мало, и при таком кол-ве элементов реализация алгоритма сортировки не существенна.
Следует различать метод и его реализацию. Метод медианного фильтра работает эффективно. Если не нравится "пузырьковая" реализация... Ну не нравится. :) В сети попадались всякие методы оптимизации расчетных схем медианной фильтрации. Хороша та реализация, которая реализует, то что требуется при приемлемых трудозататах. :)
1. Обнаружил, что один из самых эффективныфх методов фильтрации - аппаратный, т.е. простая RC-цепочка на входе АЦП/
2. В свое время сравнивал различные алгоритмы сортировки. Выяснилось, что при длине выборки примерно до 20 самый быстрый - пузырек. Правда, это на PC с его длинным конвейером. Но, думаю, при 5 отсчетах что-либо эффективнее пузырька вряд ли существует.
3. По поводу реализации апертурного фильтра: создается кольцевой буфер. По мере заполнения подсчитывается сумма. В процессе работы очередной отсчет прибавляется к сумме, отсчет, хранящийся в очередной ячейка кольцевого буфера, вычитается из суммы, после чего на его место кладется очередной отсчет и текущая позиция кольцевого буфера сдвигается на 1. В качестве отфильтрованнго значения берется сумма, домноженная на масштабирующий коэффициент.