Уровнемер ультразвуковым датчиком расстояния hc sr04. HC-SR04 Ультразвуковой модуль измерения расстояния
Дальномер — это устройство для измерения расстояния до некоторого предмета. Дальномер помогает роботам в разных ситуациях. Простой колесный робот может использовать этот прибор для обнаружения препятствий. Летающий дрон использует дальномер для баражирования над землей на заданной высоте. С помощью дальномера можно даже построить карту помещения, применив специальный алгоритм SLAM.
1. Принцип действия
На этот раз мы разберем работу одного из самых популярных датчиков — ультразвукового (УЗ) дальномера. Существует много разных модификаций подобных устройств, но все они работают по принципу измерения времени прохождения отраженного звука. То есть датчик отправляет звуковой сигнал в заданном направлении, затем ловит отраженное эхо и вычисляет время полета звука от датчика до препятствия и обратно. Из школьного курса физики мы знаем, что скорость звука в некоторой среде величина постоянная, но зависящая от плотности среды. Зная скорость звука в воздухе и время полета звука до цели, мы можем рассчитать пройденное звуком расстояние по формуле: s = v*t где v — скорость звука в м/с, а t — время в секундах. Скорость звука в воздухе, кстати, равна 340.29 м/с. Чтобы справиться со своей задачей, дальномер имеет две важные конструктивные особенности. Во-первых, чтобы звук хорошо отражался от препятствий, датчик испускает ультразвук с частотой 40 кГц. Для этого в датчике имеется пьезокерамический излучатель, который способен генерировать звук такой высокой частоты. Во-вторых, излучатель устроен таким образом, что звук распространяется не во все стороны (как это бывает у обычных динамиков), а в узком направлении. На рисунке представлена диаграмма направленности типичного УЗ дальномера. Как видно на диаграмме, угол обзора самого простого УЗ дальномера составляет примерно 50-60 градусов. Для типичного варианта использования, когда датчик детектирует препятствия перед собой, такой угол обзора вполне пригоден. Ультразвук сможет обнаружить даже ножку стула, тогда как лазерный дальномер, к примеру, может её не заметить. Если же мы решим сканировать окружающее пространство, вращая дальномер по кругу как радар, УЗ дальномер даст нам очень неточную и шумную картину. Для таких целей лучше использовать как раз лазерный дальномер. Также следует отметить два серьезных недостатка УЗ дальномера. Первый заключается в том, что поверхности имеющие пористую структуру хорошо поглощают ультразвук, и датчик не может измерить расстояние до них. Например, если мы задумаем измерить расстояние от мультикоптера до поверхности поля с высокой травой, то скорее всего получим очень нечеткие данные. Такие же проблемы нас ждут при измерении дистанции до стены покрытой поролоном. Второй недостаток связан со скоростью звуковой волны. Эта скорость недостаточно высока, чтобы сделать процесс измерения более частым. Допустим, перед роботом есть препятствие на удалении 4 метра. Чтобы звук слетал туда и обратно, потребуется целых 24 мс. Следует 7 раз отмерить, прежде чем ставить УЗ дальномер на летающих роботов.2. Ультразвуковой дальномер HC-SR04
В этом уроке мы будем работать с датчиком HC-SR04 и контроллером Ардуино Уно. Этот популярный дальномер умеет измерять расстояние от 1-2 см до 4-6 метров. При этом, точность измерения составляет 0.5 — 1 см. Встречаются разные версии одного и того же HC-SR04. Одни работают лучше, другие хуже. Отличить их можно по рисунку платы на обратной стороне. Версия, которая работает хорошо выглядит так:А вот версия, которая может давать сбои:
3. Подключение HC-SR04
Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:HC-SR04 | GND | VCC | Trig | Echo |
Arduino Uno | GND | +5V | 3 | 2 |
4. Программа
Итак, попробуем приказать датчику отправить зондирующий ультразвуковой импульс, а затем зафиксируем его возвращение. Посмотрим как выглядит временная диаграмма работы HC-SR04.На диаграмме видно, что для начала измерения нам необходимо сгенерировать на выводе Trig положительный импульс длиной 10 мкс. Вслед за этим, датчик выпустит серию из 8 импульсов и поднимет уровень на выводе Echo , перейдя при этом в режим ожидания отраженного сигнала. Как только дальномер почувствует, что звук вернулся, он завершит положительный импульс на Echo . Получается, что нам нужно сделать всего две вещи: создать импульс на Trig для начала измерения, и замерить длину импульса на Echo, чтобы потом вычислить дистанцию по нехитрой формуле. Делаем. int echoPin = 2; int trigPin = 3; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(" cm"); delay(100); } Функция pulseIn замеряет длину положительного импульса на ноге echoPin в микросекундах. В программе мы записываем время полета звука в переменную duration. Как мы уже выяснили ранее, нам потребуется умножить время на скорость звука: s = duration * v = duration * 340 м/с Переводим скорость звука из м/с в см/мкс: s = duration * 0.034 м/мкс Для удобства преобразуем десятичную дробь в обыкновенную: s = duration * 1/29 = duration / 29 А теперь вспомним, что звук прошел два искомых расстояния: до цели и обратно. Поделим всё на 2: s = duration / 58 Теперь мы знаем откуда взялось число 58 в программе! Загружаем программу на Ардуино Уно и открываем монитор последовательного порта. Попробуем теперь наводить датчик на разные предметы и смотреть в мониторе рассчитанное расстояние.
Задания
Теперь, когда мы умеем вычислять расстояние с помощью дальномера, сделаем несколько полезных устройств.- Строительный дальномер. Программа каждые 100мс измеряет расстояние с помощью дальномера и выводит результат на символьный ЖК дисплей. Для удобства полученное устройство можно поместить в небольшой корпус и запитать от батареек.
- Ультразвуковая трость. Напишем программу, которая будет «пищать» зуммером с различной частотой, в зависимости от измеренного расстояния. Например, если расстояние до препятствия более трех метров — зуммер издает звук раз в пол секунды. При расстоянии 1 метр — раз в 100мс. Менее 10см — пищит постоянно.
Заключение
Ультразвуковой дальномер — простой в использовании, дешевый и точный датчик, который отлично выполняет свою функцию на тысячах роботов. Как мы выяснили из урока, у датчика есть недостатки, которые следует учитывать при постройке робота. Хорошим решением может стать совместное использование ультразвукового дальномера в паре с лазерным. В таком случае, они будут нивелировать недостатки друг друга.Для измерения расстояния до объектов, можно воспользоваться ультразвуковым дальномером HC-SR04, который работает по принципу локатора, как у летучих мышей. С помощью подобного датчика можно конструировать различных роботов, которые будут объезжать препятствия, собирать схемы автоматического включения освещения либо другой нагрузки, собирать ультразвуковую охранную систему. Дальномер HC-SR04 представляем из себя готовый модуль, который можно подключать к различным микроконтроллерам, свои примеры буду проводить совместно с китайским аналогом Arduino UNO.
На лицевой стороне датчика находятся два сенсора, передающий (T) и принимающий (R). Передающий сенсор генерирует звуковые импульсы с частотой 40 кГц. Достигнув препятствия, импульс отражается и улавливает принимающим сенсором. С достаточно высокой точностью можно определить расстоянию до объекта, которое может составлять от 2 см до 4 м. На работу датчиков не влияет солнечный свет и цвет объекта.
На обратной стороне датчика находится электроника. Микросхема MAX3232 - управляет передающим сенсором. Операционный усилитель LM324 усиливает сигнал, полученный с принимающего сенсора.
Для подключения к микроконтроллеру, используется 4 пина:
Vcc
– подключается к пину 5V Arduino.
Trig
– цифровой вход, на него подаётся логическая единица, длительностью 10 мкс. Затем датчик передаёт 8 циклов ультразвукового сигнала на частоте 40 кГц. Когда будет получен отраженный сигнал, будет рассчитано расстояние до объекта.
Echo
– цифровой выход. На него будет подана логическая единица, после завершения расчётов. Время подачи логической единицы, пропорционально измеренному расстоянию.
Trig и Echo подключаются к цифровым выводам Arduino, к каким именно, задаётся в скетче.
Gnd
– соединяется с соответствующим пином платы Arduino.
Схема подключения HC-SR04 к Arduino, на примере китайского аналога Uno.
Запишем в Ардуино скетч №1 , который будет изменять расстояние до объекта. В примерах, пин «Trig » подключен ко 2 пину Uno, а пин «Echo » на 3 пин.
int TrigPin = 2;//пин Trig подключаем ко 2-му пину Arduino. int EchoPin = 3;//пин Echo подключаем ко 3-му пину Arduino. void setup() { |
Строка «duration = duration/29/2; » вычисляет расстояние в «см », если нужно производить расчёты в дюймах, строка должна выглядеть так: «duration = duration/74/2; ».
Результат выполнения скетча будет отображаться в окне монитора последовательного порта.
Скетч №2 включает встроенный на плате Uno светодиод, если расстояние до объекта менее 50 см. Светодиод висит на 13 пине.
int TrigPin = 2; int EchoPin = 3; int LedPin = 13; void setup() { |
Если вместо светодиода, подключить лампу накаливания, как это описано в статье « », у нас получится простая система автоматического освещения. Разместив подобную конструкцию в каком то помещении, при попадании посетителя в зону действия дальномера, в помещении автоматически включится свет. Ток покоя дальномера составляет менее 2 мА.
В скетче №3 заменим светодиод на пьезоэлемент (пищалка, зуммер), которая будет издавать звук, если расстояние до объекта менее 50 см. Таким образом у нас получается простой звуковой радар или звуковая сигнализация.
Подобные «пищалки» применяются в компьютерах для оповещения BIOS, а так же в детских игрушках со звуком.
Схема подключения простая, чёрный провод зуммера подключаем к пину GND ардуино, красный к любому свободному цифровому пину, с функцией ШИМ (3,5,6,9,10,11,13). В примере это пин 5. Подключать пьезоизлучатель будем с помощью функции analogWrite() . С этой функцией нельзя изменять тональность звука, звук будет постоянно на частоте около 980 Гц.
int TrigPin = 2; int EchoPin = 3; int BeepPin = 5; void setup() { |
Если расстояние до объекта будет менее 50 см, зуммер издаст звук.
В скетче №4 мы так же будем использовать зуммер, но только с функцией tone() , которая будет позволять менять тональность звука, при разных ситуациях.
int TrigPin = 2; int EchoPin = 3; int BeepPin = 5; void setup() { |
В строке " tone(BeepPin, 500) ;" параметром "500 " задаётся частота звука - 500 Гц. Этот параметр можно выставлять от 31 Гц и до пределов, которыми ограничены параметры пьезоизлучателя и человеческого слуха. Данный скетч будет повторять эксперимент скетча №3, только с использованием функции tone(), которая будет устанавливать частоту звука.
В скетче №5 попробуем изменять тональность звука. При расстоянии более 50 см, будет издаваться звук, частотою 1000Гц. Если расстояние до объекта будет менее 50 см, звук изменит частоту на 500Гц.
int TrigPin = 2; int EchoPin = 3; int BeepPin = 5; void setup() { |
Используя функцию tone() нужно обратить внимание на то, что она мешает использовать ШИМ на пинах 3 и 11 Ардуино, (на платформу Mega это не распространяется). Допустим, в моих примерах функция tone() вызывается на 5 пине, но она может мешать работе ШИМ на выводах 3 и 11, это нужно учитывать при построении дальнейших своих устройств. Ещё один момент, с функцией tone() нельзя одновременно использовать более одного пьезоизлучателя. Для того что бы включить звук на втором пьезоизлучателе, первый обязательно нужно отключить функцией noTone() .
В процессе данных экспериментах выяснил, что более точное определение расстояния производится с расстоянием до 2 м. Так же, дальномер до исследуемого объекта нужно располагать под прямым углом, поскольку эффективный угол наблюдения порядка 15°.
Входное напряжение 5 В постоянного тока, подаётся на выводы Vcc и GND датчика.
Подробнее о датчике:
Если подать положительный импульс на вход датчика TRIG длительностью 10 мкс, то датчик отправит звуковую волну (8 импульсов на частоте 40 кГц - ультразвук) и установит уровень логической «1» на выходе ECHO. Звуковая волна отразится от препятствия и вернётся на приёмник датчика, после чего он сбросит уровень на выходе ECHO в логический «0» (то же самое датчик сделает, если звуковая волна не вернётся в течении 38 мс.) В результате время наличия логической «1» на выходе ECHO равно времени прохождения ультразвуковой волны от датчика до препятствия и обратно. Зная скорость распространения звуковой волны в воздухе и время наличия логической «1» на выводе ECHO, можно рассчитать расстояние до препятствия.
Расстояние вычисляется умножением скорости на время (в данном случае скорости распространения звуковой волны V , на время ожидания эха Echo ). Но так звуковая волна проходит расстояние от датчика до объекта и обратно, а нам нужно только до объекта, то результат делим на 2:
L = V * Echo / 2
- L – расстояние (м);
- V – скорость звука в воздухе (м/с);
- Echo – время ожидания эха (с).
Скорость звука в воздухе , в отличии от скорости света, величина не постоянная и сильно зависит от температуры:
V 2 = γ R T / M
- V – скорость звука в воздухе (м/с)
- γ – показатель адиабаты воздуха (ед.) = 7/5
- R – универсальная газовая постоянная (Дж/моль*K) = 8,3144598(48)
- T ° К) = t°C + 273,15
- M – молекулярная масса воздуха (г/моль) = 28,98
Подставив в формулу известные значения γ , R , M , получим:
V ≈ 20,042 √T
- T – абсолютная температура воздуха (° К) = t°C + 273,15
Осталось объединить формулы вычисления V и L , и перевести L из м в см, Echo из с в мкс, T из °К в °C, получим:
L ≈ Echo √(t+273,15) / 1000
- L – расстояние (см)
- Echo – время ожидания эха (мкс)
- t – температура воздуха (°C)
iarduino_HC_SR04 и iarduino_HC_SR04_int , синтаксис обеих библиотек одинаков. Они сами рассчитывают все значения и возвращают только расстояние в см. Температура по умолчанию установлена в 23°C, но её можно указывать. Работа с библиотеками и их функции описаны ниже.
Для работы с датчиком, нами разработаны две библиотеки iarduino_HC_SR04 и iarduino_HC_SR04_int , синтаксис обеих библиотек одинаков.
- Преимуществом библиотеки iarduino_HC_SR04 является то, что датчики можно подключать к любым выводам Arduino , а недостаток заключается в том, что библиотека ждёт ответа от датчика, который может длиться до 38 мс.
- Преимуществом библиотеки iarduino_HC_SR04_int является то, что она не ждёт ответа от датчиков (не приостанавливает выполнение скетча), но выводы ECHO датчиков нужно подключать только к тем выводам Arduino , которые используют внешние прерывания.
Подробнее про установку библиотеки читайте в нашей .
Примеры:
Определение расстояния с использованием библиотеки iarduino_HC_SR04:
#includeОпределение расстояния с использованием библиотеки iarduino_HC_SR04_int:
#include Результат работы обоих примеров:
Из примера видно, что если во время измерений не учитывать температуру воздуха, то можно получить результаты с высокой погрешностью.
1 Принцип действия ультразвукового дальномера HC-SR04
Действие ультразвукового дальномера HC-SR04 основано на принципе эхолокации. Он излучает звуковые импульсы в пространство и принимает отражённый от препятствия сигнал. По времени распространения звуковой волны к препятствию и обратно определяется расстояние до объекта.
Запуск звуковой волны начинается с подачи положительного импульса длительностью не менее 10 микросекунд на ножку TRIG дальномера. Как только импульс заканчивается, дальномер излучает в пространство перед собой пачку звуковых импульсов частотой 40 кГц. В это же время на ножке ECHO дальномера появляется логическая единица. Как только датчик улавливает отражённый сигнал, на выводе ECHO появляется логический ноль. По длительности логической единицы на ножке ECHO («Задержка эхо» на рисунке) определяется расстояние до препятствия.
Диапазон измерения расстояния дальномера HC-SR04 - до 4 метров с разрешением 0,3 см. Угол наблюдения - 30°, эффективный угол - 15°. Ток потребления в режиме ожидания 2 мА, при работе - 15 мА.
2 Схема подключения датчика расстояния
Питание ультразвукового дальномера осуществляется напряжением +5 В. Два других вывода подключаются к любым цифровым портам Arduino, мы подключим к 11 и 12.
3 Получение дистанции до объекта с датчика HC-SR04
Теперь напишем скетч, определяющий расстояние до препятствия и выводящий его в последовательный порт. Сначала задаём номера выводов TRIG и ECHO - это 12 и 11 пины. Затем объявляем триггер как выход, а эхо - как вход. Инициализируем последовательный порт на скорости 9600 бод. В каждом повторении цикла loop() считываем дистанцию и выводим в порт.
Const int trigPin = 12; const int echoPin = 11; void setup() { pinMode(trigPin, OUTPUT); // триггер - выходной пин pinMode(echoPin, INPUT); // эхо - входной digitalWrite(trigPin, LOW); Serial.begin(9600); // инициализация послед. порта } void loop() { long distance = getDistance(); // получаем дистанцию с датчика Serial.println(distance); // выводим в последовательный порт delay(100); } // Определение дистанции до объекта в см long getDistance() { long distacne_cm = getEchoTiming() * 1.7 * 0.01; return distacne_cm; } // Определение времени задержки long getEchoTiming() { digitalWrite(trigPin, HIGH); // генерируем 10 мкс импульс запуска delayMicroseconds(10); digitalWrite(trigPin, LOW); // определение на пине echoPin длительности уровня HIGH, мкс: long duration = pulseIn(echoPin, HIGH); return duration; }
Функция getEchoTiming() генерирует импульс запуска. Она как раз создаёт тот 10-микросекундный импульс, который является триггером для начала излучения дальномером звукового пакета в пространство. Далее она запоминает время от начала передачи звуковой волны до прихода эха.
Функция getDistance() рассчитывает дистанцию до объекта. Из школьного курса физики мы помним, что расстояние равно скорость умножить на время: S = V×t Скорость звука в воздухе 340 м/сек, время в микросекундах мы знаем (переменная duration ). Чтобы получить время duration в секундах, нужно разделить его на 1 000 000. Так как звук проходит двойное расстояние - до объекта и обратно - нужно ещё разделить результат пополам. Вот и получается, что расстояние до объекта S = 34000 см/сек × duration / 1 000 000 сек / 2 = 1,7 см/сек / 100, что мы и написали в скетче.
Операцию умножения микроконтроллер выполняет быстрее, чем операцию деления, поэтому :100 я заменил на эквивалентное ×0,01 .
4 Библиотека для работы с эхолокатором HC-SR04
Также для работы с ультразвуковым дальномером написано множество библиотек. Например, вот эта библиотека Ultrasonic . Установка библиотеки происходит стандартно: скачать, разархивировать в директорию /libraries/ , которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться.
Установив библиотеку, напишем новый скетч.
#include
Результат его работы тот же - в мониторе последовательного порта выводится дистанция до объекта в сантиметрах.
Если в скетче написать float dist_cm = ultrasonic.Ranging(INC); - дистанция будет отображаться в дюймах.
5 Выводы по работе с сонаром HC-SR04
Итак, мы с вами подключили к Arduino ультразвуковой дальномер HC-SR04 и получили с него данные двумя разными способами: с использованием специальной библиотеки и без.
Преимущество использования библиотеки в том, что количество кода значительно сокращается и улучшается читаемость программы, вам не приходится вникать в тонкости работы устройства и вы сразу же можете его использовать. Но в этом же кроется и недостаток: вы хуже понимаете, как работает устройство и какие в нём происходят процессы. В любом случае, каким способом пользоваться - решать только вам.
Приобрести ультразвуковой дальномер по хорошей цене можно