Что такое ультразвуковые датчики
Содержание:
- Введение
- Общая информация об ультразвуковых датчиках
- Датчик расстояния в проектах Arduino
- Arduino Code — Simple Sound
- Шаг 3: теория
- Effect of Temperature on Distance Measurement
- HC-SR04 Hardware Overview
- Предисловие
- Виды и сфера использования прибора
- Example code JSN-SR04T with Arduino and NewPing library
- Подключение HC-SR04
- Плюсы и минусы использования
- Применение сенсоров ультразвукового излучения в робототехнике
- Код
- Где используются датчики
- 4Библиотека для работы с эхолокатором HC-SR04
- Code
- Step 2: Setup
- 4Калибровка ультразвукового дальномера
- Описание методов библиотеки HCSR04.zip
Введение
В данной статье объясняется, как определить местоположение объекта с помощью Arduino, двух ультразвуковых датчиков и формулы Герона для треугольников. Движущихся частей в проекте нет.
Формула Герона позволяет рассчитать площадь любого треугольника, для которого известны все стороны. Как только вы узнаете площадь треугольника, вы сможете рассчитать положение одного объекта (относительно известной базовой линии), используя тригонометрию и теорему Пифагора.
Точность отличная. При использовании распространенных ультразвуковых датчиков HC-SR04 или HY-SRF05 возможны большие области обнаружения.
Конструкция проста: всё, что вам нужно, это острый нож, два сверла, паяльник и ножовка по дереву.
Изображения:
- видеоролик, показывающий работу устройства;
- фото 1 показывает собранный эхолокатор;
- на фото 2 показан типовой дисплей. Объект отображается красной (мигающей) точкой;
- на фото 3 показана тестовая установка, используемая на видео. Было необходимо установить два ультразвуковых датчика HY-SRF05 на 50 см ниже базовой линии, чтобы полностью «осветить» зону обнаружения со звуком.
Рисунок 1 – Собранный эхолокатор на двух датчиках и Arduino
Рисунок 2 – Скриншот экрана обнаружения объектаРисунок 3 – Тестовый стенд для проверки эхолокатора на Arduino
Общая информация об ультразвуковых датчиках
Прежде чем разбирать принцип работы конкретных устройств, стоит рассмотреть все аспекты работы ультразвукового датчика.
Принцип работы
Работа ультразвукового датчика заключается в том, что передатчик посылает ультразвуковую волну с частотой от нескольких десятков до нескольких сотен герц, направленную к определенному объекту. Когда волна встречает объект, она отражается от него и возвращается, попадая в приёмник. По времени, в течение которого волна преодолела путь, можно определить расстояние от объекта. В зависимости от типа устройства, это расстояние может варьироваться от нескольких сантиметров до 10 метров.
Генерируемое отражение принимается и преобразуется в электрический сигнал пьезоэлектрическим преобразователем. Прибор измеряет задержку между излучаемым ультразвуковым импульсом и полученным отражением, вычисляя расстояние до объекта, используя значение скорости звука. При комнатной температуре скорость распространения звука в воздухе составляет около 344 м/с.
Самоочищение ультразвукового датчика
В настоящее время, благодаря использованию передовых технологий, ультразвуковое устройство может действовать как датчик приближения, и как аналоговый измеритель расстояния. Большим преимуществом таких детекторов является то, что на их работу не влияют внешние условия окружающей среды, такие как туман, пыль, загрязнение воздуха. Кроме того, датчики также работают с прозрачными объектами, которые создают сильные отражения. Уникальная способность УЗ-устройства, заключается в том, что у них есть функция самоочищения, которой нет ни у каких других датчиков. Это связано с тем, что при передаче ультразвуковых волн, прибор сам настраивается на вибрацию (под воздействием высокочастотных звуков) и таким образом очищается от пыли и других загрязнений.
Диапазон измерения
Точность работы в первую очередь обусловлена диапазоном измерения. Прибор определяет интервал, при этом учитывая все значения, для измерения которых данное устройство предназначено. Основной принцип заключается в том, что измерения всегда более точны в среднем диапазоне, и менее точны ближе к предельным значениям. Диапазон измерения может быть соответствующим образом адаптирован к вашим потребностям. Современные устройства, как правило, имеют несколько различных диапазонов. Они указаны в спецификации продукта. Таким образом, вы можете выбрать нужный датчик для требуемых замеров.
Факторы, влияющие на диапазон измерения
Диапазон измерения УЗ-датчика зависит от свойств поверхности и угла установки объекта. Наибольший диапазон измерения можно получить для объектов с плоскими поверхностями, расположенными под прямым углом к оси датчика. Очень маленькие объекты или предметы, отражающие звук, частично сокращают дальность обнаружения. Объекты с гладкими поверхностями должны быть расположены как можно ближе к датчику, под углом 90°. Поверхности с неровной текстурой обеспечивают больший допуск к отклонению угла объектов.
Следует также учитывать воздействие окружающей среды. Наибольшее влияние на точность ультразвуковых датчиков оказывает температура воздуха. Относительная влажность и барометрическое давление также должны быть учтены.
Материалы, которые может обнаружить ультразвуковой датчик
УЗ-устройства обнаруживают практически все промышленные материалы из дерева, металла или пластика, независимо от их формы и цвета. Объекты могут быть твердыми, жидкими или порошкообразными. Единственным требованием является беспрепятственное отражение звуковых волн в сторону датчика. Однако некоторые объекты могут уменьшить рабочий диапазон устройства. Это объекты с большими, гладкими и наклонными поверхностями, либо с пористой текстурой, например, войлок, шерсть или строительная пена.
Датчик расстояния в проектах Arduino
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Ультразвуковые сигналы, генерируемые приемником, отражаясь от препятствия, возвращаются к нему через определенный промежуток времени. Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.
Описание датчика HC SR04
Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия. В комплект модуля с HC SR04 arduino также входят ресивер и трансмиттер.
Ультразвуковой дальномер HC SR04 имеет такие технические параметры:
- Питающее напряжение 5В;
- Рабочий параметр силы т ока – 15 мА;
- Сила тока в пассивном состоянии -6 с.
Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):
- Контакт питания положительного типа – +5В;
- Trig (Т) – выход сигнала входа;
- Echo (R) – вывод сигнала выхода;
- GND – вывод «Земля».
Схема взаимодействия с Arduino
Для получения данных, необходимо выполнить такую последовательность действий:
- Подать на выход Trig импульс длительностью 10 микросек;
- В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
- Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
- На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.
При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Подключение HC SR04 к Arduino
Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.
Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:
Библиотека для работы с HC SR04
Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.
К особенностям библиотеки можно отнести:
- Возможность работы с различными ультразвуковыми датчиками;
- Может работать с датчиком расстояния всего через один пин;
- Отсутствие отставания на 1 секунду при отсутствии пинга эха;
- Для простой коррекции ошибок есть встроенный цифровой фильтр;
- Максимально точный расчет расстояния.
Скачать бибилотеку NewPing можно здесь
Точность измерения расстояния датчиком HC SR04
Точность датчика зависит от нескольких факторов:
- температуры и влажности воздуха;
- расстояния до объекта;
- расположения относительно датчика (согласно диаграммы излучения);
- качества исполнения элементов модуля датчика.
В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.
Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.
Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря, “глазки” HC-SR04 должны смотреть прямо на предмет.
Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:
- усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
- с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
- датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.
Arduino Code — Simple Sound
const int TRIG_PIN = 6;
const int ECHO_PIN = 7;
const int BUZZER_PIN = 3;
const int DISTANCE_THRESHOLD = 50;
float duration_us, distance_cm;
void setup() {
Serial.begin (9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = 0.017 * duration_us;
if(distance_cm < DISTANCE_THRESHOLD)
digitalWrite(BUZZER_PIN, HIGH);
else
digitalWrite(BUZZER_PIN, LOW);
Serial.print(«distance: «);
Serial.print(distance_cm);
Serial.println(» cm»);
delay(500);
}
Quick Steps
-
Connect Arduino to PC via USB cable
-
Open Arduino IDE, select the right board and port
-
Copy the above code and open with Arduino IDE
-
Click Upload button on Arduino IDE to upload code to Arduino
-
Move your hand in front of sensor
-
Listen to piezo buzzer’s sound
Шаг 3: теория
Рисунок 6 – Область обнаружения объектаРисунок 7 – Формулы
Диаграммы направленности лучей
На левом рисунке 6 выше показаны наложенные диаграммы направленности для преобразователя A и преобразователя B.
Датчик A получит эхо от любого объекта в «красной зоне».
Датчик B будет получать эхо, только если объект находится в «лиловой зоне». Вне этой зоны определить координаты объекта невозможно (целевая зона может быть полностью «освещена» звуком, если расположить датчики ниже базовой линии).
Большие «лиловые» зоны обнаружения возможны, если датчики расставлены широко.
Расчеты
Что касается правого рисунка 7 выше.
Площадь любого треугольника может быть вычислена по формуле:
\[площадь = основание \cdot высота/2 \qquad (1)\]
Преобразование уравнения (1) дает нам высоту (координату Y):
\[высота = площадь \cdot 2 / основание \qquad (2)\]
Пока всё хорошо… Но как мы вычислим площадь?
Ответ заключается в том, чтобы разместить два ультразвуковых преобразователя на известном расстоянии друг от друга (базовая линия) и измерить расстояние, на котором каждый датчик находится от объекта, используя ультразвук.
На рисунке 7 показано, как это сделать.
Преобразователь A посылает импульс, который отражается от объекта во всех направлениях. Этот импульс слышат оба преобразователя, и A, и B. Преобразователь B не передает импульсов, он только слушает.
Обратный путь к преобразователю A показан красным цветом. Если разделить его на два и учесть скорость звука, мы можем рассчитать расстояние d1 с помощью формулы:
\[d1 _{(см)} = время_{(микросекунды)}/59 \qquad (3)\]
Значение 59 для константы получается следующим образом:
- Скорость звука составляет примерно 340 м/с, что составляет 0,034 см/мкс (сантиметр/микросекунда).
- Обратное значение 0,034 см/мкс составляет 29,412 мкс/см, которое при умножении на 2 (чтобы получить длину обратного пути) дает в результате 58,824 или 59 при округлении.
- Это значение можно подстроить вверх/вниз, чтобы учесть температуру, влажность и давление воздуха.
Путь к преобразователю B показан синим цветом. Если из этого пути вычесть расстояние d1, мы получим расстояние d2. Формула для d2 будет следующей:
\[d2 _{(см)} = время_{(микросекунды)}/29,5 — d1 \qquad (4)\]
Величина 29,5 для константы получается следующим образом:
Тут нет обратного пути, поэтому мы используем 29,5, что является половиной значения, используемого в формуле (3) выше.
Теперь у нас есть длины всех сторон треугольника ABC… погуглите «Герон».
Формула Герона
Формула Герона использует нечто, называемое «полу-периметром», в который вы добавляете каждую из трех сторон треугольника и делите результат на два:
\[s = (a + b + c)/2 \qquad (5)\]
Теперь полощадь может быть рассчитана по следующей формуле:
\
Как только мы узнаем эту площадь, мы сможем вычислить высоту (координату Y) из формулы (2) выше.
Теорема Пифагора
Теперь координату X можно вычислить, отложив из вершины треугольника перпендикулярную линию до базовой линии, чтобы получить прямоугольный треугольник. Теперь координату X можно вычислить с помощью теоремы Пифагора:
\
Effect of Temperature on Distance Measurement
Though the HC-SR04 is reasonably accurate for most of our projects such as intruder detection or proximity alarms; But there are times you might want to design a device that is to be used outdoors or in an unusually hot or cold environment. If this is the case, you might want to take into account the fact that the speed of sound in air varies with temperature, air pressure and humidity.
Since the speed of sound factors into our HC-SR04 distance calculation this could affect our readings. If the temperature (°C) and Humidity is already known, consider the below formula:
Speed of sound m/s = 331.4 + (0.606 * Temp) + (0.0124 * Humidity)
HC-SR04 Hardware Overview
At its core, the HC-SR04 Ultrasonic distance sensor consists of two ultrasonic transducers. The one acts as a transmitter which converts electrical signal into 40 KHz ultrasonic sound pulses. The receiver listens for the transmitted pulses. If it receives them it produces an output pulse whose width can be used to determine the distance the pulse travelled. As simple as pie!
The sensor is small, easy to use in any robotics project and offers excellent non-contact range detection between 2 cm to 400 cm (that’s about an inch to 13 feet) with an accuracy of 3mm. Since it operates on 5 volts, it can be hooked directly to an Arduino or any other 5V logic microcontrollers.
Here are complete specifications:
Operating Voltage | DC 5V |
Operating Current | 15mA |
Operating Frequency | 40KHz |
Max Range | 4m |
Min Range | 2cm |
Ranging Accuracy | 3mm |
Measuring Angle | 15 degree |
Trigger Input Signal | 10µS TTL pulse |
Dimension | 45 x 20 x 15mm |
Предисловие
Так получилось, что в университете я изучаю C/C++. Для души пробую делать небольшие проекты на Python. Я много слышал про платформу Arduino, смотрел видео на YouTube, частенько посещал Arduino Project Hub и вот мне стало интересно самому поэкспериментировать, углубясь в разработку под микроконтроллеры. Купив стартовый набор с самой платой и горстью электронных компонентов и попробовав собрать проекты из обучающей брошюры, понял, что надо двигаться дальше. Продумав саму идею следующей самоделки, отправился на просторы Google и обнаружил, что не могу найти всего, что мне нужно на одном ресурсе. Безусловно, мне несложно было посетить несколько сайтитов и блогов с информацией, но я бы сильно сэкономил время, если бы нашел все в одном месте. Так и появилась эта статья-туториал.
Виды и сфера использования прибора
Сегодня существует огромного количество самых разнообразных датчиков, основу функционирования которых составляет ультразвук. Ввиду своей высокой чувствительности, компактности и долговечности такая техника находит применение в медицине, промышленности, охранной деятельности и прочих областях. Все зависит от того, насколько характеристики аппарата соответствуют тем задачам, которые необходимо выполнять.
- • датчик положения применяется для осуществления контроля над положением и/или наличием различных механизмов. Необходим также при подсчете различных объектов, а также как сигнализатор предельного уровня в работе с сыпучими веществами и жидкостями;
- • датчик приближения с регулировкой диапазона срабатывания посредством встроенного потенциометра. Техника обнаруживает объекты только в требуемом диапазоне;
- • датчик приближения, оборудованный памятью порога срабатывания. Он программируются на отрезок времени, на протяжении которого будет восприниматься отраженный сигнал. Срабатывание устройства происходит, когда объект достигает определенного расстояния до цели.
На современном рынке автоматики представлено широкое разнообразие типов и моделей ультразвуковых датчиков в различных конструктивных исполнениях и работающих в разных акустических частотах. В большинстве случаев, руководствуясь характеристиками, предоставленными производителями, выбрать подходящий агрегат для своей задачи не составит труда.
Example code JSN-SR04T with Arduino and NewPing library
The NewPing library written by Tim Eckel can be used with many ultrasonic distance sensors. The latest version of this library can be downloaded here on bitbucket.org. You might notice that the code below, which uses the NewPing library, is a lot shorter than the code we used before.
NewPing_v1.9.1.zip
You can install the library by going to Sketch > Include Library > Add .ZIP Library in the Arduino IDE.
The library does include some examples that you can use, but you will have to modify them to match your hardware setup. I have included a modified example code below that can be used with the same wiring setup as before.
/*Arduino example sketch to control a JSN-SR04T ultrasonic distance sensor with NewPing libary and Arduino. More info: https://www.makerguides.com */ // Include the library: #include <NewPing.h> // Define Trig and Echo pin: #define trigPin 2 #define echoPin 3 // Define maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500 cm: #define MAX_DISTANCE 400 // NewPing setup of pins and maximum distance. NewPing sonar = NewPing(trigPin, echoPin, MAX_DISTANCE); void setup() { // Open the Serial Monitor at 9600 baudrate to see ping results: Serial.begin(9600); } void loop() { // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings: delay(50); // Measure distance and print to the Serial Monitor: Serial.print("Distance = "); // Send ping, get distance in cm and print result (0 = outside set distance range): Serial.print(sonar.ping_cm()); Serial.println(" cm"); }
Подключение HC-SR04
Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:
HC-SR04 | GND | VCC | Trig | Echo |
Arduino Uno | GND | +5V | 3 | 2 |
Принципиальная схема устройства Ардуино: ультразвуковой дальномер HC-SR04 : 6 комментариев
«Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:
OLED дисплей 128×64 GND VCC Trig Echo Arduino Uno GND +5V 3 2»
-Что-то здесь не так…..не так-ли?
В точку! Исправлено:)
Просто и понятно все объяснено. Автору большое спасибо.
Автор у Вас опечатка в статье.
Переводим скорость звука из м/с в см/мкс:
s = duration * 0.034 м/мкс
В единице измерения допущена неточность. Вы же в см/мкс переводите, а не м/мкс (как у Вас)
всё сделал, но в мониторе порта пишет следующее (x⸮x⸮⸮⸮x⸮x⸮⸮⸮x⸮x⸮⸮⸮x⸮), что делать, как быть?))
Проверьте скорость передачи в мониторе последовательного порта. Она должна совпадать со скоростью в программе. Должно быть: 9600
Плюсы и минусы использования
Лазерные дальномеры широко используются в сфере строительства благодаря своим основным плюсам:
- Большая рабочая дальность. В зависимости от стоимости и типа, девайс способен почти без погрешности работать на расстояниях более сотни метров.
- Удобство юстировки. Данный плюс обусловлен тем, что лазерное пятно хорошо видно на любой поверхности.
- Защита от засветов. Испускаемый луч имеет узкий монохромный спектр, который исключает случайное срабатывание. Приемник сигнала будет реагировать только на попадание в него отраженного лазера.
- Защита от помех. Датчик функционирует только в импульсном режиме, поэтому на него не воздействуют условия внешней среды.
- Низкое потребление энергии. На одной зарядке датчик может произвести несколько сотен измерений.
К минусам можно отнести достаточно высокую стоимость даже простых моделей. Но обычные датчики без микроконтроллера стоят в несколько раз дешевле и при наличии навыков программирования и пайки можно собрать собственный дальномер.
Применение сенсоров ультразвукового излучения в робототехнике
Главная задача, решаемая в робототехнике с помощью датчиков этого вида — ориентирование робота на местности, предотвращение столкновений и обеспечение обхода препятствий.
Достоинства систем ориентации, построенных на ультразвуковых датчиках:
- цена;
- проста в изготовлении, так как монтируется из легкодоступных элементов;
- при интегрировании в роботизированные устройства не требуется менять схему управления робота;
- универсальность;
- нечувствительность к неблагоприятным факторам окружающей среды: задымленность, запыленность, отсутствие света, высокая влажность.
Учитывая незначительную дистанцию действия сенсоров в воздушной среде, их применяют в пространствах ограниченного объема искусственного или естественного происхождения, с твердыми и ровными поверхностями. Это обеспечивает получение устойчивого эхо-сигнала. В таких условиях информация ультразвукового дальномера объективна. Для кругового обзора необходимо увеличение количества датчиков. Определение расстояние до преграды в движении, остановка и объезд достигается программными средствами.
Ультразвуковые сенсорные системы широко применяются в подводных роботах, являясь основными средствами контроля окружающего пространства. Здесь в качестве гидроакустических преобразователей используют магнитострикционные излучатели, обладающие большой акустической мощностью.
Код
Код для нашего устройства ниже. Помните, что красный светодиод должен загораться при расстоянии менее 4 см.
/* Arduino HC-SR04 ультразвуковой датчик расстояния VCC подключается к 5v, GND к GND Echo к 13 пину на Arduino, Trig к 12 пину на Arduino Позитивная нога красного светодиода к 11 пину на Arduino Позитивная нога зеленого светодиода к 10 пину на Arduino */ #define trigPin 13 #define echoPin 12 #define led 11 #define led2 10 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(led, OUTPUT); pinMode(led2, OUTPUT); } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; if (distance < 4) { // На этом этапе происходит вкл/выкл светодиода digitalWrite(led,HIGH); // когда загорается красный, зеленый обязан выключится digitalWrite(led2,LOW); } else { digitalWrite(led,LOW); digitalWrite(led2,HIGH); } if (distance >= 200 || distance <= 0){ Serial.println("Out of range"); // Вне диапазона } else { Serial.print(distance); Serial.println(" cm"); // тут тоже можно указать " см" } delay(500); }
Единственное, о чем стоит помнить, – далеко не все функции и библиотеки написаны профессионалами. Многие из них создаются такими новичками, как и вы, соответственно, старайтесь просматривать код, прежде чем заключать, что датчик не работает или выдаёт неправильные данные.
Но значительно лучше будет изучить основы программирования и С++, чтобы в дальнейшем самостоятельно писать многие вещи самому.
Где используются датчики
В основном лазерные датчики расстояния используются в строительной сфере для замеров расстояния между объектами, но им можно найти множество применений. К примеру, датчики расстояния могут помочь в обустройстве умного дома. Установив и, настроив датчик определенным образом, можно автоматизировать включение и выключение света в комнате или сделать автоматическое открытие или закрытие дверей и так далее.
Также подобный датчик установлен в каждый современный смартфон, с его помощью выключается экран, как только смартфон близко подносится к уху во время разговора. Датчики расстояния часто устанавливают в капот и бампер машины, чтобы облегчить парковку и получать данные о препятствиях на пути автомобиля в реальном времени.
Данные датчики измерения расстояния можно приобрести в отдельном виде, но без программируемого микроконтроллера они почти бесполезны. Поэтому покупать их по отдельности разумно только для решения узкого спектра задач. Для подключения датчиков обычно используется микроконтроллер «Ардуино», который необходимо вручную настраивать и прошивать для работы с определенным типом датчиков.
Для тех, кто не хочет углубляться в основы программирования платформы «Ардуино» и радиотехники, рекомендуется купить готовый вариант в виде строительного дальномера.
4Библиотека для работы с эхолокатором HC-SR04
Также для работы с ультразвуковым дальномером написано множество библиотек. Например, вот эта библиотека Ultrasonic. Установка библиотеки происходит стандартно: скачать, разархивировать в директорию /libraries/, которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться.
Установив библиотеку, напишем новый скетч.
#include <Ultrasonic.h> // подключаем библиотеку Ultrasonic ultrasonic(12, 11); // Trig - 12, Echo - 11 void setup() { Serial.begin(9600); // инициализация послед. порта } void loop() { float dist_cm = ultrasonic.Ranging(CM); // дистанция в см Serial.println(dist_cm); // выводим дистанцию в порт delay(100); }
Результат его работы тот же – в мониторе последовательного порта выводится дистанция до объекта в сантиметрах.
Если в скетче написать float dist_cm = ultrasonic.Ranging(INC); – дистанция будет отображаться в дюймах.
Code
Upload the following code to your Arduino IDE.
How the Code Works
First, you create variables for the trigger and echo pin called trigPin and echoPin, respectively. The trigger pin is connected to digital Pin 11, and the echo pin is connected to Pin 12:
You also create three variables of type long: duration and inches. The duration variable saves the time between the emission and reception of the signal. The cm variable will save the distance in centimeters, and the inches variable will save the distance in inches.
In the setup(), initialize the serial port at a baud rate of 9600, and set the trigger pin as an OUTPUT and the echo pin as an INPUT.
In the loop(), trigger the sensor by sending a HIGH pulse of 10 microseconds. But, before that, give a short LOW pulse to ensure you’ll get a clean HIGH pulse:
We use the pulseIn() function to get the sound wave travel time:
The pulseIn() function reads a HIGH or a LOW pulse on a pin. It accepts as arguments the pin and the state of the pulse (either HIGH or LOW). It returns the length of the pulse in microseconds. The pulse length corresponds to the time it took to travel to the object plus the time traveled on the way back.
Then, we calculate the distance to an object, taking into account the sound speed.
We need to divide the travel time by 2 because we have to consider that the wave was sent, hit the object, and then returned to the sensor.
Finally, we print the results in the Serial Monitor:
Step 2: Setup
The photo above shows the setup of the project. The jumper wires should be connected as follows: Connect a jumper wire from the 5 volt pin on the Arduino to the bottom channel of the breadboard Connect another jumper wire from a ground pin on the arduino to the upper channel of the breadboard Buzzer -> pin 3 (On Ultrasonic Sensor) Echo -> pin 6 Trig -> pin 7 (In Order from Right to Left) LED1 -> pin 8 LED2 -> pin 9 LED3 -> pin 10 LED4 -> pin 11 LED5 -> pin 12 LED6 -> pin 13 The jumper wires connected to the LEDs should be connected to the lead on the right, while the left lead of the LED should connected to the ground channel via a 330 ohm resistor.
4Калибровка ультразвукового дальномера
После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.
Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:
График отклонения показаний ультразвукового дальномера
Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.
Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)
Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27
В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α). Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.
Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX. Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал. У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),
Последовательность коррекции показаний ультразвукового дальномера
Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97 Обратите внимание, что это выражение можно было получить из предыдущего уравнения, выразив x через y. В вашем случае коэффициент и константа, естественно, будут отличаться
Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно
В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.
Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).
Описание методов библиотеки HCSR04.zip
HCSR04(uint8_t, uint8_t, unsigned long)
Конструктор для создания экземпляра класса, первый параметр это номер trig пина, второй — echo, третий — timeout в микросекундах.
HCSR04(uint8_t trigPin, uint8_t echoPin, unsigned long timeout = 1000000);
1 | HCSR04(uint8_ttrigPin,uint8_techoPin,unsignedlongtimeout=1000000); |
begin()
Инициализация HC-SR04.
void begin();
1 | voidbegin(); |
getDistanceMm()
Возвращает расстояние в миллиметрах.
unsigned int getDistanceMm();
1 | unsignedintgetDistanceMm(); |
getDistanceCm()
Возвращает расстояние в сантиметрах.
unsigned int getDistanceCm();
1 | unsignedintgetDistanceCm(); |
getDistanceInch()
Возвращает расстояние в дюймах.
unsigned int getDistanceInch();
1 | unsignedintgetDistanceInch(); |
getDistanceMmFloat()
Возвращает расстояние в миллиметрах. Тип возвращаемых данных float.
float getDistanceMmFloat();
1 | floatgetDistanceMmFloat(); |
getDistanceCmFloat()
Возвращает расстояние в сантиметрах. Тип возвращаемых данных float.
float getDistanceCmFloat();
1 | floatgetDistanceCmFloat(); |
getDistanceInchFloat()
Возвращает расстояние в дюймах. Тип возвращаемых данных float.
float getDistanceInchFloat();
1 | floatgetDistanceInchFloat(); |
getDuration()
Это частный метод, который возвращает продолжительность в микросекундах — прошедшее время до объекта/препятствия и обратно.
unsigned long getDuration();
1 | unsignedlonggetDuration(); |
Пример скетча
Проверить работоспособность библиотеки можно следующим примером:
/*
Включяем библиотеку для работы с HC-SR04
*/
#include <hcsr04.h>
#define ECHO_PIN 12
#define TRIG_PIN 13
#define TIMEOUT 30000
/*
Создаём экземпляр класса HCSR04
*/
HCSR04 hcsr04(TRIG_PIN, ECHO_PIN, TIMEOUT);
void setup() {
/*
задаем скорость общения с компьютером
*/
Serial.begin(9600);
/*
HC-SR04как выход TRIG пин
*/
hcsr04.begin();
}
void loop() {
float cm, inch;
int mm;
/*
Получаем расстояние в миллиметрах
*/
mm = hcsr04.getDistanceMm();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(10);
/*
Получаем расстояние в сантиметрах. Тип возвращаемых данных float
*/
cm = hcsr04.getDistanceCmFloat();
/*
Даём сонару чуть-чуть отдохнуть
*/
delay(10);
/*
Получаем расстояние в дюймах. Тип возвращаемых данных float
*/
inch = hcsr04.getDistanceInchFloat();
/*
Отправляем полученные данные на компьютер
*/
Serial.print(mm);
Serial.print(» mm «);
Serial.print(cm);
Serial.print(» cm «);
Serial.print(inch);
Serial.print(» inch»);
Serial.println();
/*
Ждём четверть секунды и повторяем снова
*/
delay(250);
}
1 |
/* HCSR04hcsr04(TRIG_PIN,ECHO_PIN,TIMEOUT); voidsetup(){ /* задаем скорость общения с компьютером Serial.begin(9600); /* HC-SR04как выход TRIG пин hcsr04.begin(); } voidloop(){ floatcm,inch; intmm; /* Получаем расстояние в миллиметрах mm=hcsr04.getDistanceMm(); /* Даём сонару чуть-чуть отдохнуть delay(10); /* Получаем расстояние в сантиметрах. Тип возвращаемых данных float cm=hcsr04.getDistanceCmFloat(); /* Даём сонару чуть-чуть отдохнуть delay(10); /* Получаем расстояние в дюймах. Тип возвращаемых данных float inch=hcsr04.getDistanceInchFloat(); /* Отправляем полученные данные на компьютер Serial.print(mm); Serial.print(» mm «); Serial.print(cm); Serial.print(» cm «); Serial.print(inch); Serial.print(» inch»); Serial.println(); /* Ждём четверть секунды и повторяем снова delay(250); } |