Ультразвуковой дальномер HC-SR04
HC-SR04 один из самых распространённых и самый дешевый дальномер в робототехники. Он позволяет измерять расстояния от 2см до 4м (может и больше) с приличной точностью 0,3-1см. На выходе цифровой сигнал, длительность которого пропорционально равна расстоянию до препятствий.
Ультразвуковой дальномер
Данный датчик был мною уже давно приобретен и лежал в своей коробочке почти забытый. Но в рамках одного проекта был извлечен на белый свет и, для ознакомления, на основе него и платы вольтметра был построен достаточно компактный дальномер.
УЗ дальномер 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
Alex_EXE | 30.12.2013 | Измерительная техника |
Natalya пишет 15.05.2014 в 00:11 #
Замечательный сайт! Обширно раскрыта суть материала и проанализированы детали.
Лично спаяла схемку и удостоверилась в её работоспособности.
Отдельная благодарность Alex’у за оперативное и грамотное разъяснение мне возникших вопросов.
владимир пишет 03.07.2014 в 11:04 #
Занимательная схемка. Обязательно соберу. Один вопрос: как сделать, чтобы срабатывало исполнительное устройство при определенных расстояниях до уровня воды?
Alex_EXE пишет 04.07.2014 в 15:35 #
Взять контроллер с большим количеством выводов, добавить коммутирующие элементы, дополнить прошивку.
Подобное готовое устройство у меня уже разработано и сейчас проходит тестирование в жёстких условиях, но оно относиться к коммерческим проектам. Если интересно — то обращайтесь.
Олег пишет 09.07.2014 в 18:13 #
Сайт отличный . Отдельная благодарность автору .
Уже делал схемки с этого сайта все гуд.
Интересно как будет работать если поставить на машину данное устройство? Правильно я понял что тут наладки не нужно делать только прошить и пользоваться ?
Alex_EXE пишет 10.07.2014 в 12:12 #
На машину порекомендовал бы поставить только специальный — влагозащищённый датчик, к примеру DYP-ME007, они, кстати, как раз в паркрониксах используются.
Наладка не требуется.
Ещё напомню, что ультразвуковые датчики отличаются капризностью, не от любой поверхности и не под любым углом отразится УЗ волна.
Роман пишет 10.11.2014 в 19:35 #
Здравствуйте, а можно ли использовать PIC16f628, вместо PIC16f688? естественно переписав программу. Спасибо
Alex_EXE пишет 10.11.2014 в 21:02 #
Можно.
Юрий пишет 17.03.2015 в 01:57 #
может кто-нибудь подсказать программатор для PIC16F688?
Alex_EXE пишет 17.03.2015 в 02:15 #
На счёт простых программаторов, типа JDM и Extra-PIC точно не скажу, хотя Extra-Pic+ вроде может. А вот различные USB, на подобие PicKit2 и выше и их клонов — они точно поддерживают.
Михаил пишет 08.05.2015 в 22:58 #
К сожалению, я так и не осилил понять, подскажите, пожалуйста, для чего здесь используется TMR0?
Alex_EXE пишет 13.05.2015 в 15:56 #
Динамическая индикация. В файлах к статье приведен код полностью.
Whisper119 пишет 18.05.2015 в 23:25 #
А какой компилятор использовался?
Alex_EXE пишет 19.05.2015 в 02:47 #
HITECH, версию не помню.
olegtur пишет 08.12.2016 в 23:47 #
630й пик можно втулить вместо 688?
Alex_EXE пишет 15.12.2016 в 11:58 #
Если прошивка влезет — то да. Программу придется перекомпилироват под новый камень.
Дмитрий пишет 18.08.2017 в 19:41 #
дравствуйте Alex_EXE
Можете инвертировать сигналы на семи сегментный индикатор?
Я нашел яркие индикаторы которые на солнце будет хорошо видно, но они с общим катодом.
Думаю это вам не составит большего труда.
Заранее спасибо!
Alex_EXE пишет 22.09.2017 в 18:04 #
Пока не могу, до середины ноября, можно сказать, недоступен.
Gary пишет 19.11.2018 в 18:55 #
Подскажите, не могу понять, как это контроллеру удается принять длину импульса как данное
Дмитрий пишет 19.12.2021 в 22:24 #
Можете пожалуйста опубликовать код с 2-3 посылами импульса и усреднением значения этих импульсов для более точного показателя расстояния.