Дальномер HC-SR04
- Войдите на сайт для отправки комментариев
Вс, 21/07/2013 - 16:41
Подключил девайс из сабжа, закодил его таким примером
#define trigPin 12 #define echoPin 13 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(1000); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance >= 200 || distance <= 0){ Serial.println("Out of range"); } else { Serial.print(distance); Serial.println(" cm"); } delay(500); }
но проблема в том что как бы я не изменял расстояние перед дальнометром, постоянно получаю Out of range
подскажите из-за чего такое происходит, куда смотреть чтобы исправить?
попробовал другой код
он постоянно ноль выдает (
Использовал этот код, брал помоему в примерах.
все работало отлично
тоже самое, ноль и больше ничего
Тогда проверяй железо. Правильно ли высталены пины. Хорший ли контакт, ...
У меня при работе HC-SR04 слышны пакеты щелчков из него (да, я знаю, что 40 кГц по паспорту, но тем не менее), послушайте свой.
Пользую, кстати, библиотеку NewPing.
v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
Version 0.1-2013/08/04
подносим руку к дальномеру на расстояние не боле 9 сантиметров (параметр можно изменять),
сразу включится timer_led (жёлтый светодиод) информируя нас что мы "дотянулись до дальномера",
и сразу убираем руку (у нас полторы секунды чтоб успеть убрать руку )
timer_led отключается и включится led5 светодиод.
повторяя это телодвижение включаем led6 и led7
если удерживать руку перед дальномером больше 2 секунд все светодиоды led выключатся
------------------------------------------
скетч sketch:
v.01 Arduino бесконтактный выключатель proximity Switch HC-SR04 Distance Measuring
http://yadi.sk/d/MDGctp9B7Zz7y
================================
изчего состоит;
1.ARDUINO, или ATMEGA328P-PU Microcontrolle?r ARDUINO UNO Bootloader и 16MHz Crystal
2. дальномер HC-SR04 Distance Measuring
3. Breadboard макетная плата
не обязательно;
4. USB To RS232 TTL PL2303HX Auto Converter Module Converter Adapter для питания и заливки скетча + кнопка
5. Светодиоды нужны только для визуального контроля за процессом.
Привет!Пока не буду создавать тему и напишу здесь,может кто поможет.
и она снова начала отправлять сигналы и замерять расстояния, проверил — хлопки, постукивания и прочая имитация сигнала тоже выводит его из этого состояния.В чем может быть проблема?
У меня проблема, когда расстояние становится такое что ответ в течении заданного времени (по умолчанию в библиотеке стоит 1с)-не получен (тобишь я отвожу датчик на большое расстояние 1м-9999м) ардуинка начинает слать постоянно 0 метров, встроенный светодиод на 13 пине перестает моргать и горит постоянно, даже если я снова подношу руку к датчику на расстояние 0-40 см, она как бы виснет в таком положении.А если залить скеч и не убирать руку от датчика более чем на 50см то всё норм, если больше-виснет. Сейчас заметил что чихнув, я вывел ардуинку из этого состояния
Arduino pro mini 5v 16mhz , Arduino IDE 1.6.1 ,использовал библиотеку Ultrasonic и скетч из этого поста - http://robocraft.ru/blog/electronics/772.html
еще пробовал скетч из этого видео http://www.youtube.com/watch?v=MrkyIOtG6ok
он там в описании к видео вставил ссылку на скетч, скетч без использования библиотеки, у меня опять же виснет если отдалить на большое расстояние, и перестает слать импульсы
//HC-SR04
int echoPin = 9;
int trigPin = 8;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
float duration, cm;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH, 17460);
cm = duration / 58.2;
if (cm > 300 || cm < 1)
{
Serial.println(" Out of Range");
}
else
{
Serial.print(cm, 1);
Serial.println(" cm");
delay(100);
}
}
Основа duration = pulseIn(echoPin, HIGH, 17460);
Чем мньше число 17460, тем быстрее возврат будет к измерению, но меньше максимальное растояние измерения.
17460 = 300 см * 58,2
Тоже задам тут свой вопрос:
Arduino Mega 2560 R3, но у меня с кварцем на 12Мгц и этот же датчик.
Все скетчи, работают нормально. Но, при калибровке датчика внезапно оказалось что верный коэффициент деления у меня 75.2, взамен стандартного 58 - 59 ... как понимаю, если частота кварца и должна влиять, то наиборот, в меньшую сторону...
Китайская Мега? Тогда большой кварц слева сверху платы - это кварц для USB<->UART ( обычно СН340g). А сам кварц на 16 МГц очень маленький, находится слева снизу контроллера.
Угу, Китай. Упс, а слона-то я и неп приметил... пасибки. А почто калибровать пришлось "нестандартно"?
Та же проблема с датчиком. Если расстояние кратковременно превысило пол-метра, датчик перестаёт работать. При этом светодиод tx, который мигал раз в 50мс, начинает мигать раз в секунду. Помогает рестарт датчика (но не ардуины) по питанию. ВОт и вопрос, если датчик повисает, почему меняется поведение ардуины? Или когда с датчика туфта приходит, ардуина на ноль делить начинает? Не уже ли аппаратный watchDog придумывать на полевике придётся?
Я бы не рискнул пользоваться pulseIn без таймаута. По логике, он в этом месте просто обязан зависать.
Таймаут я пробовал. Пишут, что по умолчанию он определён в секунду, что, кстати, и объясняет изменение в частоте посылок на комп. На разных сайтах пишут об аналогичной проблеме, а о решениях не пишут. Видимо, датчики из разных партий ведут себя по-разному. Какие-то перестартовывают после отсутствия эха, а какие-то ждут его бесконечно. Я вот думаю, если запитать датчик от одного из пинов, а в прогу ввести цикл, подсчитывающий количество нулей, пришедших подряд. И по переполнению некоего счётчика, сбрасывать питание датчика на пол-секунды. А значение хранить последнее годное до устранения всех проблем. Не тяжеловато ли порту будет, пишут, что дачтик 15мА берёт? Или есть более изящные способы решения? Пробовал и другой код (из примера ультрасоник....)так же.
Свой вопрос с дальномером я решил через замер длительности импульса по прерыванию от PCINT2 .. и задержка скетча на время замера меня больше не волнует. Измеряет точно и качественно до мм.
Ну и по таймауту: дальность по чуствительности приемника в даташите указана в 5м. Это по времени около 30 миллисекунд. Ставить таймаут на большее значение, имхо - бессмысленно.
Таймаут я пробовал. Пишут, что по умолчанию он определён в секунду, что, кстати, и объясняет изменение в частоте посылок на комп. На разных сайтах пишут об аналогичной проблеме, а о решениях не пишут. Видимо, датчики из разных партий ведут себя по-разному. Какие-то перестартовывают после отсутствия эха, а какие-то ждут его бесконечно. Я вот думаю, если запитать датчик от одного из пинов, а в прогу ввести цикл, подсчитывающий количество нулей, пришедших подряд. И по переполнению некоего счётчика, сбрасывать питание датчика на пол-секунды. А значение хранить последнее годное до устранения всех проблем. Не тяжеловато ли порту будет, пишут, что дачтик 15мА берёт? Или есть более изящные способы решения? Пробовал и другой код (из примера ультрасоник....)так же.
1. Вы физику хоть немного пыталтсь просчитать?
За секунду звук проходит примерно 340м. Интенсивность звуковой волня затухает как квадрат расстояния. Вы всерьез рассчитываете, что датчик обоадает достаточной чувствительностью, чтобы почувствовать сигнал отраженный от предмета, расположенного в 170 метрах от излучателя?
МАксимальная дальность указывается в дэйташитах на конкретный прибор. Для тех, что используется в Ардуино, она составляет порядка 2.5м. На 170м интенсивность эха будет в 4600 раз меньше и датчик его не услышит. Значит, таймаут нужно ставить примерно на 2.5*2/340=15мс.
2. Эха ждет не датчик, эха ждет программа. Собственно, в ней это написано. ПОэтому, сколько будет длиться ожидание в отсутствие эха, зависит исключительно от программы.
3. О каких нулях Вы говорите? Что пришли от датчика в то время, когда он излучает?
Представьте себя на его месте. Вот Вы заблудились в лесу и кричите "Ау!", чтобы Вас услышали и ответили. Как Вы будете поступать? Вы прокричите, а потом прислушаетесь, есть ли ответ. Если Вы будете кричать беспрерывно, ответа Вы не услышите, т.к. Ваш голос его заглушит. ТОчно так же и с датчиком. Мы включилим излучатель, сделали посылку сигнала, выключили излучатель и ждем эха. Если мы не выключим излучатель, датчик будет реагировать на звук излучателя, а не на эхо.
Вывод: нужне не "брать другой код", который неизвестно кем, когда и для чего написан, а разбираться в физике и самому писать именно тот код, который решает Вашу конкретную задачу.
Дааа... Поиском пользоваться не умеем. Решение уже есть, хотя я если честно до сих пор его не опробовал: http://arduino.ru/forum/apparatnye-voprosy/hc-sr04-apparatnye-problemy?page=1
Спасибо всем откликнувшимся, а особенно nevkon за годную ссылочку. Действительно, если кратковременно замкнуть эхо на землю, датчик оживает. За час работы (с большим количеством потеряных посылок) ничего значительно не нагрелось.
Добрый день. Задача стоит в измерении угла, пронадеявшись на акселерометр с гиро mpu6050 (погрешности большие чисто по математике).
Решил попробовать этот датчик под задачу. подключение и базовые скетч взят из http://zelectro.cc/HC-SR04
И собственно вопрос который пока не разобрал - можно ли измерять с точностью более 1см. Понятно что в коде можно поставить мм и пересчитывая в мм взять коэф. 5,8 вместо 58 (для см)
работает, выдает значения приближенные к реальности (к приложенной линейке)).
Что нашел на датчик это http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/HC-SR04.pdf в котором говорится о разрешающей способности 0,3см. Так меняя в коде значения переменной (см на мм) можно надеяться на точность в мм?
Или не стоит.. или ко всему нужно менять выходной импульс с 10мкс или это не принципиально (считаю что можно оставить, но мнение хотелось бы услышать)
На точность выше сантиметра я бы не надеялся, хотя можно приблизиться к миллиметровому диапазону сделав 10-20-100 последовательных измерений и рассчитать по Гауссу например.
Можно получать точность в миллиметровом диапазоне согласно даташиту. Но ваш пример для таких измерений не годится, измерять длительность нужно по прерываниям или таймером по сигналу захвата. Ну и "типовой делитель" - никуда не годен для точных измерений. Правильное преобразование: t*343/2048 (сдвиг право на 11 разрядов). Это для стандартной скорости звука в нормальных условиях (типовое состояние внутри помещений 1-го этажа), ошибка преобразования - менее 0.1мм.
Есть готовый код на прерываниях PCINT .. смотрите github/ARHAT_H .. можете переработать под себя как Вам удобно.
Вообще-то для точных измерений по минимуму нужен еще и термометр, чтобы скорость звука брать не с потолка, а рассчитывать для конкретной температуры.
Вообще-то для точных измерений по минимуму нужен еще и термометр, чтобы скорость звука брать не с потолка, а рассчитывать для конкретной температуры.
Тогда плюсовать сюда ещё и коррекцию по влажности воздуха ;)
Если влажность менее 100%, это не окажет сколь-нибудь заметного влияния на результат.
Ребят помогите с hc-sr04. Абсолютно полный ноль в программировании.
В общем имею рабочий скетч, но нужно чтобы при поднесении руки на расстояние 40 см включалось реле и работало бы 3-5 минут после того как руку убрать. как я не пытался лепить код куда попало, у меня ничего не выходило. вы знатоки. ткинте пальцем что куда поставить. буду Вам весьма признаателен.
Попробуйте
// Максимальная частота опроса датчика: 20Гц (Период опроса 50мс)
Заработала))) Спасибо большое)
https://www.youtube.com/watch?v=oOdoP3dniYA
Araris, задействовал ваш код в выключателе света в туалете, работает отлично.
Теперь появилась необходимость привязать вентиляцию к данной системе
Логика вроде не сложная, но как реализовать в коде не соображу
Появилась единичка на ledPin, ждем к примеру 120 сек, если не пропала (курим ,или сидим по большому) включаем ledPin2 на 20 минут.
Помогите кодом, пожалуйста
А если и через 20 минут "не пропала"?
Вентилятор должен заработать через 120 сек после включения ledPin, и работать 20 минут после отключения. Тоесть таймер отключения вентилятора стартует после отключения света
А если кому-нибудь приспичит в течение этих 20 минут? Вентилятор-то уже включён.
Если он там задержится более 120 секунд, таймер отключения можно перезапустить
Всем спасибо.
Я сделал то что хотел на FLProg. Теоретически работать должно. Практически проверю завтра-послезавтра.
Вот мои изыски. Все работает. Код прикладывать не буду, т.к. он создается автоматом. И там нет комментариев.
Какой-то косяк с картинкой, всё размыто. Пытаюсь поменять разрешение, становится только хуже.
Работает так:
сигнал с датчика приходит на реле сравнения СОМР1. Если значение с датчика меньше заданного, реле срабатывает.
Своим контактом, через блок дребезга контактов (поставил для фильтрации разовых абстрактных данных с датчика), включает реле времени КТ1 с задержкой на отключение 15 сек.
Своим контактом КТ1 подает единичку на 9pin. Вторым контактом включает реле времени КТ2 с задержкой на включение на 2 минуты.
Своим контактом КТ2 включает реле времени с задержкой на отключение 20мин. При срабатывании подает единичку на 13pin.
Какой-то косяк с картинкой, всё размыто. Пытаюсь поменять разрешение, становится только хуже.
С FLProg-ом всегда так.
Нет, косяк с вставкой картинки на сайте. Походу нехило пережимает. У меня на скриншоте все хорошо.
А FLProg работает неплохо кстати. На нем за неполный час я смог сделать то, чего не смог за полдня активного гугления, разбора чужих примеров, и попыток подогнать последний код на этой странице под свои хотелки. Я не программист не разу, зато релейно-контакторные схемы читаю и немного с промышленными контроллерами знаком.
Нет, косяк с вставкой картинки на сайте. Походу нехило пережимает. У меня на скриншоте все хорошо.
Поэтому не следуеть делать скриншот шириной во весь экран - уменьшите окошко программы до 780 пикселей в ширину.