Главная » Статьи » Как подключить

Ультразвуковой дальномер HC-SR04
 По случаю приобрел себе ультразвуковой дальномер HC-SR04. Девайс представляет из себя модуль с двумя пъезоизлучателями, один из которых служит излучателем, а второй - приемником ультразвуковой волны; плюс управляющая электроника для управления излучателем и приемником. Для подключения модуль имеет 4-х контактный разъем: два из которых питание (требуется 5 вольт), и еще два для общения с микроконтроллером.
 
 
  Интерфейс связи тут организован очень просто: на вход подаем короткий умпульс  длительностью 10-15 микросекунд и ждем импульса на выходе. Как только до приемника дойдет отраженная волна, модуль сам рассчитает расстояние и выдаст на ногу Echo импульс высокого уровня длинной до 25 мс. Длина выходного импульса будет пропорциональна расстоянию до препятствия от которого отразилась ультразвуковая волна. Нам остается только поймать этот импульс, посчитать его длину и перевести это значение в расстояние.
 
  
 
 
 
 
 
Технические характеристики: 
  • Напряжение питания: 5V  
  • Ток покоя: < 2 мА 
  • Эффективный угол обзора: < 15 ° 
  • Диапазон расстояний: 2 см - 500 см 
  • Разрешение: 0,3 см
 Характеристики потырены с документации на модуль. Кроме этого производитель приводит формулу, по которой рассчитывать расстояние в зависимости от длительности импульса. 
 
  S=F/58 ; где S - дистанция в сантиметрах, F - длина импульса в микросекундах
 
 Как видно, даже знать скорость звука не обязательно.
 
 Для испытаний собрал вот такую схему:
 
 
 
 
 
 
  Модуль соединяется к микроконтроллеру напрямую. Резисторы подтяжки ставить не нужно, они уже есть на плате модуля.
  И так, нам нужно ловить всего один импульс, и затем посчитать его длину. По началу хотел подбить под это дело одно из внешних прерываний микроконтроллера, при этом прерывание должно было происходить как по переднему фронту (переход с низкого в высокое состояние), так и по заднему фронту (с высокого на низкое). Тоесть придется на лету менять конфигурацию этого прерывания. Плюс к этому нужно задействовать один из таймеров, который должен измерять длину импульса. Слишком  сложно для маленькой операции фиксирования сигнала.. В Bascom-AVR на этот случай есть специальная команда Pulsein. Вот пример того, как поймать сигнал с помощью этой команды: 
 
Pulsein A , Pind , 5 , 1
 
 здесь, в переменную A запишется значение длины импульса в десятках микросекунд, снятого с ноги Pind.5. Единица на конце команды говорит, что нужно ловить сигнал высокого уровня. Если изменить на 0, тогда контроллер будет ловить сигнал низкого уровня.
 
 Эта команда не использует прерываний и хардверного таймера, но способна определить появление импульса и зафиксировать его длину с разрешением 10 мкс. Команда использует для хранения длины импульса 2-х байтный тип переменной, поэтому максимальная длина принятого сигнала может быть 655,35 мс. Этого вполне хватает для поставленной задачи, но по необходимости можно отредактировать файл библиотеки mcs.lib и изменить максимальную длительность фиксируемого импульса. 
 
  Полный листинг программы представлен ниже
 
 
$regfile = "m8def.dat"
$crystal = 8000000
 
'конфигурация подключения дисплея к портам МК
 
Config Lcd = 16 * 2
Config Lcdpin=Pin,Rs=Portc.5,E=Portc.4,Db4=Portc.3,Db5=Portc.2,Db6=Portc.1,Db7=Portc.0
 
Config Portd.= Output          'выход для подключения ноги Trigger
Trigger Alias Portd.4
Trigger = 0
 
Config Portd.= Input           'вход для импульса Echo
 
Config Portd.= Output          'конфигурация для подключения светодиода
Led Alias Portd.7
Led = 0
 
Dim A As Word                    'сюда копируется значение длины сигнала
Dim S As Single                  'переменная для хранения расстояния
 
Const K = 0.1725                 'коэффициент для перевода длины импульса в расстояние
 
Waitms 50
 
