Нестабильная работа УЗ датчика
- Войдите на сайт для отправки комментариев
Втр, 30/10/2012 - 20:17
Подскажите пожалуйста возможные причины и их решения проблемы УЗ датчика HC-SR04.
Суть такая. Один датчик редко, но выдает значение 0, хотя расстояние нормальное, важно не само левое значение, которое можно пропустить или филтр сделать, а то что в этом случае большая задержка возникает. Второй датчик чуть ли не каждые значений 10, и при том что они довольно быстро обновляются почти каждые 2 секунда идет задержка примерно в 1 секунду. Это очень мешает, робот давно проедет предельное расстояние с такой задержкой. Код программы стандартный:
const int Trig = 8; const int Echo = 12; void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); Serial.begin(9600); } unsigned int time_us=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig, LOW); // Затем убираем time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=time_us/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт }
Я когда-то делал так:
весь код здесь
Не совсем понятно приемущество этого кода, что оно дает, фильтрацию? Вы сталкивались с подобной проблемой, когда выдает ложный 0 и задержка при этом?
Думал может контакты, и на макетной плате вставлял датчик, всеравно один результат.
Задержка от того, что вы используете pulseIn, в моем коде максимальная задержка составит 20 миллисекунд и функция возвращает максимальное значение, что может расцениваться как ложный результат.
pulseIn имеет третий параметр (по умолчанию 1000000) - таймаут в микросекундах - максимально допустимое время работы функции - пользуйтесь!
Точно! Помогло поставил 25000 треим параметром.
Как дожить до вечера, чтобы проверить? Не знаю. Надеюсь, я нашел ответ, почему при пинге, если нет близкого препятствия, сканирование затыкается как раз от 0.5 до 1 секунды. Спасибо заранее :)
Если я правильно плнял, проблема в том что при близком расстоянии у вас медленно обновляется датчик или наоборот? Но это не важно.
Тогда проверяйте условие, очень вероятно что как раз в нем при близком расстоянии выполняется циккл где есть задержки (например for), они суммируются пока он полностю выполнится и получается такое долгое обновление. Таже у меня были задержки на нулях, это подсказал AlexFisher выше за что ему очень благодарен)
Вот как раз при отсутствии преград (при большом расстоянии) задержка высокая (как мне это выглядит - радар "ждет" результатов скана, но это только мое ощущение). При близком расстоянии все ок.
Было:
Стало в соотв. с топиком (точнее, вечером станет!):
Предполагаю, функцию сканирования ИК-датчиком также надо будет оптимизировать. Сейчас это так:
Подозреваю, что ultrasonic.Ranging(CM) надо будет прошерстить что там в библиотеке скрыто.
Вообще, я сначала не мог понять, отчего при наличии библиотек, многие их не используют. Начинаю понимать :)))
Не используйте данный датчик. Я поймамал подобные проблемы при его использовании. Он притормаживал программу.
Я отказался от него в пользу ИК датчиков. Есть так же ультразвуковые , но это дело там решено аппаратно.
Т.е. датчик выдает либо аналоговый сигнал либо общается по UARTу.
Например вот. Правда цена там завышена.
http://www.freeduino.ru/arduino/sensor.html
Датчик тут не причем. Для проверки возьмите мой код в первом сообщении, только строчу поправить надо. Обновляется отлично.
Да, у меня HC-SR04 работает датчиком присутствия в туалете, тоже выдает нули время от времени.
Для робота, безусловно, возникающая задержка весьма критична.
Вот решение! Все никаких задержек нет, а нули можно фильтровать и все, не критично что появляются время от времени. Выше написал какую строчу поправить надо.
Удивительную вещь заметил: если питание сервы отключено и она не вращается, то УЗ-сканер нулей не выдает. Как только включаю серву, начинает сыпать нулями. Помехи?
Какие только варианты delayMicroseconds(10), delayMicroseconds(8), delayMicroseconds(4) ни пробовал, пробовал зупускать сканы не через 50мс, а через 100, 200, 400...
Сейчас буду проверять ИК-сканер... УЗ-сканер пока выполняет роль одушевления внешнего вида...
На всякий случай, вот код цикла:
Delay(5) выглядит маленьким, но если его увеличивать, серва едет очень медленно.
Функция скана:
Источник тормозов: pulseIn(Echo, HIGH, 25000); Проверил путем комментирования данной строки. Дистанция, естественно, нульЮ но зато серва бегает без запинок!
Разбираюсь дальше...
Удивительную вещь заметил: если питание сервы отключено и она не вращается, то УЗ-сканер нулей не выдает. Как только включаю серву, начинает сыпать нулями. Помехи?
Было что-то похожее. Ну а что нули мешают? Он обновляется довольно быстро. Берешь условие задаешь и просто пропускаешь нули. А дальше испульзуешь остальные значения для какких-либо условий.
Нули мешают, т.к. при не очень частых замерах можно пропустить до 5*25 мс, а за это время в стену въехать можно, плюс, с одного борта получается слепой танк :) Плюс в момент появления нулей серва тормозить начинает (скрипт подтормаживает), поэтому появившейся предмет не успевает быть замечен танком.
В итоге, сделал как maksim "когда-то делал". Вах-вах, как все здорово работает!
Ну да тоже как вариант, хотя у меня быстрое обновление, и 0 вообще не мешают.
Друзья!
У меня вот такая проблема:
Датчик HC-SR04 с Arduino UNO сам по себе работает достаточно стабильно, также, стабильно работает вместе с сервой TowerPro 9G, но как только я собираю все вместе с Motor Drive на L298 - начинается путаница. Моторы не крутятся, Ultrasonic возвращает только "0", серва работает нормально.
Опытным путем вычислил, что убирая серву, Ultrasonic HC-SR04 начинает давать показания с некоторыми ошибками, но не "0". Ниже привожу свой код:
Идея банальная. С пулта ИК даем команлу на запуск. Робот едет вперед пока сенсор приближения не покажет расстояние 26. Останавливаемся перед препятствием, ищем оптимальный угол поворота, поварачиваем (не добрался до этого места) едем дальше.
Ведет себя схема по-дурацки. Пока едет прямо, очень часто получает результат "4" от Ultrasonic. Ищет угол поворота нормально, но только доходит дело до движения прямо, опять getDistance() возвращает "4". Бред. Не поможите?
Чем и как все это дело питаете?
Спасибо за отклик.
Пробовал разные варианты:
1. От двух аккумуляторов по 3,7В всю схему
2. Моторы от аккумов, логику от USB (земли естественно соединял)
3. Всю схему от USB (ради прикола)
4. Всю логику от USB, без питания двигателей
Эффект всегда одинаковый
P.S. Шунты на движки не ставил, но моя проблемя есть даже с отключенными движками (включена только логика драйвера моторов)
Интересно как вообще у вас это работает... вот вы определили выводы:
а на выход настроили из них только 10 и 9:
правильно было бы так:
то же самое :
и настраиваете его на выход:
Sorry! Спасибо за подсказку!
Это уже измененный код после экспериментов со сменой выходов. Когда для моторов были назначены пины 2 3 4 5 9 10 схема не работала. Крутился только один мотор а на выходе другой шины горели светодиоды, как если бы я прописал:
Сейчас проблема не в моторах, я их вообще отключил. Проблема в том, что в зависимости от места откуда я вызываю одну и ту же функцию getDistance(); она возвращает то правильные, то неправильные значения.
При вызове из loop() я постоянно получаю "4" независимо от реального расстояния
А ниже:
Я получаю иногда "0", а иногда реальное расстояние в СМ.
В общем проблему решил!
Оказалась серва с криво выставленным потенциком. Разобрал, выставил центр, собрал, все заработало как надо. Теперь буду разбираться с движками.
Спасибо Максу за участие.
Немного обновим тему.
Имеем датчик SR04T, для теста использую примерно следующий код
Возник непонятный баг, при заливке тестового скетча все работает нормально, но при вставке кода в рабочий скетч, pulseIn почему то снижает показания примерно на треть. Самое пикантное, что при использовании кода от maksim показания нормальные.
В отличие от датчика ТС, этот датчик периодически выдает в качестве помехи не 0, а максимальное значение, что то типа 17423 мкс. Датчик будет использоваться в ограниченном пространстве поэтому импульсы длиннее определенной величины просто игнорирую. Есть ньюанс, в слепой зоне (ближе 20 см) датчик выдает случайные значения, а в упор к препятствию - опять максимальное значение. Поэтому если датчик постоянно выдает это значение (либо заранее снижаю планку), принимаю его за 0.
Более менее нормально работает примерно такой код
У меня пахожая проблема возникла с этими датчиками вот тут: http://arduino.ru/forum/programmirovanie/pomogite-s-chastyu-koda-vyklyuc... оказывается что эти датчик имееют разброс пораметров, один у меня нормальный попался, а др. вообще как то вяло работает и сигнал угасает в одежде.
Пес его знает, как там
pulseIn
реализован, похоже дело в таймерах. У меня ИК приемник использует, других видимых причин не нашел пока. Крайне неохота проверять, уже к другому делу перешел.тоже мучаюсь ((( скачит на 1 см постоянно и это при использованиии формулы maksim с первого поста
тоже мучаюсь ((( скачит на 1 см постоянно и это при использованиии формулы maksim с первого поста
Так это ж погрешность дискретизации при обработке. При чем здесь датчик?
Какой используется тип переменной?
как же правильно все таки усреднить показатели? чтоб не скакал
как же правильно все таки усреднить показатели? чтоб не скакал
Это, смотря чего Вы хотите добиться.
Если именно чтобы железно не скакал - отображайте все время одну и ту же цифру, не имеющую отношения к измеряемому параметру. Скакать не будет совсем.
Если же требуется отображать реальную величину, "скачки" неизбежны - хотя бы при изменении измеряемой величины.
Более того, если, скажем, Вы округляете до целых, то при знечении вблизи полуцелого (т.е. типа 1.5, 3.5, 18.8) усреднение не способно избавить Вас от "скачков". В этом случае нужно вводить гистерезис. Допустим, примем величину гистерезиса 0.2. Тогда, скажем, если индицируется 17, то переключаться на 16 - при показаниях не более 16.3, а на 18 - не менее 17.7.
Ну что-то подобное. Хотелось бы просто видеть сантиметры которые не будут скакать до величины хотя бы 0.5см., особая точность ведь не требуется. Почитав тему вот и использовал выше приведенный скетч (скетчи)
Посчитайте разброс датчика и усредняйте значения, за N измерений, что бы не скакали. У меня практика показала, что измерния не скачут, если их измерять в см (unsigned int). Измерения веду посредством millis(). Помехи в виде величины, превыщающей некий максимальный предел я отбрасываю.
Попробовал 2-3 примера с разных источников, везде значения пляшут. Только когда препятствие находится в диапазоне до 40-50см, все стабильно и точно. Я не программер, могу только что-то в скетче подправить под себя.
Может, кто подскажет похожий под такую задачу:
Точка контроля - плакат. Надо включать свет, когда у плаката остановились его посмотреть. Помехи - проезжающие машины, проходящие люди.
Алгоритм вроде простой при корректно работающем датчике: замеряешь расстояние до препятствия и оцениваешь время, когда расстояние меньше двух метров измеряется больше 2-3 секунд. Если больше - с выхода пошел импульс, и система не воспринимает изменения в течении 2-3 минут. После чего опять начинается контроль расстояния.
Но датчик сыпет через два нормальных замера фейковые значения, и чего с этим делать, не пойму. На то, что замер не будет меняться, тоже рассчитывать не стоит, человек же не как вкопанный стоит, шевелится. Никаких идей нет?
>Помехи - проезжающие машины, проходящие люди.
это не помехи, они вне диапазона действия датчика (дальше 2-х м).
>датчик сыпет через два нормальных замера фейковые значения, и чего с этим делать, не пойму
вариант а) завести величину k, равную где-то 1/5...1/10 от измеряемой дистанции. В процессе измерений сравнивать разность между текущим и предыдущим значением. Если оно превышает k (в любую сторону) считать текущее измерение фейковым и не обрабатывать его.
вариант б) использоваль програмный фильтр Калмана. Он делает практически то же самое что и предыдущий вариант, но по другому алгоритму.
Да, так фильтровать, наверное, можно. Буду стучаться к людям, кто может это написать.
Что касается диапазона - таки нет, датчик весьма корректно мерил растояние до стены напротив, 342см, причем именно это значение и чередовалось с мусором - то 342, то 4. Руку подставляешь, и он меряет искомые 20-30см как вкопанный. То есть не может устойчиво замерять большие расстояния
SergAG, попробуйте ещё мой вариант на асме:)
Спасибо, попробую. А в 1.0.6. не скомпиллируется?
...Нет, не идет
Попробовал 2-3 примера с разных источников, везде значения пляшут. Только когда препятствие находится в диапазоне до 40-50см, все стабильно и точно. Я не программер, могу только что-то в скетче подправить под себя.
Может, кто подскажет похожий под такую задачу:
Точка контроля - плакат. Надо включать свет, когда у плаката остановились его посмотреть. Помехи - проезжающие машины, проходящие люди.
Алгоритм вроде простой при корректно работающем датчике: замеряешь расстояние до препятствия и оцениваешь время, когда расстояние меньше двух метров измеряется больше 2-3 секунд. Если больше - с выхода пошел импульс, и система не воспринимает изменения в течении 2-3 минут. После чего опять начинается контроль расстояния.
Но датчик сыпет через два нормальных замера фейковые значения, и чего с этим делать, не пойму. На то, что замер не будет меняться, тоже рассчитывать не стоит, человек же не как вкопанный стоит, шевелится. Никаких идей нет?
SergAG, скажите, Вы - писатель?
Если "нет", то я полагаю, Вы нашли на просторах И-нета текст, котрый я выше отквотил, заменили в нем прд себя пару слов и разместили на этом форуме.
Я прав?
Я, если честно, ничего не понял. Видимо, тут какая-то ирония. В смысле что нестабильность уз - холивар? Может быть. Поиском прошелся, несколько форумов нашел, но аккаунт только здесь, тут и спросил. Я чего-то не догоняю, в чем проблема? В чем Вы должны быть правы?
Проблема видимо в нежелании догонять, ибо это требует "разобраться" с вопросом. Скачать кучку скетчей, по большей части одинаковых на просторах сети может даже что-то попробовать и затем вот так обобщать - большого ума не требует. Вам dimax дал код который использовался для работы анемометра, если Вы его хотя бы смотрели, в чем лично я - уже сильно сомневаюсь, ибо там достигнутая точность-стабильность = 1 ТАКТ микроконтроллера. Это даже не "поверочный прибор" (если вам такое слово знакомо, нет - гуглите). Вы его даже не опробовали .. а между прочим, там есть где компилится, как .. но, нет жеж! Вы заново задаете вопрос впустую...
В сети и на этом форуме даже, выложены мои эксперименты по этому датчику. Для перпендикулярной поверхности датчик устойчиво работает с ошибкой менее 1мм на всем диапазоне расстояний от 3см до 5метров .. нашли, пробовали? Сдается мне что нет. А кроме того! Там показана АСИНХРОННАЯ работа с датчиком, когда скетч не "зависает" на время ожидания и измерения импульса .. Andriano, похоже прав .. чукча - писатель.
Датчик в целом, работает ровно так, как Вы его попросите. У него есть проблемы, но иные: он может запросто ловить боковое препятствие, в боковом лепестке; есть версии периодически теряющие напругу и их надо перезапускать "с толкача"; есть ловля первого сигнала от дальнего препятствия при ограничении времени ожидания и частом опросе - ограничив дальность скажем 4мсек, и опрашивая каждые 4мсек можно легко словить импульс от первого опроса при втором.. но, если им правильно пользоваться то показания стабильны и точность измерений менее 1мм. Проверено не на раз.
2Arhat109-2 Что я знаю, что я пробовал и в чем мое желание - оставьте эти мнения при себе. Тем более то, чего Вам "сдается". Бред какой-то, еще один препод нарисовался. Еще и хамоватый. Перейдете на другой тон - напишу, какие скетчи пробовал, где их искал, на каком железе, и какие результаты получил. А в таком тоне могу только на улице разговаривать.
Думаете мне оно интересно что вы пробовали а что нет? Датчик НАДЕЖНО работает с точностью до 1мм в рабочем диапазоне расстояний. Все остальное - кривые руки. Перечитайте и проверьте свои результаты. Как получится - пишите. :)
Мой сын в свои 11 лет - справляется и это вообще его любимый датчик. У вас тоже получится, я уверен.
2Arhat109-2 Что я знаю, что я пробовал и в чем мое желание - оставьте эти мнения при себе. Тем более то, чего Вам "сдается". Бред какой-то, еще один препод нарисовался. Еще и хамоватый. Перейдете на другой тон - напишу, какие скетчи пробовал, где их искал, на каком железе, и какие результаты получил. А в таком тоне могу только на улице разговаривать.
Мил-человек! Это ж у тебя проблемма с УЗ датчиком, а не у Архата, У него, у меня, у Димы и у других - нет проблемм с этим датчиком. Тон не тебе выбирать. Высокомерие и глумеж - считай это плата за ответ на вопрос. Не нравится - скатертью по жопе. Найдешь ответы "на улице", по твоему меткому выражению.
Я доступно излагаю? В теме, кудал ссылку Дима есть все нужные ответы. Цифровой фильтр мусора - есть много где, на помехе по питанию заканчивается та тема. Sapienti sat!
О-па! Еще один герой... Не был бы здесь не первый год, подумал бы, тут все такие. А это новенький, оказывается. Не обтесался еще. Спишем эту удаль на издержки виртуального пространства. wdrakula, это не моя ветка, поэтому не могу попросить Вас покинуть ее, но давайте адекватнее выбирать плату за глупые вопросы, тут таких больше, чем умных. Ваш, кстати, тоже. По крайней мере, отвечать на Ваши посты я больше не буду.
Arhat109-2, а в чем причина такой реакции? я ведь действительно здесь не первый год, но такого эпатажа не было. Я не комплексую, когда меня учат, тем более, в этих вопросах руки у меня действительно кривые. У меня нет сомнений, что датчик может работать. Как и все остальные пара десятков девайсов, которые у кого-то работают, у кого-то нет. Эти первые чем-то помогают этим вторым. Или ничего не пишут. А тут, кроме dimax (уже не первый раз он мне подсказывает решение, ну в этот раз я не смог его реализовать), столько букв народ написал, и ни о чем.
[quote=SergAG]
не могу попросить Вас покинуть ее, но давайте адекватнее выбирать плату за глупые вопросы, тут таких больше, чем умных. Ваш, кстати, тоже.
[quote]
1. Просить будешь папу, если с ним знаком. Вдруг.
2. Я НИКОГДА не задавал никаких вопросов на форум-е (-ах). Это основная причина того, что я считаю задающих мудлом. Всех. На любой вопрос можно найти ответ самому. На всех форумах, где я бываю - я только отвечаю. Тем, кого считаю достойным моего внимания. Сорри за высокомерие. Надите собеседника с IQ > 160 - мне будет о чем с ним говорить.
3. с 2012 года пора бы уже чему-то научиться в своем хобби. Я не равняю с собой - я профессиональный математик. Но даже любителю пяти лет хватит.
4. Иди в жопу.
Вот черт, не удержаться! Извини, больше не буду, но сейчас не могу не задать вопрос: а тебе действительно так хорошо знаком маршрут по п.4? Ты уже дважды его пытаешься мне рекомендовать. Тебе там так понравилось? Можно , я воздержусь, не хочу быть твоим соседом ))))
Дальше тоже можно было бы, типа люди с высоким интеллектом этим не кичатся (соответственно, если кичатся, то...), ну и еще дальше, если вопросов не задаешь, и по существу не отвечаешь то чего ты тут вообще делаешь? Писатель?
Все. Пришел кот Леопольд, и наказал жить дружно. Расслабься, я больше участвовать в пикировках не буду.
пока спать не пошел.
Сорри.
Но ты смотрел ту тему, куда тебе Дима ссылку дал?
Тема мне знакомая.
Там же есть все ответы.
Редкие помехи SR04 дает при нечистом питании. На этом закончилась та тема.
При решенных вопросах питанияеЕсть чистая фильтрация выбросов. Это мат-статистика. Попроси помочь - помогу. Делаешь несколько замеров, выкидываешь "выбросы", остальное - усредняешь.
--------------------------------------------------
Я поясню на что я "завелся" - на хамство Архату.
Я с Архатом очень много и резко ругался,но он очень хороший интуитивный программист. Не стоит так с ним разговаривать. У него в самом деле этим датчиком 11-и летний ребенок управляет. Если у тебя регистрация с 2012 года - просто почитай, кто-тут-кто теперь.
Да я - по вечерам всегда пьян и груб. Утром - могу ответить более адекватно. Уж прости. Мне 47 лет и меняться поздно.