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

HC-SR04 один из самых распространённых и самый дешевый дальномер в робототехники. Он позволяет измерять расстояния от 2см до 4м (может и больше) с приличной точностью 0,3-1см. На выходе цифровой сигнал, длительность которого пропорционально равна расстоянию до препятствий.

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

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

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

УЗ дальномер HC-SR04

УЗ дальномер HC-SR04

Характеристики датчика:

Питание — 5В
Потребляемый ток — менее 2мА
Эффективный угол обзора — 15гр
Измеряемое расстояние — 2см – 5м
Точность — 3мм
Взяты из документации к датчику

Принцип работы HC-SR04

Принцип работы

Принцип работы

У модуля есть 4 вывода, два из которых это питание – земля и +5В, а еще два – данные. Опрос модуля производится следующим способом: на вывод Trig посылается импульс длительностью 10мкс. Дальномер генерирует посылку из 8 ультразвуковых 40КГц импульсов. Которые, отражаясь от большинства поверхностей, возвращаются обратно, если не угаснут в пути. Сразу после отправки сигнала на Trig начинаем ожидать ответного положительного сигнала выводе Echo, длительностью от 150мкс до 25мс, который пропорционален расстоянию до объекта. Точнее времени прохождения от датчика до препятствия и обратно. Если ответа нет (датчик не услышит своего эха) – то сигнал вернется длиною в 38 мс. Расстояние до объекта (препятствия) вычисляется по следующей простой формуле:

L=F/58

Где: L – расстояние в сантиметрах до объекта, а F – длина импульса на выводе Echo.
Рекомендуемое время опроса датчика 50мс или 20Гц.

Первые тесты этого модуля проводил при помощи цифрового осциллографа, который ловил ответ от модуля и в ручную, быстрым замыканием Trig на + питания, пытался получить стартовый 10мкс импульс. В половине случаев получалось 🙂 .

Конструкция

Датчик был подключен к плате вольтметра с общим анодом, немного модифицированному для работы с ним (убраны ненужные делитель с конденсатором и добавлен вывод от RA3). Был применен микроконтроллер от 5 версии вольтметра – PIC16F688, с переработанной для УЗ дальномера прошивкой.

Схема

Схема

Код

Инициализация

INTCON=0b11101000; 	//	Настройка прерываний
IOCA3=1;  			//	Разрешить прерывания от RA3
T1CON =0b00000000; 	//	Настройка TMR1
TMR1IE=1; 			//	Разрешить прерывания от TMR1

Разрешаем прерывания от TMR0 (вывод на семисегментник), от периферии, точнее от TMR1, который считает время прохождения звукового сигнала от дальномера и обратно, и ещё разрешаем прерывания от порта A, а точнее от RA3.

Основной код.

T0IE=0; 			 //	Запрещаем прерывания от TMR0
SetBit(PORTA,4); 	 //	Формируем импульс ~10мкс
delay(10);
ClrBit(PORTA,4);
while(TMR1ON){delay(10);} //	ждём ответа от TMR1
T0IE=1; 			//	Разрешить прерывания от TMR0
		
calc=in/58;			//	Вычисляем расстояние

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

В прерываниях:

void interrupt isr(void)
{
	if(RAIF) 				//	Обработка прерывания от порта A
	{
		if(RA3) 			//	Обработка прерывания от RA3, по фронту
		{
			TMR1ON=0;
			TMR1H=0;
			TMR1L=0;
			TMR1ON=1; 		//	Запускаем 1 таймер
		}else				//	Обработка прерывания от RA3, по спаду
		{
			TMR1ON=0; 		//	Останавливаем 1 таймер
			in=TMR1H< < 8; //	Списываем значение 1 таймера
			in=TMR1L+in;
		}
		RAIF=0;
	}
	if(TMR1IF) 				//	Обработка прерывания от 1 таймера, если случатся
	{
		TMR1IF=0;
	}
. . .
}

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

