Как работает ультразвуковой датчик HC-SR04 и подключение к Arduino
Будь то робот, которому нужно обходить препятствия, автоматическая дверь, открывающаяся при приближении, парковочный ассистент, помогающий припарковать машину, не задев стену, или даже умный измерительный прибор, заменяющий рулетку — HC-SR04 является интересным и полезным инструментом для ваших проектов!
Этот датчик популярен среди любителей и мейкеров по нескольким веским причинам. Он потребляет очень мало энергии, что делает его идеальным для проектов с батарейным питанием. Он также доступен по цене — обычно такие датчики можно найти всего за несколько долларов. И самое главное — его очень легко подключить к Arduino или другим микроконтроллерам.
В этом руководстве мы рассмотрим, как работает датчик HC-SR04, как подключить его к Arduino и как написать простую программу для измерения расстояний.
Итак, давайте начнём и дадим вашему следующему проекту Arduino способности летучей мыши!
Что такое ультразвук?
«Ультразвук» относится к звуковым волнам с частотами, превышающими диапазон, воспринимаемый человеческим ухом.
Человек способен слышать звуковые волны, вибрирующие от примерно 20 раз в секунду (что мы воспринимаем как глубокий, гулкий звук) до 20 000 раз в секунду (что звучит как очень высокий свист). Ультразвуковые волны, однако, имеют частоты выше 20 000 Гц, что делает их совершенно неслышимыми для человеческого уха.
Хотя мы не можем слышать ультразвук, многие животные могут! Собаки слышат звуки до примерно 45 000 Гц, поэтому работают собачьи свистки — они издают звуки, слишком высокие для человека, но идеально воспринимаемые собаками. Летучие мыши используют ещё более высокие ультразвуковые частоты (до 200 000 Гц) для навигации и охоты в темноте с помощью эхолокации.
Обзор оборудования HC-SR04
Ультразвуковой датчик расстояния HC-SR04 состоит из двух `ультразвуковых преобразователей `_, работающих вместе. Один действует как передатчик, преобразуя электрические сигналы в ультразвуковые звуковые импульсы частотой 40 кГц. Другой работает как приёмник, прослушивая эти импульсы после их отражения от объекта.
Когда приёмник обнаруживает возвращающиеся звуковые волны, он формирует выходной сигнал. Длительность этого сигнала напрямую связана с расстоянием до объекта. Измеряя эту длительность, Arduino может вычислить точное расстояние до объекта.
Этот датчик идеально подходит для бесконтактного измерения расстояний! Он может обнаруживать объекты на расстоянии от 2 см до 400 см (около 4 метров) с впечатляющей точностью около 3 миллиметров.
Поскольку датчик работает от 5 вольт, его можно легко подключить непосредственно к Arduino или любому другому микроконтроллеру с логикой 5V. Это делает его простым и универсальным компонентом для самых разных проектов!
Технические характеристики
Вот технические характеристики:
Рабочее напряжение |
DC 5V |
|---|---|
Рабочий ток |
15mA |
Рабочая частота |
40KHz |
Максимальная дальность |
4m |
Минимальная дальность |
2cm |
Точность измерения |
3mm |
Угол измерения |
15 градусов |
Сигнал запуска |
10µS TTL импульс |
Размеры |
45 x 20 x 15mm |
Распиновка ультразвукового датчика HC-SR04
Давайте подробнее рассмотрим распиновку ультразвукового датчика HC-SR04 и назначение каждого вывода:
VCC — это вывод питания датчика. Подключите его к выходу 5V вашего Arduino.
Trig (Trigger) — это входной сигнальный вывод. Когда вы хотите, чтобы датчик измерил расстояние, вы подаёте на этот вывод HIGH на 10 микросекунд. При получении этого сигнала датчик посылает 8 импульсов ультразвуковых волн частотой 40 кГц.
Echo — это выходной сигнальный вывод. После того как датчик отправит звуковые волны, этот вывод переходит в состояние HIGH. Затем датчик ожидает, пока волны отразятся от объекта и вернутся. В течение этого периода ожидания вывод Echo остаётся в состоянии HIGH. Как только звуковые волны отражаются и достигают датчика, вывод Echo переходит в LOW. Время, в течение которого вывод Echo остаётся в HIGH, напрямую связано с расстоянием до объекта. Измеряя это время, Arduino может вычислить точное расстояние до объекта.
GND — это вывод заземления. Обязательно подключите его к выводу заземления Arduino для замыкания электрической цепи.
Как работает ультразвуковой датчик HC-SR04?
Ультразвуковой датчик HC-SR04 измеряет расстояние до объектов с помощью звуковых волн, подобно тому, как ориентируются летучие мыши. Вот как это работает:
Процесс начинается, когда вы устанавливаете вывод Trig (Trigger) в состояние HIGH на не менее чем 10 микросекунд (мкс).
При срабатывании датчик посылает серию из 8 ультразвуковых импульсов частотой 40 кГц через передатчик. Эта специфическая звуковая последовательность помогает приёмнику отличить собственные сигналы от окружающего ультразвукового шума.
Сразу после отправки звуковых волн вывод Echo переходит в HIGH, и датчик начинает ожидать возврата эхо.
Если звуковые волны попадают на объект и отражаются обратно к датчику, вывод Echo переходит в LOW, как только обнаружит возвращающееся эхо. Время между переходом вывода Echo в HIGH и затем в LOW создаёт импульс. Этот импульс может длиться от 150 мкс до 25 мс, в зависимости от расстояния до объекта.
Если звуковые волны не отражаются, датчик прекращает ожидание через 38 мс. Этот таймаут означает, что в зоне обнаружения датчика (около 4 метров) ничего нет.
Расчёт расстояния
Ширина (длительность) полученного импульса — это то, что мы используем для определения расстояния до объекта. Мы можем вычислить это, используя формулу расстояние-скорость-время, которую вы, возможно, помните из уроков физики.
Рассмотрим пример: допустим, перед датчиком находится объект, и мы получили импульс длительностью 500 микросекунд (мкс) на выводе Echo. Вот как мы вычислим расстояние:
Расстояние = Скорость x Время
Мы знаем, что время равно 500 мкс, а скорость — это скорость звука, которая составляет 340 метров в секунду.
Для упрощения вычислений преобразуем скорость звука из метров в секунду (м/с) в сантиметры на микросекунду (см/мкс), что составит 0,034 см/мкс. Теперь подставим это значение в формулу.
Расстояние = 0,034 см/мкс x 500 мкс
Но подождите! Есть ещё один важный шаг. Длительность импульса представляет время в оба конца — время, за которое звук прошёл до объекта И обратно к датчику. Поэтому, чтобы получить фактическое расстояние, нужно разделить на 2:
Расстояние = (0,034 см/мкс x 500 мкс) / 2
Расстояние = 8,5 см
Это означает, что объект находится на расстоянии 8,5 сантиметров от нашего датчика.
Схема подключения датчика HC-SR04 к Arduino
Теперь, когда мы полностью понимаем, как работает ультразвуковой датчик HC-SR04, давайте подключим его к Arduino!
Подключить HC-SR04 к Arduino очень просто. Сначала установите датчик на макетную плату. Подключите вывод VCC к выводу 5V Arduino, а вывод GND — к выводу заземления. Затем подключите вывод Trig к цифровому выводу #9 Arduino, а вывод Echo — к цифровому выводу #10.
Вот краткая таблица соединений:
| HC-SR04 Sensor | Arduino | |
| VCC | 5V | |
| Trig | 9 | |
| Echo | 10 | |
| GND | GND |
После выполнения всех подключений ваша схема должна выглядеть примерно так, как показано на изображении ниже.
Установка библиотеки
Работа с ультразвуковым датчиком HC-SR04 требует нескольких технических шагов: отправка сигналов запуска, измерение длительности импульса эхо и преобразование этого времени в точное расстояние. Этот процесс может быть сложным, особенно для начинающих.
К счастью, существуют полезные библиотеки, которые упрощают эти сложные операции до простых команд, и `библиотека NewPing `_ — одна из них.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджера библиотек на левой боковой панели.
Введите «newping» в поле поиска для фильтрации результатов.
Найдите библиотеку newping, созданную Tim Eckel.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Пример кода Arduino
Давайте попробуем простую программу, которая использует ультразвуковой датчик HC-SR04 для измерения расстояния до объектов и отображения результатов в сантиметрах в мониторе последовательного порта Arduino каждые полсекунды.
Прежде чем мы разберём код шаг за шагом, загрузите его на Arduino и посмотрите на результат.
// Include NewPing Library
#include "NewPing.h"
// Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
#define TRIGGER_PIN 9
#define ECHO_PIN 10
// Maximum distance we want to ping for (in centimeters).
#define MAX_DISTANCE 400
// NewPing setup of pins and maximum distance.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Distance = ");
Serial.print(sonar.ping_cm());
Serial.println(" cm");
delay(500);
}
После загрузки кода на Arduino откройте монитор последовательного порта и установите скорость передачи данных 9600 бод. Теперь направьте датчик на различные предметы вокруг — стол, стену или даже руку — и наблюдайте, как измеренные расстояния обновляются в реальном времени.
Объяснение кода:
Давайте разберём, как работает эта программа, шаг за шагом:
Программа начинается с подключения библиотеки NewPing.
#include "NewPing.h"
Далее мы указываем Arduino, какие выводы подключены к датчику. В данном случае вывод Trig подключён к выводу 9, а вывод Echo — к выводу 10 Arduino.
#define TRIGGER_PIN 9
#define ECHO_PIN 10
Затем мы задаём константу MAX_DISTANCE, которая определяет максимальное расстояние, которое датчик будет пытаться измерить. В данном случае мы указываем измерять расстояния до 400 сантиметров (около 4 метров). Если объект находится за пределами этого диапазона, датчик сообщит, что ничего не обнаружено. Максимальное значение по умолчанию — 500 см, но мы установили его немного ниже.
#define MAX_DISTANCE 400
Затем мы создаём специальный объект sonar, представляющий наш датчик. Все сложные операции с датчиком будут выполняться через этот объект, что значительно упрощает нашу задачу.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
В функции setup мы инициализируем последовательную связь с компьютером, чтобы видеть вывод датчика в мониторе последовательного порта.
void setup() {
Serial.begin(9600);
}
В функции loop мы используем функцию ping_cm() для вычисления расстояния. Эта функция отправляет ультразвуковой импульс и измеряет время возврата эхо. Затем она вычисляет расстояние в сантиметрах и выводит его в монитор последовательного порта.
Наконец, мы делаем паузу 500 мс (полсекунды) между измерениями. Это даёт вам время прочитать каждый результат и предотвращает перегрузку компьютера данными.
void loop() {
Serial.print("Distance = ");
Serial.print(sonar.ping_cm());
Serial.println(" cm");
delay(500);
}
Другие полезные функции библиотеки NewPing
Библиотека NewPing предлагает несколько удобных функций, которые делают работу с ультразвуковым датчиком HC-SR04 ещё проще.
В скетче, который мы только что рассмотрели, расстояние отображается в сантиметрах. Если вы предпочитаете видеть результат в дюймах (что может быть удобнее при использовании имперской системы измерения), вы можете просто использовать функцию
sonar.ping_in():Serial.print(sonar.ping_in());
Функция
ping_cm(), которую мы использовали ранее, показывает только целые значения в сантиметрах (например, 10 см, 11 см и т.д.). Если вам нужно более точное измерение с десятичными знаками (например, 10,5 см), вы можете переключиться в режим длительности вместо режима расстояния. Просто замените:Serial.print(sonar.ping_cm());
на эту строку:
Serial.print((sonar.ping() / 2) * 0.0343);
Это вычисление преобразует время прохождения звуковой волны в расстояние с десятичной точностью. Для повышения точности HC-SR04 библиотека NewPing включает специальный метод
ping_median(iterations). Эта умная функция выполняет несколько измерений, отбрасывает результаты вне диапазона и усредняет оставшиеся для получения более надёжного результата. По умолчанию она делает 5 измерений, но вы можете указать любое количество:int iterations = 5; Serial.print((sonar.ping_median(iterations) / 2) * 0.0343);
Используя эти функции, вы можете настроить работу ультразвукового датчика именно так, как нужно для вашего проекта!
Проект Arduino — бесконтактный измеритель расстояния
Давайте создадим простой, но увлекательный проект. Вместо простого отображения измеренного расстояния в виде чисел мы используем символьный ЖК-дисплей 16x2 для показа горизонтальной полосы, визуально представляющей расстояние до объекта. Чем ближе объект, тем короче полоса; чем дальше — тем длиннее полоса растянется по экрану.
Если вы впервые работаете с символьными ЖК-дисплеями 16x2, возможно, стоит изучить соответствующее руководство, чтобы понять, как они работают.
Схема подключения
Прежде чем приступить к программированию, необходимо правильно подключить ЖК-дисплей к Arduino. Внимательно следуйте схеме подключения, чтобы убедиться, что всё соединено правильно.
Установка библиотеки
Перед загрузкой кода необходимо установить специальную библиотеку `LCDBarGraph `_. Эта библиотека упрощает отрисовку горизонтальной полосы на ЖК-дисплее, длина которой изменяется в зависимости от обнаруженного расстояния. Это гораздо проще, чем программировать отображение полосы самостоятельно!
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджера библиотек на левой боковой панели.
Введите «lcdbargraph» в поле поиска для фильтрации результатов.
Найдите библиотеку LCDBarGraph, созданную Balazs Kelemen.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Код Arduino
После установки библиотеки мы готовы перейти к коду.
// includes required libraries
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
#include "NewPing.h"
// Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
#define TRIGGER_PIN 9
#define ECHO_PIN 10
// Maximum distance we want to ping for (in centimeters).
#define MAX_DISTANCE 400
// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LcdBarGraph lbg(&lcd, 16, 0, 1); // Creates an LCD Bargraph object.
// NewPing setup of pins and maximum distance.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int distance;
void setup() {
lcd.begin(16, 2); // Initializes the interface to the LCD screen
}
void loop() {
distance = sonar.ping_cm();
// Prints "Distance: <value>" on the first line of the LCD
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
// Draws bargraph on the second line of the LCD
lcd.setCursor(0, 1);
lbg.drawValue(distance, MAX_DISTANCE);
delay(500);
}
После загрузки кода на Arduino ЖК-дисплей будет показывать как фактическое расстояние в сантиметрах, так и столбчатую диаграмму для быстрого визуального представления расстояния до объекта.
Объяснение кода:
В начале мы подключаем три важные библиотеки: LiquidCrystal.h для управления ЖК-дисплеем 16x2, LcdBarGraph.h для отображения расстояния в виде столбчатой диаграммы и NewPing.h для работы с ультразвуковым датчиком HC-SR04.
#include <LiquidCrystal.h>
#include <LcdBarGraph.h>
#include "NewPing.h"
После подключения необходимых библиотек мы определяем выводы Trigger (Trig) и Echo датчика, подключённые к выводам 9 и 10 Arduino. Также устанавливаем максимальное измеряемое расстояние в 400 см. Всё, что за пределами этого значения, будет считаться «вне диапазона».
// Hook up HC-SR04 with Trig to Arduino Pin 9, Echo to Arduino pin 10
#define TRIGGER_PIN 9
#define ECHO_PIN 10
// Maximum distance we want to ping for (in centimeters).
#define MAX_DISTANCE 400
Далее мы создаём объект LCD, определяющий выводы, подключённые к Arduino. Также создаём экземпляр LcdBarGraph, который будет отвечать за отрисовку полосы на ЖК-дисплее. Конструктор LcdBarGraph принимает несколько параметров: первый ссылается на только что созданный объект LiquidCrystal. Второй определяет количество столбцов ЖК-дисплея (в данном случае 16). Последние два параметра позволяют настроить положение столбчатой диаграммы.
// Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LcdBarGraph lbg(&lcd, 16, 0, 1); // Creates an LCD Bargraph object.
Также мы создаём экземпляр NewPing, представляющий наш датчик.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
В функции setup мы инициализируем ЖК-дисплей для готовности к отображению информации.
void setup() {
lcd.begin(16, 2); // Initializes the interface to the LCD screen
}
Функция loop непрерывно измеряет расстояние до объекта, вызывая sonar.ping_cm(). Эта функция отправляет ультразвуковой импульс и вычисляет расстояние на основе времени возврата эхо. Измеренное расстояние сохраняется в переменной distance.
distance = sonar.ping_cm();
В первой строке ЖК-дисплея отображается точное расстояние в сантиметрах с помощью функции lcd.print().
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
Во второй строке ЖК-дисплея мы рисуем столбчатую диаграмму с помощью функции drawValue(distance, MAX_DISTANCE). Эта функция создаёт визуальное представление расстояния, рисуя полосу длиной, пропорциональной расстоянию до объекта. Чем ближе объект, тем короче полоса; чем дальше — тем длиннее.
lcd.setCursor(0, 1);
lbg.drawValue(distance, MAX_DISTANCE);
Наконец, мы добавляем небольшую задержку в 500 миллисекунд перед повторением процесса, чтобы дисплей обновлялся в реальном времени.
Подключение HC-SR04 в 3-проводном режиме
Обычно датчик HC-SR04 требует два отдельных цифровых вывода Arduino:
Один вывод для сигнала Trigger (TRIG), который говорит датчику отправить звуковые волны
Один вывод для сигнала Echo, который принимает информацию о возвращающейся звуковой волне
Однако в 3-проводном режиме можно использовать всего один вывод Arduino для обеих этих функций. Это работает, потому что датчику никогда не нужно отправлять и принимать сигналы одновременно. Когда мы отправляем сигнал запуска, вывод работает как OUTPUT. Затем, перед прослушиванием эхо, мы быстро перенастраиваем тот же вывод как INPUT. Поскольку эти действия происходят последовательно (не одновременно), мы можем использовать один вывод для обеих целей.
Для настройки HC-SR04 в 3-проводном режиме выполните следующие подключения:
| HC-SR04 Sensor | Arduino | |
| VCC | 5V | |
| Trig | 9 | |
| Echo | 9 | |
| GND | GND |
Вот как можно подключить датчик HC-SR04 к Arduino в 3-проводном режиме.
Всё, что вам нужно сделать — подключить оба вывода TRIG и ECHO датчика к одному и тому же цифровому выводу Arduino (например, цифровому выводу #9) и указать один и тот же номер вывода для обоих в коде. Остальная часть кода остаётся прежней.
#define TRIGGER_PIN 9 // Trigger and Echo both on pin 9
#define ECHO_PIN 9
Этот приём очень полезен при создании сложного проекта, когда не хватает свободных выводов на Arduino.
Ограничения
Ультразвуковой датчик HC-SR04 впечатляет своей точностью и удобством использования, особенно по сравнению с другими бюджетными датчиками. Однако это не означает, что он идеален или будет безупречно работать в любой ситуации. Вот некоторые ограничения, о которых следует помнить:
У датчика возникают проблемы с точным измерением, когда объекты находятся дальше 4 метров. На таком расстоянии показания становятся ненадёжными, или датчик может вообще ничего не обнаружить.
Если поверхность объекта наклонена под малым углом к датчику, звуковые волны могут отразиться в другом направлении, не вернувшись к датчику.
Мелкие объекты могут не отразить достаточно звука для точного обнаружения. Кроме того, если датчик установлен близко к полу, вы можете получать ложные показания из-за отражения звуковых волн от пола вместо целевого объекта.
Объекты с мягкой или неровной поверхностью, такие как мягкие игрушки или ткань, могут поглощать звук вместо того, чтобы отражать его. Это затрудняет их обнаружение датчиком HC-SR04.
Это лишь некоторые ситуации, в которых датчик может работать некорректно, поэтому полезно знать об этих ограничениях при проектировании. Понимание возможностей и ограничений вашего датчика поможет создать более надёжные и эффективные устройства!