HC-SR04. Ультразвуковой датчик измерения расстояния

14/11/2013 - 18:06 Павел Бобков

Введение

HC-SR04 - это ультразвуковой датчик, позволяющий измерять расстояние до преграды в диапазоне от 2 до 400 см. Он представляет собой плату, на которой размещены излучатель и приемник ультразвука и управляющая электронная схема. Датчик имеет небольшие габариты и простой интерфейс: два вывода питания, один вход и один выход. Может быть использован в качестве датчика присутствия в умном доме или охранной системе, а также для всяких роботизированных поделок. Также на нем можно сделать парктроник для машины, только в уличных условиях он быстро загрязнится.

Подключение к микроконтроллеру

Плата датчика имеет 4 вывода:

- плюсовой вывод питания (Vcc)
- вход TRIG
- выход ECHO
- ноль питания (GND)

На выводы питания подается постоянное напряжение 5 В. По даташиту датчик потребляет в рабочем режиме 15 мА. У меня на макете мультиметр показывал потребление ~6.5 мА, но я выполнял замеры расстояния с низкой частотой (единицы герц). 

Вход TRIG подключается к любому выводу микроконтроллера. На этот вывод нужно подавать импульсный цифровой сигнал длительностью 10 мкс. По сигналу на входе TRIG датчик посылает пачку ультразвуковых импульсов.

После приема отраженного сигнала, датчик формирует на выводе ECHO импульсный сигнал, длительность которого пропорционально расстоянию до преграды. Вывод ECHO нужно подключить к выводу внешнего прерывания или входу схемы захвата таймера, в зависимости от метода измерения длительности сигнала микроконтроллером.


Временная диаграмма работы датчика HC-SR04 показана на рисунке ниже. 


Расстояние можно посчитать по следующей формуле:


S = Tus/58, [см]


где Tus - длительность эхо импульса в микросекундах, а 58 - константа. 

Тестовый проект AVR + HC-SR04

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

Я написал программный модуль для работы с датчиком HC-SR04 так, чтобы можно было использовать внешние прерывания INT0, INT1 или INT2 и любой из аппаратных таймеров. Используемый таймер просто непрерывно считает тактовые импульсы в режиме Normal (от 0 до максимума), вызывая прерывания после переполнения счетного регистра. Делитель для таймера может быть любым, главное указать его в программном модуле датчика. Значение предделителя таймера используется при расчете длительности эхо сигнала и, следовательно, влияет на расчет расстояния. 

Измерение длительности эхо сигнала датчика производятся путем захвата значений таймера по срабатыванию внешнего прерывания. Настройка таймера не производится в программном модуле датчика, ее нужно выполнять отдельно. Так сделано, чтобы привязывать программный модуль к таймеру, а не наоборот. 

Модуль представляет собой два файла usens.h и usens.c. Набор функций модуля такой:

void USENS_Init(void) - настройка используемых выводов, инициализация внутренних переменных. Эта функция вызывается в начале main функции. 

void USENS_Handler(void) - запускает процесс измерения, формируя сигнал для входа TRIG, а по окончании измерения вычисляет расстояние до объекта. Эту функцию нужно запихнуть в бесконечный цикл. 

uint16_t USENS_GetDistance(void) - возвращает расстояние до объекта, если оно было измерено. В противном случае возвращает 0. Может вызываться в любое время. 

void USENS_CountingOvf(void) - эту функцию нужно запихнуть в прерывание используемого таймера. Она подсчитывает число переполнений таймера. 

В заголовочном файле модуля есть настройки. Они все прокомментированы, здесь я их описывать не буду. Не думаю, что многие будут использовать мой код. 

Тестовый проект измеряет расстояние до объекта и выводит результат на LCD дисплей. Схема моего макета была такой. 

Точность датчика HC-SR04

Я не разбирался в этом вопросе детально, потому что у меня не было такой задачи, но пару слов об этом стоит сказать. 

По паспорту датчик измеряет расстояние с разрешением ~3 мм в диапазоне от 3 до 400 см. 

