Доброго времени суток. Подскажите, в чем может быть проблема? Подключаю дальномер, направляю на стену - показывает точное расстояние. Как только ставлю перед ним и стеной палец или жестко зафиксированный предмет, толщиной с палец (например маркер), то показания колеблятся в пределах 5 сантиметров. Может показывать как 8, так и 13 сантиметров. Пример: 8,13,11,8,8,8,10,8,9,13,11,8,12 Вот такие значения выходят при том, что препятствие остается неподвижным. Если взять расстояние чуть дальше - сантиметров 20-30 от дальномера, погрешность такая же с таким же разбегом значений. Что то большая слишком погрешность получается. Дальномер закреплен на макетной плате, стена ровная, ничего не шевелится - ни провода ни препятствие. Бывает вообще, ставлю препятствие посередине а он его игнорирует. Использовал библиотеку Ultrasonic и функцию pulseIn() - результат один и тот же. При всем при этом пробовал на 2х дальномерах, дабы исключить неисправность одного из них. В интернете где ни читаю, у всех работает с минимальными погрешностями. Что сделать, что проверить? P.S. подключаю по стандарту в соответствии с типовыми схемами.
----В интернете где ни читаю, у всех работает с минимальными погрешностями. если в стенку лупить - возможно, да, погрешность невелика. В реале даже в картонной коробке может прыгать, проверено на нескольких типах уз, как на аналоговых так и на цифровых, прога в С.
Для отсева скачков замеров используйте медиану из 10-20 замеров. Вам нужно в начале каждого цикла заносить в массив новое измерение, затем обновлять данные в массиве, заменяя более старые данные новыми, затем нужно отсортировать массив в порядке возрастания, и после этого найти медиану. Скачки значений отсутствуют как класс, график получившихся функций монотонный на промежутках возрастания и убывания.
Все понял, кроме последнего предложения. Поясните, пожалуйста, поподробнее. Что значит скачки значений отсутствуют как класс? и что вы имеете ввиду под монотонным графиком с промежутками возрастания и убывания?
совет товарища суть совет удалять гланды через задний проход. сугубо имхо. Если вам нужна точность, то покупайте точные дальномеры, либо самому лепить из излучателя, приемника и селективного приемника . Если точность не нужна, то и фигней с 20 замерами заниматься не надо. Что вам нужно регистрировать - палец или стену? На пальце по любому будет ошибка, потому что угол уз порядка 10-15 градусов, соответственно на палец отразится малая часть и точного значения вы вряд ли получите.
"такая же" - относительная такая же или абсолютная? Значения повторяются? Если такая же абсолютная, то может имеет смысл посмотреть на работу таймера, в частности, на сброс предделителя перед измерением. У меня обычно если врет, то врет всегда одинаково, например показывает 20 значение 100 см и один раз 108 см, далее по кругу, при этом 108 может вылететь в любой момент,т.е скорее всего не связано с предделителями и прочими фичами мк.
Мсье знает толк в извращениях) Вообще, при использовании этого (очень дешевого (не 150 американских рублей, ага)) датчика у меня появился ряд выводов: 1)Датчик реально точный, когда дело касается плоскости, хорошо отражающей звук (что, вообще-то говоря, указано в спецификациях) 2) Но существуют косяки непонятной природы, когда датчик вместо реального расстояния, показывает что-то около 3338.00... (существует ряд случаев, когда подобные скачки ведут к очень плохим последствиям, если обрабатывать измерения сразу в цикле) Именно со вторым я и боролся. В конечном итоге я получил идеально работающую систему с отсевом скачков значений очень дешево. Скачки измерений, это то, что описано в п.2 Под монотонностью графика на промежутках возрастания и убывания я понимал эмпирически выведенный график зависимости расстояния от времени. Монотонность - это определение из начала мат. анализа: Спойлер: Монотонность - это Функция f (x) называется убывающей на промежутке D, если для любых чисел x1 и x2из промежутка D таких, что x1 < x2, выполняется неравенство f (x1) > f (x2). Если функция возрастает или убывает на некотором промежутке, то она называется монотонной на этом промежутке.
1 когда направляешь в стену- иногда выдает +- 10-15% значение, потом опять нормальное. Где-то раз на 50/ 100 отсчетов 2 3338 - я замечал похожее, причем четко повторялось, когда крутишь сонар - четко при тех же углах. имхо возникает какой-то уз резонанс, если заглушить немного место отражения (бумажкой или салфеткой), то 3338 пропадает и начинает мерять нормально. 3 отсчет по методу медианы в случае переменного значения будет вести себя примерно как 10-20 значное скользящее среднее, что часто неприемлемо. В моей задаче, например, проще отработать выброс , чем гонять мк и усреднять по 10-20 значениям. дело в том, что , например, на 3 метрах мы не получим отклик ранее, чем через 10 мс, и скользящее по 20 значениям даст нам тау 0,2 с. На скорости 10 м/с это 2 метра пути. Поэтому пусть лучше лишний раз притормозит чем разобьется. Так сказать потеря очков, но не потеря матча. А метод медианы работает, когда мк нечего делать и он будет считать, сортировать и опять считать. Ну и как бы помягче сказать - если тс не совсем понимает последнее предложение вашего предыдущего совета, то вряд ли он без посторонней помощи реализует весь алгоритм, так что в следующий раз когда будете давать такой совет сразу пишите и весь код.
Нашел еще одну либу для работы с этим датчиком: 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 мс на все расчеты), чем буду терпеть возможные последствия.
а откуда скачки, приводящие к включению насоса? У меня стоят датчики давления 4-20 мА, за примерно 9 лет не было вроде ни одного случая, чтобы откуда - ни-возьмись появились данные , включающие просто так насос. Да и в пром. автоматике - там же датчики не по баксу. Впрочем, метод работает, когда , как писалось, мк делать нечего и процессы медленные. А с насосом - конечно, куда торопиться, Там характерные времена в лучшем случае - минуты.
Вы меня немного неправильно поняли) Там вообще никаких датчиков изначально не было. Весь контроль вручную производился. Смотреть, чтобы скважина воды в резервуары не перелила, смотреть, чтобы магистральный насос воздуха не хватанул, все это делать без какой-либо индикации уровня воды... Ужс,в общем. А сейчас вполне прилично вышло, по моим скромным меркам. А вот в поливной емкости, вы бы видели этот "промышленный датчик"))) Работает раз в полгода. буду на работе, даже сфотографирую.
в какой-то теме про cонары обсуждалось, ушло , попробую тут - зависимость отсчета сонара от угла между лучом сонара и отражателем (картонка). Красные - плацебо перпендикуляр, остальные - три прокрутки картонки. Расстояние в мм. Крестики просто для ясности, величина лучей крестика произвольна (не отражает ошибку).
пы сы получается несимметрично - если с одной стороны, то чует стенку чуть ли не параллельную (со стороны видимо излучателя, от 5 градусов), если со стороны приемника - то при угле (к стенке) менее 20 градусов сонар стенку не видит.