Print this page

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

Related items