Cursor Off
Cls
Lcd "Sonar HC-SR04"
Locate 2 , 1
Lcd "AVRproject.ru"
 
Led = 1
Waitms 100
Led = 0
 
Wait 3
 
Do
 
Trigger = 1                      'даем импульс на ногу Portd.4 длительностью 15 мкс
Waitus 15
Trigger = 0
 
Waitus 10
Pulsein A , Pind , 5 , 1         'ловим импульс высокого уровня на PinD.5
 
= A * K                        'переводим значения
 
Cls
 
Lcd Fusing(, "###.#")          'выводим данные на LCD, расстояние в сантиметрах
 
If S < 20 Then                       'если растояние меньше заданного предела
 Sound , Portb., 200 , 500         'подадим голос через динамик на PortB.0
 Led = 1                             'и мигнем светодиодом
 Waitms 20
 Led = 0
End If
 
Waitms 100
 
Loop
 
End
 
 
 На дисплей выводится число, показывающее расстояние до препятствия в сантиметрах. Еще добавил проверку на минимальное расстояние, если оно меньше 20-и сантиметров, будет выдан звуковой сигнал. По этому же принципу можно без проблем собрать парктроник своими руками :)
 
 А теперь испытания:
 
 Честно говоря не ожидал таких отличных результатов! Точность измерения проверял только до 50 см, показания прыгали не больше ± 0,5 см. И больше зависили от того, насколько вертикальна плоскость препятствия. Так же сигнал плохо отражается или вообще не отражается от ворсистых поверхностей. Оно и понятно, законы физики не обойдешь. В общем, модуль очень даже не плох!
 
 
 
 
 
 
 
Ниже можно скачать модель сонара HC-SR04 для Proteus
Категория: Как подключить | Добавлено: 22.10.2011
Просмотров: 47074 | Комментарии: 52 | Теги: дальномер HC-SR04, дисплей, atmega8 | Рейтинг: 4.5/13
Всего комментариев: 521 2 »
52 pv_serg   (23.10.2014 09:01)
Собрал-работает. Только хотелось предупредить, у кого не верно показывает и т.д. -ФЮЗЫ!!! По умолчании в атмеге8 1 мГц, переставить на 8 мГц.

51 Scorpushka   (21.08.2014 19:05)
собрал во второй раз эту схему но уже на меге256, пришлось корректировать коэффициент при преобразовании (врал)
и еще странно-при вытащенной из беспаечной макетке датчике цифры на дисплее фиксируют приближение руки к проводам!
видимо ловит наводки.
рука в 7см -0
при дальнейшем приближении цифры доходят примерно до 223 (вплотную)

50 sany2   (09.08.2014 09:46)
If S < 40 Then 'если растояние меньше заданного предела
Led = 1 'и мигнем светодиодом
Waitms 200
Led = 0
End If

Waitms 200 замени на else и будет гореть всё время при менее 40 см

49 oleg105103   (09.08.2014 00:06)
sany2, спасибо
Вот какой код я прошил, взял частично из ветки http://avrproject.ru/forum/4-6-1
$regfile = "m8def.dat"
$crystal = 1000000

Config Portc.0 = Output
Config Portc.1 = Input
Config Portb = Output
Config Portd = Output
Config Portc.2 = Output
Config Portc.3 = Output 'конфигурация для подключения светодиода
Led Alias Portc.2
Led = 0

Dim N2 As Integer
Dim N3 As Integer
Dim N4 As Integer

Dim M2 As Integer
Dim M3 As Integer
Dim M4 As Integer

Dim A As Word
Dim S As Single

Config Timer1 = Timer , Prescale = 64
On Timer1 Sonar:

Enable Interrupts
Enable Timer1

Do

Portb = &B00000100
Portd = Lookup(m2 , Dat1)
Waitms 5

Portb = &B00000010
Portd = Lookup(m3 , Dat1)
Waitms 5

Portb = &B00000001
Portd = Lookup(m4 , Dat1)
Waitms 5
Loop

Sonar:

Portc.0 = 1
Waitus 15
Portc.0 = 0

Waitus 10
Pulsein A , Pinc , 1 , 1

S = A * 0.335 'для воды заменить на 0.69