На результат измерения влияет угол расположения отражающей поверхности. Если поверхность расположена перпендикулярно пути распространения ультразвукового сигнала датчика, результат измерения будет точнее. 

Также оказывает влияние размер отражающей поверхности и ее структура. От мелких объектов ультразвуковой сигнал просто не будет отражаться. 

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

И последний момент - скорость распространения звуковых волн в воздухе зависит от его температуры. В датчике этот момент, скорее всего, никак не учитывается, поэтому требовать от него высокой точности не стоит. 

Файлы

AVR-HC-SR02.rar проект для IAR`a
datasheet HC-SR04

Comments   

# Neptun 2013-11-15 07:30
Есть и с температурной компансацией US-100:


http://www.ebay.com/itm/US-100-Ultrasonic-Distance-Measuring-Sensor-Module-with-Temperature-Compensation-/200957665219?pt=LH_DefaultDomain_0&hash=item2eca029fc3

И диапазон напряжений лучше:Voltage: 2.4V-5.5VDC (для тех кто будет подключать к АРМ,там 3.3V)
# Neptun 2013-11-15 07:34
И по UART может работать :-)
# Pashgan 2013-11-15 18:42
Классно. Я не знал, что такие тоже есть.
# Kodex 2013-11-16 11:48
В chipster'е он 200 р всего.
# алексей 2014-04-03 20:11
приветствую. посетила идея, но похоже бредовая. решил я сенсоры заменить на данном девайсе на водонепроницаем ые и получит таким образом глубиномер. брал у китайцев на те же 40кГц. в результате бяка с показаниями. коэффициент для воды был уже кем то посчитан- 0,69. может я не одинок в этом? кто пробовал и что получилось?
# Pashgan 2014-04-04 15:33
Не пробовал.
# Евгений 2014-07-28 16:37
Pashgan
Добрый день.скачал проект ваш к дачику ультра звука прошил и не работает =) ,скачал установил IAR (я к Code Vision привык,я начинающий) я так понял надо самому проставить пины в настройках портов?
# Alex_Jet 2015-12-30 09:34
Добрый день! Необходимо подключить 8 шт. HC-SR04 на Mega2560. Под WinAVR освоил измерение длительности импульса по INTx от одного датчика. Пытаюсь завести на тот же INTx второй HC-SR04, запускаю их отдельными выходами МК. Пока результат нулевой. Работаю с флагами и выводом лога на UART. Не сталкивались с таким случаем? Какие тут (объединение выходов ECHO нескольких датчиков) есть подводные камни?
# AGE 2015-12-30 17:59
А как вы их объединяете на одну ногу прерывания? Нужно какое-то подобие схемы ИЛИ, например через диоды и резистор подтяжки, или транзисторы запараллеленые коллекторами и резистор подтяжки на плюс питания (только инверсия входа будет)
# Alex_Jet 2016-01-01 16:22
Большое спасибо за ответ. Уже разобрался, подключив осциллограф к INTx, к которому были подцеплены выходы с двух HC-SR04. Грешил на программу, однако при параллельном подключении второго HC-SR04 амплитуда сигнала падала очень сильно. Подключил каждый HC-SR04 через ключ по схеме с ОК, сделал программную подтяжку INTx к +5В (на плате надо будет предусмотреть 10к резистор), в обработке прерывания сделал инверсию и все 8 шт. HC-SR04 отлично работают с периодом запуска 60 мс.
# Bredov-IV 2016-08-17 20:23
Бредовая идея, оправдывание фамилии:
к такому сенсору присобачить дешёвую тиньку и получить уже цифровой датчик с заданным протоколом. Если с алибабы ложками грести и то и другое, то вполне себе сносный вариант
# Dimon89 2016-09-18 06:39
зачем использовать таймер и внешнее прерывание, когда это реализуется на таймере и прерывании по захвату этого же таймера- без считывания счетчика и т.д.

У вас недостаточно прав для комментирования.