Всем доброго дня. Есть такая ситуация: подключил к Arduino аналоговый дальномер, снимаю с него показания, понятно, что они колеблются в определенном диапазоне, но также присутствует кратковременная выдача дальномером резко отличающегося значения. Соответственно имею 3 вопроса: 1. Как отфильтровать резкий скачок значений если он ложный, а не возникновение реального препятствия? 2. Как получать плавные показания (т.е. фактически построить плавную кривую или возвращать плавно изменяющуюся величину)? 3. Можно ли решить данную проблему фильтрации несложным аппаратным путем, а не программным? (дальномер подключен к ардуино по 3-м проводам, ничего дополнительного не ставил)
Самый простой вариант: заводим массив для хранения нескольких последних показаний дальномера; все показания пишем в массив; когда массив заполнится, выбрасываем самое старое показание и все сдвигаем (а ля FIFO); считаем среднее по всему массиву и сравниваем с каждым новым показанием дальномера; если показание очень сильно отличается от среднего и считается, что такого произойти не могло - выбрасываем его.
А если это не ложные показания, а обнаружение реального препятствия? То эти данные тоже вылетят? Получается так.
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]
Про включение конденсатора я прочитал на каком-то форуме четырехлетней давности, ничем его там не аргументируют, просто предлагают как вариант. Ну вообще планировал отсеить ложные показания подождав полсекунды и измерить расстояние снова, если подтверждается то это препятствие, если нет то ложные данные. Затем наполнял массив данными и считал среднее арифметическое, при этом сдвигая значения в массиве вверх по мере его наполнения. Но почему-то не заработало как планировалось. Видел видеозапись лампы которая собирается из инфракрасного дальномера и светодиодов. Проводим над лампой рукой она включается или выключается, а если задерживаем руку то поднимая или опуская ее над лампой регулируем яркость. Суть алгоритма именно такая, но у меня вместо светодиода двигатели и ложное срабатывание полностью сбивает необходимые действия. Автор лампы то как-то добился стабильной работы? И дальномер там всего один. И фильтра никакого на входе сигнала нет. А использовать второй дальномер в моем случае не вариант. А про RC цепочку можно подробнее. Насколько я понимаю это конденсатор и резистор, что-то вроде делителя напряжения с емкостью, но что даст его включение и как подобрать элементы не очень понял.