M2 = S
M3 = S
M4 = S
M2 = M2 / 100 'сотки
N2 = Abs(m2)
M3 = M3 Mod 100 'десятки
M3 = M3 / 10
N3 = Abs(m3)
M4 = M4 Mod 10 'единицы
N4 = Abs(m4)

If S < 40 Then 'если растояние меньше заданного предела
Led = 1 'и мигнем светодиодом
Waitms 200
Led = 0
End If

Waitms 100

If S < 10 Then
Portc.3 = 1
Else
Portc.3 = 0
End If

Waitms 100

Return

End

Dat1:

Data &B11000000 '0
Data &B11111001 '1
Data &B10100100 '2
Data &B10110000 '3
Data &B10011001 '4
Data &B10010010 '5
Data &B10000010 '6
Data &B11111000 '7
Data &B10000000 '8
Data &B10010000 '9

Сделал с сегментами
Светодиод прицепил один на PORTC.2 другой на PORTC.3 но не могу заставить их гореть оба сначала один при расстоянии 40 см другой при расстоянии 10, но главное что уже в принципе, есть почти тот результат который я хотел.
Только вот у меня почему то при стандартной константе 0.172 неправильно измеряет расстояние до объекта. Пришлось экспериментально подбирать поставил 0,335

48 sany2   (08.08.2014 21:10)
oleg105103

config portd.0=output

конец программы примерно такой при 10см

If S < 10 Then
Portd.0 = 1
Else
Portd.0 = 0
End If

Waitms 100
Loop
End

47 oleg105103   (08.08.2014 18:31)
Просьба подсказть как реализовать подключение ещё одно свтодиода и его срабатывание при расстоянии менее чем 20 см до объекта ?
Пробовал но либо ошибка при коппиляции либо светодиод загорается и уже не тухнет даже при увеличении расстояния? просьба помочь с кодом

46 oleg105103   (31.07.2014 23:38)
В продолжение использую AVR Studio 5.1

45 oleg105103   (31.07.2014 23:35)
Уважаемые форумчане просьба помочь советом или практично
Собрал данное устройство но пока без жки. т.к. нет в наличии
Хочу приспособить под сегментник с общим анодом GNT-3631BG . Просьба подсказать можно ли слепить этот код с тем который есть уже в соседней ветке http://avrproject.ru/forum/4-6-1 чтоб заменить жки на сегменты ?
Если да, то прошу помочь т.к. в програмировании пока аматор.
И еще подскажите как код превратить в hex?
Заранее всем спасибо кто откликнется!

44 exersizze   (09.12.2013 08:32)
Ага, прально. Ну если хорошо изолировать может что и получится.

43 domrustika   (06.12.2013 15:12)
мембраны излучателя и приемника это вот эти круглешки как я понимаю? а то что они будут промакать и пачкаться это не выведет их из строя?

42 exersizze   (06.12.2013 08:29)
Ну прозрачность в видимом диапазоне не гарантирует прозрачность во всех остальных )) Видать там не простой пластик. Самое очевидно что приходит в голову, это сделать так чтобы с наружи остались только мембраны излучателя и приемника, их можно покрыть лаком от коррозии (как вариант).
Или, сделать механизм который будет на время парковки открывать крышку корпуса в котором стоит дальномер (можно применить сервомашинку для открывания)

41 domrustika   (05.12.2013 22:03)
такое дело. решил сделать парктроник. все собрал спаял. так как планировал что датчик просто будет прикреплен сзади чуть выше бампера надо было думать как обезопасить его от воды, грязи итд. решил засунуть в мал.квадратные корпус из оргстекла, НО вот Незадача ультразвук оказывается отражается даже от прозрачной передней панели)))) я в ступоре. есть ли такой материал который пропускает звук, но не пропустит влагу? ведь у автомобилей у датчики непроницаемые и кажись закрыты обычной пластмаской...

+1   Спам
40 domrustika   (28.11.2013 21:55)
отличная статья!

39 exersizze   (22.09.2013 23:50)
koolleer, ну это не сверхточный прибор, метр от двух отличит, а больше от него требовать не стоит. Тут и от поверхности от которой отражается сигнал зависит и от самого исполнения сонара, так что считайте что это допускаемая погрешность. Если нужно получить точные показания то могу посоветовать скорректировать показания, построить график и на каждый диапазон ввести коэффициент который будет подгонять замеренные показания к действительным.

