Ультразвуковой дальномер HC-SR04

 По случаю приобрел себе ультразвуковой дальномер HC-SR04. Девайс представляет из себя модуль с двумя пъезоизлучателями, один из которых служит излучателем, а второй – приемником ультразвуковой волны; плюс управляющая электроника для управления излучателем и приемником. Для подключения модуль имеет 4-х контактный разъем: два из которых питание (требуется 5 вольт), и еще два для общения с микроконтроллером.

  Интерфейс связи тут организован очень просто: на вход подаем короткий умпульс  длительностью 10-15 микросекунд и ждем импульса на выходе. Как только до приемника дойдет отраженная волна, модуль сам рассчитает расстояние и выдаст на ногу Echo импульс высокого уровня длинной до 25 мс. Длина выходного импульса будет пропорциональна расстоянию до препятствия от которого отразилась ультразвуковая волна. Нам остается только поймать этот импульс, посчитать его длину и перевести это значение в расстояние.

  

Технические характеристики: 

 Характеристики потырены с документации на модуль. Кроме этого производитель приводит формулу, по которой рассчитывать расстояние в зависимости от длительности импульса. 

  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.4 = Output          ‘выход для подключения ноги Trigger

Trigger Alias Portd.4

Trigger = 0

Config Portd.5 = Input           ‘вход для импульса Echo

Config Portd.7 = 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

S = A * K                        ‘переводим значения

Cls

Lcd Fusing(s , “###.#”)          ‘выводим данные на LCD, расстояние в сантиметрах

If S < 20 Then                       ‘если растояние меньше заданного предела

 Sound , Portb.0 , 200 , 500         ‘подадим голос через динамик на PortB.0

 Led = 1                             ‘и мигнем светодиодом

 Waitms 20

 Led = 0

End If

Waitms 100

Loop

End

 

 На дисплей выводится число, показывающее расстояние до препятствия в сантиметрах. Еще добавил проверку на минимальное расстояние, если оно меньше 20-и сантиметров, будет выдан звуковой сигнал. По этому же принципу можно без проблем собрать парктроник своими руками 🙂

 А теперь испытания:

 Честно говоря не ожидал таких отличных результатов! Точность измерения проверял только до 50 см, показания прыгали не больше ± 0,5 см. И больше зависили от того, насколько вертикальна плоскость препятствия. Так же сигнал плохо отражается или вообще не отражается от ворсистых поверхностей. Оно и понятно, законы физики не обойдешь. В общем, модуль очень даже не плох!

 


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 3 + 7

Добавить изображение

Последние статьи