В приведенном исходнике прошивки вырезаны фильтры, из-за этого показания индикатора могут немного скакать (+-1 значение), в самой прошивки фильтры сохранены.

Скачать прошивку и исходник

Статья обновлена 13.05.2014

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

  1. Natalya пишет 15.05.2014 в 00:11 #

    Замечательный сайт! Обширно раскрыта суть материала и проанализированы детали.
    Лично спаяла схемку и удостоверилась в её работоспособности.

    Отдельная благодарность Alex’у за оперативное и грамотное разъяснение мне возникших вопросов.

  2. владимир пишет 03.07.2014 в 11:04 #

    Занимательная схемка. Обязательно соберу. Один вопрос: как сделать, чтобы срабатывало исполнительное устройство при определенных расстояниях до уровня воды?

  3. Alex_EXE пишет 04.07.2014 в 15:35 #

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

  4. Олег пишет 09.07.2014 в 18:13 #

    Сайт отличный . Отдельная благодарность автору .
    Уже делал схемки с этого сайта все гуд.
    Интересно как будет работать если поставить на машину данное устройство? Правильно я понял что тут наладки не нужно делать только прошить и пользоваться ?

  5. Alex_EXE пишет 10.07.2014 в 12:12 #

    На машину порекомендовал бы поставить только специальный — влагозащищённый датчик, к примеру DYP-ME007, они, кстати, как раз в паркрониксах используются.
    Наладка не требуется.
    Ещё напомню, что ультразвуковые датчики отличаются капризностью, не от любой поверхности и не под любым углом отразится УЗ волна.

  6. Роман пишет 10.11.2014 в 19:35 #

    Здравствуйте, а можно ли использовать PIC16f628, вместо PIC16f688? естественно переписав программу. Спасибо

  7. Alex_EXE пишет 10.11.2014 в 21:02 #

    Можно.

  8. Юрий пишет 17.03.2015 в 01:57 #

    может кто-нибудь подсказать программатор для PIC16F688?

  9. Alex_EXE пишет 17.03.2015 в 02:15 #

    На счёт простых программаторов, типа JDM и Extra-PIC точно не скажу, хотя Extra-Pic+ вроде может. А вот различные USB, на подобие PicKit2 и выше и их клонов — они точно поддерживают.

  10. Михаил пишет 08.05.2015 в 22:58 #

    К сожалению, я так и не осилил понять, подскажите, пожалуйста, для чего здесь используется TMR0?

  11. Alex_EXE пишет 13.05.2015 в 15:56 #

    Динамическая индикация. В файлах к статье приведен код полностью.

  12. Whisper119 пишет 18.05.2015 в 23:25 #

    А какой компилятор использовался?

  13. Alex_EXE пишет 19.05.2015 в 02:47 #

    HITECH, версию не помню.

  14. olegtur пишет 08.12.2016 в 23:47 #

    630й пик можно втулить вместо 688?

  15. Alex_EXE пишет 15.12.2016 в 11:58 #

    Если прошивка влезет — то да. Программу придется перекомпилироват под новый камень.

  16. Дмитрий пишет 18.08.2017 в 19:41 #

    дравствуйте Alex_EXE

    Можете инвертировать сигналы на семи сегментный индикатор?
    Я нашел яркие индикаторы которые на солнце будет хорошо видно, но они с общим катодом.
    Думаю это вам не составит большего труда.
    Заранее спасибо!

  17. Alex_EXE пишет 22.09.2017 в 18:04 #

    Пока не могу, до середины ноября, можно сказать, недоступен.

  18. Gary пишет 19.11.2018 в 18:55 #

    Подскажите, не могу понять, как это контроллеру удается принять длину импульса как данное

  19. Дмитрий пишет 19.12.2021 в 22:24 #

    Можете пожалуйста опубликовать код с 2-3 посылами импульса и усреднением значения этих импульсов для более точного показателя расстояния.

Комментарии RSS

Оставьте отзыв