Это исчерпывающее руководство — ваш универсальный ресурс, в котором вы найдете всю необходимую информацию о HC-SR04. Мы начнем с азов, разберемся с основными принципами его работы, что является ключом к раскрытию его потенциала. Затем перейдем к важным аспектам, таким как основные технические характеристики, подключение к популярным микроконтроллерам, и даже углубимся в сложные сценарии использования. К концу этого руководства вы будете хорошо подготовлены, чтобы использовать весь потенциал HC-SR04 в своих собственных проектах.
Что такое ультразвуковой датчик HC-SR04?
Ультразвуковой датчик HC-SR04 — это замечательное и универсальное устройство, которое заняло свою нишу в обширной сфере электронных проектов. Его главная особенность — экономичность, благодаря которой он доступен широкому кругу пользователей, от экономных любителей до профессионалов, ищущих недорогое решение для своих проектов.

Технические характеристики
Понимание технических характеристик ультразвукового датчика HC-SR04 имеет решающее значение для реализации любого проекта. Ниже приведена таблица технических характеристик:
Пояснение:
- Диапазон: HC — SR04 имеет рабочий диапазон от 2 см до 400 см (0,8 дюйма до 157 дюймов). Этот относительно широкий диапазон делает его пригодным для различных применений. Например, в небольшом проекте по робототехнике, где робот должен перемещаться по комнате, диапазон 2 — 400 см позволяет эффективно обнаруживать близлежащую мебель или стены. В более крупных промышленных приложениях он может использоваться для измерения расстояния между компонентами оборудования в пределах этого диапазона. Однако важно отметить, что точность может немного варьироваться на крайних пределах этого диапазона.
- Разрешение: с разрешением 0,3 см HC-SR04 может обеспечить достаточно точные измерения расстояния. Такой уровень точности достаточен для большинства любительских и многих промышленных применений. В проекте, связанном с 3D-печатью, где датчик используется для определения расстояния до печатной платформы для автоматического выравнивания, разрешение 0,3 см может гарантировать, что печатающая головка находится на правильной высоте над платформой, что обеспечивает высокое качество печати.
- Источник питания: Работает от источника питания 5 В постоянного тока. Во время работы потребляет рабочий ток 15 мА, что является относительно низким энергопотреблением. В режиме ожидания потребление тока еще меньше, менее 2 мА. Это делает его энергоэффективным выбором для проектов с питанием от батарей. Например, в узле датчика IoT с питанием от батареи, который использует HC-SR04 для измерения расстояния, низкое энергопотребление гарантирует, что батарея прослужит в течение длительного периода времени.
- Рабочий угол: Рабочий угол HC-SR04 составляет менее 15°. Это означает, что датчик имеет относительно узкое поле зрения. Он наиболее эффективен при обнаружении препятствий, которые находятся непосредственно перед ним. В системе безопасности умного дома, где датчик используется для обнаружения злоумышленников, приближающихся к двери, узкий рабочий угол позволяет сфокусироваться на обнаружении объектов, движущихся прямо к датчику, что снижает количество ложных срабатываний от объектов, находящихся в периферийной зоне.
- Интерфейс: Модуль имеет 4-контактный интерфейс, который включает контакты VCC, GND, Trig и Echo. Простая конструкция интерфейса упрощает подключение к различным микроконтроллерам и другим электронным компонентам.
Объяснение распиновки
Raspberry Pi: 5V (Common ground with module)
▶ 10μs High Pulse to Start Measurement
▶ Low Level to Reset
Raspberry Pi: Any GPIO (e.g., GPIO17)
▶ High Duration = Round-Trip Time of Ultrasonic Waves
▶ Max High Time: 38ms (Timeout for No Obstacle)
Raspberry Pi: GPIO with **Voltage Divider** (5V→3.3V)
Raspberry Pi/GND
Пояснение:
The Echo pin is the key to obtaining the distance information. Once the ultrasonic waves are sent out, the Echo pin goes high. It remains high until the reflected waves are received by the ultrasonic receiver. The duration for which the Echo pin is high is directly proportional to the time it takes for the ultrasonic waves to travel to the obstacle and back. By measuring this time duration, we can calculate the distance to the obstacle using the formula . In a C++-based Arduino project, you can use the pulseIn() function to measure the duration of the high-level pulse on the Echo pin.
Основные компоненты и принцип работы
Ключевые компоненты
- Ультразвуковой передатчик: это компонент, отвечающий за начальный этап процесса измерения расстояния. Он излучает ультразвуковые волны с частотой 40 кГц. Эти высокочастотные волны неслышимы для человеческого уха, но являются ключом к работе датчика. При срабатывании передатчик посылает эти волны в окружающую среду. Представьте себе мощный динамик, излучающий звуковые волны с частотой, намного превышающей ту, которую мы можем слышать. Например, в робототехнике ультразвуковой передатчик на роботе посылает эти волны частотой 40 кГц в направлении движения робота, готовясь обнаружить любые препятствия на его пути.
- Ультразвуковой приемник: Как следует из названия, задача ультразвукового приемника состоит в улавливании ультразвуковых волн, отраженных от любых препятствий в радиусе действия датчика. После того, как передатчик посылает волны, они распространяются по воздуху, пока не столкнутся с объектом. Затем волны отражаются, и задача приемника состоит в улавливании этих отраженных волн. Это похоже на высокочувствительный микрофон, который может улавливать самые слабые эхо-сигналы ультразвуковых волн. В системе домашней автоматизации, где HC-SR04 используется для обнаружения присутствия человека в комнате, приемник улавливает волны, отраженные от тела человека.
- Управляющая схема: это «мозг» всей операции. Управляющая схема управляет всей последовательностью обработки сигнала. Она координирует действия передатчика и приемника. При получении триггерного сигнала она дает команду передатчику излучать ультразвуковые волны. Затем она внимательно следит за приемником на предмет поступающих отраженных волн. После приема волн схема управления вычисляет время, за которое волны дошли до препятствия и вернулись обратно. На основе этого времени и известной скорости звука в воздухе она вычисляет расстояние до препятствия. В промышленных условиях схема управления в HC-SR04, используемая для автоматизированного оборудования, точно управляет этими операциями, чтобы обеспечить точное измерение расстояния для правильного функционирования оборудования.
Как это работает
Теперь, когда мы знаем об основных компонентах, давайте пошагово рассмотрим, как HC-SR04 фактически измеряет расстояние.
Сигнал срабатывания:
Процесс начинается с триггерного сигнала. Когда на вывод Trig (Trigger) модуля HC-SR04 подается высокий импульс длительностью 10 мкс, это равносильно подаче датчику команды «старт». Этот короткий, но значимый электрический импульс запускает всю последовательность измерения расстояния. Например, в проекте на базе Arduino вы бы использовали простую строку кода, чтобы отправить этот высокий импульс длительностью 10 мкс на вывод Trig модуля HC-SR04, давая ему команду начать процесс измерения.
Распространение волн:
После срабатывания ультразвуковой передатчик приступает к действию. Модуль посылает серию из 8 ультразвуковых импульсов с частотой 40 кГц. Эти импульсы похожи на серию невидимых «звуковых пуль», которые выстреливаются в окружающую среду. После отправки этих импульсов модуль переходит в состояние ожидания, терпеливо ожидая, пока волны не столкнутся с препятствием и не отскочат обратно. В реальной ситуации, если вы используете HC-SR04 для измерения расстояния до стены в комнате, 8 импульсов будут распространяться в направлении стены, расходясь в форме конуса с относительно узким углом около 15 градусов.
Обнаружение эха:
Контакт Echo является ключом к обнаружению отраженных волн. Как только ультразвуковые волны посылаются, контакт Echo переходит в высокое состояние. Таким образом датчик сигнализирует о начале процесса измерения. Затем он ожидает возвращения отраженных волн. Когда ультразвуковой приемник улавливает отраженные волны, контакт Echo переходит в низкое состояние. Время, в течение которого контакт Echo остается в высоком состоянии, равно времени прохождения ультразвуковых волн в обе стороны. В проекте Raspberry Pi вы будете использовать функцию для измерения времени, в течение которого контакт Echo находится в высоком состоянии, что является важным шагом в расчете расстояния.
Расчет расстояния:
Distance Calculation: The final step is to calculate the distance to the obstacle. The formula for calculating the distance in centimeters is . The factor 0.0343 comes from the speed of sound in air, which is approximately 343 m/s. Since the waves travel to the obstacle and back (a round-trip), we divide the total distance traveled by 2 to get the one-way distance to the obstacle. For example, if the time measured for the Echo pin to be high is 2000μs, then the distance would be calculated as cm. This calculation is the same whether you're using the HC-SR04 in a simple hobbyist project or a complex industrial application.
Взаимодействие с популярными микроконтроллерами
Руководство по настройке Arduino
Схема подключения
- VCC: Подключите вывод VCC HC-SR04 к выводу 5V Arduino. Это обеспечит необходимую питание для модуля датчика. Стабильное питание 5V от Arduino гарантирует оптимальную работу датчика.
- GND: Контакт GND (заземление) HC — SR04 должен быть подключен к контакту GND Arduino. Это создает общий эталон заземления для датчика и Arduino, что имеет решающее значение для правильной электрической связи.
- Trig: Подключите контакт Trig (Trigger) HC — SR04 к цифровому контакту 2 Arduino. Это контакт, по которому Arduino будет посылать импульс высокого уровня 10 мкс для запуска процесса измерения расстояния в HC — SR04.
- Echo: Контакт Echo HC-SR04 подключается к цифровому контакту 3 Arduino. Arduino считывает импульс высокой длительности на этом контакте для расчета расстояния до препятствия.
HC - SR04 Arduino
VCC ------------ 5V
GND ------------ GND
Trig ------------ Digital Pin 2
Echo ------------ Digital Pin 3
Пример кода
const int trigPin = 2;
const int echoPin = 3;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.0343 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(500);
}
In the setup function, we first initialize the serial communication at a baud rate of 9600, which allows us to view the distance readings in the Arduino Serial Monitor. Then, we set the trigPin as an output pin and the echoPin as an input pin.
In the loop function, we start by setting the trigPin to LOW for 2 microseconds to ensure a clean start. Then, we set it HIGH for 10 microseconds to trigger the ultrasonic transmitter in the HC-SR04. After that, we set the trigPin back to LOW.
The pulseIn() function is then used to measure the duration of the high-level pulse on the echoPin. This duration represents the time it took for the ultrasonic waves to travel to the obstacle and back. We then calculate the distance using the formula distance = duration * 0.0343 / 2, where 0.0343 is the speed of sound in cm/μs and we divide by 2 because the waves travel to the obstacle and back.
Finally, we print the calculated distance to the Serial Monitor and add a 500-millisecond delay before the next measurement.
Советы
- Точное измерение длительности:
When using the pulseIn() function, it's important to note that it measures the duration of a pulse. In the case of the HC-SR04, this is the time the Echo pin is high. To ensure accurate measurements, make sure there are no other electrical interferences that could affect the pulse duration. Also, be aware that if the obstacle is too far away, the pulse may time out. You can set a timeout value in the pulseIn() function to handle such cases gracefully. For example, long duration = pulseIn(echoPin, HIGH, 20000); where 20000 is the timeout value in microseconds.
- Избегание источников шума:
На ультразвуковые волны могут влиять источники громкого шума. При размещении HC-SR04 в вашем проекте избегайте мест с высокой интенсивностью звука, таких как близость к динамикам или очень шумная промышленная среда. Шум может создавать помехи ультразвуковым волнам, излучаемым датчиком, что приводит к неточным измерениям расстояния. Если вам необходимо использовать датчик в шумной зоне, рассмотрите возможность использования звукопоглощающих материалов или кожухов для защиты датчика от шума.
Интеграция Raspberry Pi
Предупреждение о напряжении
To solve this issue, you can use a voltage divider circuit. A simple voltage divider using a 1kΩ and a 2kΩ resistor can be used to convert the 5V output from the Echo pin of the HC-SR04 to a 3.3V-compatible signal for the Raspberry Pi. The formula for calculating the output voltage of a voltage divider is , where is the input voltage (5V in this case), is the first resistor (1kΩ), and is the second resistor (2kΩ). Plugging in the values, we get , which is within the safe range for the Raspberry Pi GPIO pin.
Проводка
- VCC: Подключите вывод VCC датчика HC-SR04 к выводу 5V на Raspberry Pi. Это обеспечит питание модуля датчика HC-SR04.
- GND: Контакт GND HC-SR04 должен быть подключен к контакту GND на Raspberry Pi для установления общего заземления.
- Trig: Подключите контакт Trig HC-SR04 к GPIO 17 на Raspberry Pi. Raspberry Pi будет использовать этот контакт для отправки импульса высокого уровня 10 мкс на HC-SR04.
- Echo: Контакт Echo датчика HC-SR04, после прохождения через схему делителя напряжения (резисторы 1 кОм и 2 кОм), подключается к GPIO 27 на Raspberry Pi. Raspberry Pi будет считывать импульс высокой длительности на этом контакте для расчета расстояния.
HC - SR04 Raspberry Pi
VCC ------------ 5V
GND ------------ GND
Trig ------------ GPIO 17
Echo (through voltage divider) ------------ GPIO 27
Код Python
import RPi.GPIO as GPIO
import time
# Set the GPIO mode
GPIO.setmode(GPIO.BCM)
# Define the pins
TRIG = 17
ECHO = 27
# Set up the pins
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
def measure_distance():
# Send a 10μs high - level pulse to trigger the sensor
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
# Wait for the echo to start
while GPIO.input(ECHO)==0:
pulse_start = time.time()
# Wait for the echo to end
while GPIO.input(ECHO)==1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150 # Speed of sound in cm/s divided by 2
distance = round(distance, 2)
return distance
try:
while True:
dist = measure_distance()
print(f"Distance: {dist} cm")
time.sleep(1)
except KeyboardInterrupt:
print("Measurement stopped by User")
GPIO.cleanup()
In this code, we first import the necessary libraries, RPi.GPIO for controlling the GPIO pins on the Raspberry Pi and time for adding delays. We then set the GPIO mode to BCM (Broadcom SOC channel numbering). We define the TRIG and ECHO pins and set up the TRIG pin as an output and the ECHO pin as an input.
The measure_distance function is where the magic happens. It sends a 10μs high - level pulse to the TRIG pin to trigger the HC - SR04. Then, it waits for the ECHO pin to go high (indicating the start of the echo) and records the start time. It then waits for the ECHO pin to go low (indicating the end of the echo) and records the end time. The time difference between the start and end times is used to calculate the distance. The distance is calculated by multiplying the pulse duration by the speed of sound in cm/s (34300 cm/s) and dividing by 2 (since the sound travels to the obstacle and back).
In the try block, we continuously measure the distance and print it to the console every second. If the user presses Ctrl + C (KeyboardInterrupt), the program cleans up the GPIO pins and exits gracefully.
ESP32 Конфигурация
Распределение контактов
Код Arduino IDE
const int trigPin = 14;
const int echoPin = 15;
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.0343 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(500);
}
In the setup function, we initialize the serial communication at a baud rate of 115200. We then set the trigPin as an output pin and the echoPin as an input pin.
In the loop function, the process of triggering the HC - SR04 and measuring the distance is the same as in the Arduino code. We send a 10μs high - level pulse to the trigPin to trigger the sensor, measure the duration of the high - level pulse on the echoPin using pulseIn , and calculate the distance.
Креативные идеи проектов с использованием HC-SR04
Робот, обходящий препятствия
Датчики настроены на обнаружение препятствий с разных сторон. Например, набор датчиков размещен в передней части робота для обнаружения любых препятствий, находящихся непосредственно на его пути. Кроме того, датчики размещены по бокам робота для обнаружения препятствий, которые могут приближаться сбоку. При обнаружении препятствия система управления роботом, которая часто основана на микроконтроллере, таком как Arduino, рассчитывает расстояние до препятствия, используя данные с датчиков HC-SR04.
На основе этой информации о расстоянии система управления затем определяет соответствующие действия, которые необходимо предпринять, чтобы избежать препятствия. Обычно это включает в себя управление двигателями таким образом, чтобы изменить направление движения робота. Например, если препятствие обнаружено с левой стороны робота, система управления может дать команду левому двигателю замедлиться или перейти в режим заднего хода, в то время как правый двигатель продолжает работать с нормальной скоростью. Это заставляет робота повернуть вправо, в сторону от препятствия.
Для реализации этого проекта вам понадобится несколько ключевых компонентов. Arduino служит «мозгом» операции. Он обрабатывает данные, полученные от датчиков HC-SR04, и отправляет команды двигателям. Двигатели необходимы для привода колес робота, что позволяет ему двигаться. Для управления двигателями необходим драйвер двигателя, такой как L298N. L298N может обрабатывать относительно высокие требования двигателей к току и позволяет Arduino эффективно контролировать скорость и направление двигателей. И, конечно же, для обнаружения спереди и сбоку необходимы несколько датчиков HC-SR04. Комбинируя эти компоненты и написав соответствующий код для их управления, вы можете создать полнофункционального робота, обходящего препятствия.
Умная мусорная корзина
Датчик HC-SR04 установлен на мусорном ведре таким образом, что он может определять расстояние до любых объектов, находящихся перед ним. Когда кто-то приближается к мусорному ведру, датчик измеряет расстояние между мусорным ведром и человеком. Если измеренное расстояние становится меньше заданного порогового значения (например, 20 см), это означает, что человек находится достаточно близко к мусорному ведру, чтобы воспользоваться им. В этот момент датчик посылает сигнал сервомотору.
Сервомотор подключен к крышке мусорного бака и отвечает за его открытие и закрытие. При получении сигнала от датчика HC-SR04 сервомотор вращается, открывая крышку. Такая бесконтактная работа не только удобна для пользователя, но и помогает сохранить мусорный бак в чистоте и гигиеничности, поскольку нет необходимости прикасаться к крышке напрямую.
При написании кода для этого проекта установка порогового значения расстояния является важным шагом. Вам необходимо тщательно откалибровать это значение в соответствии с конкретными требованиями вашего умного мусорного ведра. Если порог установлен слишком высоко, крышка может открываться без необходимости, когда кто-то еще находится на некотором расстоянии от мусорного ведра. С другой стороны, если порог установлен слишком низко, крышка может не открыться вовремя, когда пользователь приблизится. Хорошо откалиброванный порог расстояния обеспечивает оптимальную работу умного мусорного ведра.
Монитор уровня воды
Датчик HC-SR04 устанавливается над резервуаром с водой. Он излучает ультразвуковые волны вниз, в направлении поверхности воды. Эти волны распространяются по воздуху и отражаются, когда достигают поверхности воды. Затем датчик измеряет время, за которое волны доходят до поверхности воды и возвращаются обратно. Используя известную скорость звука в воздухе, можно рассчитать расстояние от датчика до поверхности воды.
Во многих случаях датчик уровня воды интегрирован с системой IoT (Интернет вещей). Например, он может быть подключен к приложению Blynk. Рассчитанные данные об уровне воды отправляются в приложение, что позволяет пользователям удаленно контролировать уровень воды. Это особенно полезно для промышленных применений, где мониторинг уровня воды в режиме реального времени имеет решающее значение для правильного функционирования процессов.
Одним из важных аспектов, который необходимо учитывать при настройке датчика уровня воды, является калибровка. Поскольку датчик устанавливается на определенной высоте над дном резервуара, эта высота должна учитываться при расчете расстояния. Например, если датчик установлен на высоте 50 см над дном резервуара, а рассчитанное расстояние от датчика до поверхности воды составляет 30 см, то фактический уровень воды в резервуаре составляет 20 см. Точно откалибровав высоту датчика и выполнив необходимые расчеты, вы можете обеспечить точность и надежность показаний датчика уровня воды.
Устранение распространенных неполадок
Несогласованные показания
Причина: многолучевое отражение или нестабильное питание
Еще одной причиной является нестабильное питание. Если питание HC-SR04 нестабильно, это может привести к неисправности датчика. Колебания напряжения могут повлиять на правильную работу ультразвукового передатчика и приемника, что приведет к нестабильным измерениям расстояния. Например, если вы используете батарею с низким зарядом или адаптер питания с плохой регулировкой напряжения, датчик может не получать стабильное питание 5 В, что может повлиять на его работу.
Исправление: добавьте защитный кожух для датчика и используйте стабилизированный источник питания 5 В.
Использование стабилизированного источника питания 5 В имеет решающее значение для стабильной работы. Блок питания со встроенной стабилизацией напряжения, такой как высококачественный настенный адаптер или модуль питания с регулировкой напряжения, обеспечивает стабильное напряжение 5 В для HC-SR04. Это помогает устранить любые проблемы, вызванные колебаниями напряжения, и повышает общую точность и стабильность показаний датчика.
Нет выходного сигнала
Если вы используете HC-SR04 с Raspberry Pi, не забудьте проверить схему делителя напряжения. Как упоминалось ранее, контакты GPIO Raspberry Pi могут работать только с напряжением 3,3 В, и делитель напряжения часто используется для преобразования выходного напряжения 5 В с контакта Echo HC-SR04 в сигнал, совместимый с 3,3 В. Если компоненты делителя напряжения (обычно резисторы) повреждены или неправильно подключены, это может привести к тому, что Raspberry Pi не будет получать выходной сигнал.
Логика кода для синхронизации триггера/эха также является важной областью, которую необходимо проверить. Убедитесь, что код посылает правильный триггерный сигнал (импульс высокого уровня 10 мкс) на контакт Trig и что он правильно измеряет длительность импульса высокого уровня на контакте Echo. Неправильный код может помешать срабатыванию датчика или привести к неправильной интерпретации эхо-сигнала микроконтроллером, что приведет к отсутствию выхода или неправильным расчетам расстояния. Например, если задержки в коде установлены неправильно, это может нарушить правильную последовательность срабатывания датчика и считывания эха.
Ошибки выхода за пределы диапазона
Также важно правильно обрабатывать значения 0 или ∞ (бесконечность) в коде. Значение расстояния 0 может означать, что датчик находится слишком близко к объекту, ближе, чем его минимальный диапазон обнаружения. В таких случаях вы можете установить минимальный порог расстояния в своем коде и соответствующим образом скорректировать значение расстояния. Аналогично, если код вычисляет чрезвычайно большое значение расстояния (приближающееся к бесконечности), это, вероятно, указывает на ошибку, например, на проблему с обнаружением эха или неверные вычисления. Ваш код должен уметь корректно обрабатывать такие случаи, например, регистрируя сообщение об ошибке или пытаясь повторно измерить расстояние.
HC-SR04 по сравнению с другими датчиками расстояния
vs. Инфракрасные датчики
HC-SR04
Range: 2cm–400cm (Abstract 1, 6)
Accuracy: ±3mm (ideal conditions, Abstract 1)
Voltage: 5V (fixed, Abstract 1)
Pros: No light interference, longer range (Abstract 5)
Cons: Reduced near-range accuracy, ultrasonic noise sensitivity (Abstract 1)
Infrared
Range: Typically <100cm (Abstract 1, 5)
Accuracy: ±5mm–1cm (affected by color/material, Abstract 5)
Voltage: 3.3V–5V (flexible, Abstract 5)
Pros: Small size, low cost (Abstract 1)
Cons: Ambient light/color interference (Abstract 5)
В таблице 1 показан компромисс между надежным датчиком HC-SR04 с большим радиусом действия (2–400 см) и компактными размерами/низкой стоимостью инфракрасных датчиков, с учетом устойчивости HC-SR04 к световым помехам по сравнению с уязвимостью инфракрасных датчиков к окружающему освещению и цвету материалов.
по сравнению с лазерными датчиками
HC-SR04
Range: 2cm–400cm (Abstract 1, 4)
Accuracy: ±3mm (Abstract 4)
Update Rate: 60ms (Abstract 4)
Cost: ~$2–3 (Abstract 1)
Weakness: 15° cone angle, environmental noise (Abstract 1)
Laser/ToF (VL53L0X)
Range: 5cm–200cm (Abstract 1, 3)
Accuracy: ±1mm–3mm (Abstract 3)
Update Rate: 20ms (faster, Abstract 4)
Cost: ~$10–15 (Abstract 1)
Strength: 5° narrow beam, interference-resistant (Abstract 3)
В таблице 2 сравниваются экономичность (2–3 доллара) и широкий диапазон (400 см) датчика HC-SR04 с превосходной точностью (±1 мм) и скоростью (частота обновления 20 мс) лазерных/ToF-датчиков, которые идеально подходят для применений, требующих высокой точности в контролируемых средах.
против США — 100 модулей
HC-SR04
Range: 2cm–400cm (Abstract 2, 6)
Accuracy: ±3mm (nominal, Abstract 2)
Voltage: 5V only (Abstract 6)
Feature: GPIO-only, no temperature compensation (Abstract 3)
Issue: Random values beyond 400cm (Abstract 6)
US-100
Range: 2cm–450cm (Abstract 2, 3)
Accuracy: ±2mm (better in tests, Abstract 3)
Voltage: 3.3V–5V (Abstract 3)
Feature: Temperature compensation (UART mode), error codes (Abstract 6)
Downside: Higher cost ($5–8), UART setup required (Abstract 3)
В таблице 3 показаны улучшенный диапазон (450 см), повышенная точность (±2 мм) и совместимость с 3,3 В/5 В датчика US-100 по сравнению с простотой датчика HC-SR04 (только GPIO), а также подчеркнута функция температурной компенсации датчика US-100 для промышленного использования при более высокой стоимости (5–8 долларов).
Передовые технологии и оптимизация
Калибровка нескольких датчиков
Однако при использовании нескольких датчиков значительной проблемой может стать перекрестная интерференция. Перекрестная интерференция возникает, когда ультразвуковые волны, излучаемые одним датчиком, мешают работе другого датчика. Это может привести к неточным показаниям, поскольку датчики могут неправильно интерпретировать мешающие волны как эхо от реальных препятствий.
Для уменьшения перекрестных помех можно использовать несколько методов. Один из подходов заключается в временном мультиплексировании датчиков. Это предполагает активацию датчиков по одному, с достаточным интервалом времени между каждой активацией. Например, если у вас есть четыре датчика HC-SR04 на роботе, вы можете активировать датчик 1, дождаться завершения его цикла измерения, затем активировать датчик 2 и так далее. Таким образом, вы гарантируете, что ультразвуковые волны от одного датчика не пересекаются с волнами другого датчика, что снижает вероятность перекрестных помех.
Другой метод — использование экранирующих материалов. Установка физического барьера, такого как тонкий металлический лист или звукопоглощающий материал, между датчиками может помочь блокировать ультразвуковые волны от одного датчика, чтобы они не достигали другого. Это может быть особенно полезно в ситуациях, когда датчики расположены в непосредственной близости друг от друга.
Калибровка также имеет решающее значение при использовании нескольких датчиков. Каждый датчик может иметь немного разные характеристики, такие как чувствительность или угол луча. Калибруя датчики, вы можете учесть эти различия и обеспечить согласованность данных со всех датчиков. Это может включать измерение расстояния до известного объекта с помощью каждого датчика и корректировку показаний на основе различий.
Фильтрация шума
Одним из широко используемых методов является фильтр скользящего среднего. Фильтр скользящего среднего рассчитывает среднее значение из серии последовательных показаний расстояния. Например, вместо использования одного показания расстояния можно взять последние 5 показаний и рассчитать их среднее значение. Это сглаживает нестабильные показания, поскольку небольшие колебания, как правило, компенсируют друг друга при усреднении. В Python реализация простого фильтра скользящего среднего для показаний расстояния HC-SR04 может выглядеть следующим образом:
distance_readings = []
num_readings = 5
def moving_average_filter(new_distance):
distance_readings.append(new_distance)
if len(distance_readings) > num_readings:
distance_readings.pop(0)
return sum(distance_readings) / len(distance_readings)
Еще одним эффективным методом фильтрации является медианный фильтр. Медианный фильтр заменяет каждое значение расстояния медианным значением набора последовательных значений. Медиана менее чувствительна к экстремальным значениям или выбросам по сравнению со средним значением. Например, если у вас есть набор из 5 показаний расстояния [20, 22, 18, 50, 21], медиана равна 21. При использовании медианного фильтра выброс 50 не окажет существенного влияния на результат фильтрации. В Arduino реализация медианного фильтра может выглядеть следующим образом:
const int numReadings = 5;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int averageDistance = 0;
void addReading(int newReading) {
total = total - readings[readIndex];
readings[readIndex] = newReading;
total = total + readings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings) {
readIndex = 0;
}
}
int getMedian() {
int sortedReadings[numReadings];
for (int i = 0; i < numReadings; i++) {
sortedReadings[i] = readings[i];
}
for (int i = 0; i < numReadings - 1; i++) {
for (int j = i + 1; j < numReadings; j++) {
if (sortedReadings[i] > sortedReadings[j]) {
int temp = sortedReadings[i];
sortedReadings[i] = sortedReadings[j];
sortedReadings[j] = temp;
}
}
}
return sortedReadings[numReadings / 2];
}
Пользовательские режимы работы
Однако в некоторых версиях HC-SR04 также доступны режимы UART (универсальный асинхронный приемник/передатчик) и I2C (меж-интегральная схема). В режиме UART модуль может связываться с микроконтроллером с помощью последовательной связи. Это может быть полезно в приложениях, где предпочтительнее использовать более стандартизированный протокол последовательной связи, например, в некоторых промышленных системах управления или при интеграции с устройствами, имеющими встроенные интерфейсы UART.
Режим I2C, с другой стороны, позволяет осуществлять связь по шине I2C. Это выгодно в конфигурациях с несколькими устройствами, где несколько датчиков или компонентов должны связываться с одним микроконтроллером. Шина I2C позволяет более эффективно использовать выводы микроконтроллера, поскольку несколько устройств могут совместно использовать одну и ту же двухпроводную шину (SDA — последовательная линия данных и SCL — последовательная линия тактовой частоты).
Чтобы настроить модуль для этих пользовательских режимов, необходимо обратиться к документации модуля, чтобы определить соответствующие значения резисторов. Например, для включения режима UART может потребоваться подключить специальный резистор между двумя контактами на модуле. После правильной настройки резисторов модуль можно запрограммировать на связь в желаемом режиме. Это может потребовать написания другого кода в микроконтроллере для обработки протоколов связи UART или I2C. Например, в проекте Raspberry Pi с использованием I2C — настроенного HC — SR04, вы будете использовать библиотеку smbus в Python для связи с датчиком по шине I2C.