38 koolleer   (22.09.2013 21:03)
измерял не точно, ноо примерно вместотого где должно быть 20 показывает 24, на 10 показывает 13, а на 5 показывает 7. вместо 25 показывает на 30. т.е. чем дальше тем больше погрешность

37 exersizze   (22.09.2013 00:20)
Формула расчета взята из документации на этот модуль. Какие показания выдает ваш модуль?

36 koolleer   (21.09.2013 13:43)
А как получили данный коэффициент ? У меня почему то неверные показания выдает.

35 exersizze   (20.09.2013 00:48)
Нет, там прямое управление с микроконтроллера, на плате с сенсором уже все необходимое есть.

34 domrustika   (20.09.2013 00:47)
перед динамиком не надо ставить транзистор для безопасности порта микросхемы?

33 sany2   (12.09.2013 16:33)
Ежели очень надо-возьмите здесь:
http://yadi.sk/d/BvR2OyO899gBK

32 VictorK   (12.09.2013 14:48)
А где взять прошивку в .hex ?

31 exersizze   (27.12.2012 22:15)
Яж говорю, это просто картинка, я тоже не умею создавать в нем модели). О симуляции речи не идет.

30 zinya   (27.12.2012 20:43)
просто не знаю как смоделировать работу этого датчика в протеусе

29 exersizze   (27.12.2012 20:21)
Я обычно не сохраняю файл протеуса после того как нарисую схему. Самому нарисовать не сложно, прямоугольник и два круга:) Но это получится не работоспособная модель сонара, просто рисунок..

28 zinya   (27.12.2012 19:44)
могли бы поделится схемкой из протеуса? пишу курсовой, но ни как не могу сделать данльномер в протеусе. Делаю парктроник

27 exersizze   (27.12.2012 19:26)
Никак, модели дальномера для протеуса не нашел. Если только самому создать..

26 zinya   (27.12.2012 18:56)
Как реализовать данный дальномер на схеме в протеусе?

25 exersizze   (10.06.2012 20:18)
Специально такие замерения не проводил, но из того что помню примерно так и есть, угол там весьма небольшой.

24 RD3AVJ   (10.06.2012 13:10)
2 Serg_52: посмотри пожалуйста личку, я там вопросик задал

23 Mrshilov   (10.06.2012 12:04)
Как у датчика с "Фокусировкой"? По паспорту 15 градусов, а по виду гораздо больше. Что на практике? Нужно фокусировать луч лазера на кривой поверхности, а измеритель с узким полем не найти.

1-30 31-52
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль:
Комментарии
Бесконтактный датчик температуры MLX90614
19.06.2016 - exersizze:
Интересное решение, спасибо.
Бесконтактный датчик температуры MLX90614
19.06.2016 - Mrshilov:
Можно проще:

$regfile = "m8def.dat"
$crystal = 800...
Использование загрузчика Bascom-AVR
18.06.2016 - Shishkanov:
Добрый вечер. Нужна помощь по Atmega 64A.
Часы, термометр, барометр, гигрометр в одном флаконе.
16.06.2016 - exersizze:
А в чем проблема? Берем прошивку и грузим ее обычным способом, как настроить фью...
Часы, термометр, барометр, гигрометр в одном флаконе.
15.06.2016 - MaxPower1996:
ребят всем привет
помогите загрузить боотлоадер и скажите как програмиров...
Часы, термометр, барометр, гигрометр в одном флаконе.
14.06.2016 - exersizze:
хрен их знает, на скрине видно что галка=0
Часы, термометр, барометр, гигрометр в одном флаконе.
14.06.2016 - zloytoni:
Спасибо большое за скрин! Фьюзы указаны с инверсией или без?
Часы, термометр, барометр, гигрометр в одном флаконе.
13.06.2016 - exersizze:
Если частота контроллера не выставлена то на дисплее и будут квадраты.
Ск...
Часы, термометр, барометр, гигрометр в одном флаконе.
11.06.2016 - zloytoni:
Собрал сей прибор, не запустился, на дисплей выдает только две строчки с квадрат...