Инструменты

Применение hc sr04. Ардуино: ультразвуковой дальномер HC-SR04

Применение hc sr04. Ардуино: ультразвуковой дальномер HC-SR04

Всех приветствую.
В этом мини обзорчике, мы посамодельничаем с ультразвуковым модулем измерения расстояния…

Сразу извиняюсь, упаковок и распаковок не будет. Сам не люблю их в других обзорах, свои портить не буду. Разве что какой заказ прибудет в экстраординарной упаковке или супер непотребном виде…
Возникла идея автоматически включать свет при посещении сортира и так же выключать при покидании оного. Был заказан pir-выключатель для этих целей, а так же pir-датчик отдельно, на всякий…



Выключатель был установлен в однозначно посещаемом всеми членами семьи помещении и…
И оказалось, что плясать лезгинку, при выполнении процедур характерных для посещения сортира, никто не в состоянии, а замирание в привычной позе характерно для всех. Тут и подстерегала бяка. Только задумался о добром и вечном, свет хлоп и выключился, что довольно досадно.
Перепробованы все способы регулировок выключателя, но желаемого результата достичь не удалось.
Не удалось обмануть себя и физику, подменив необходимый датчик присутствия, на датчик обнаружения.
Так что выключатель и неиспользованный pir-датчик были отправлены на длительное хранение до лучших времен, а их место занял…
Комбинированный радар для воротных систем , пока никуда не пристроенный.


Микроволновый блок естественно был отключен, зачем нам подставлять макушку под микроволны. Осталась только ИК матрица.
Штука довольна специфическая. Минимальная зона у него размером с помещение. Свет включает и выключает при посещении на ура. Но есть один недостаток. Датчик очень педантичен и любит, чтобы все стояло на своих местах. Передвинул рулончик бумажки или опустил/поднял стульчак, требуется перенастройка. Да и ценник у него не сортирный.
Так что поиск решения был продолжен.
На просторах интернета набрел на сайт и с темой о простом автоматическом выключателе света на ультразвуковом датчике.
Тема показалась интересной, тем более изобретать велосипед с прошивкой не надо, автор постарался за нас, за что ему спасибо.
Схема есть, прошивки есть. Осталось сделать печатку и получить на выходе полноценный датчик присутствия. Или не получить… посмотрим…
Датчик был заказан на banggood"e. Нравится мне этот магазин стабильностью сроков доставки. Безтреком 28-30 дней и заказ у меня.
Приехал безтреком в срок. Упаковка для посылок без трека у banggood"а стандартная, мусорный мешок и все…
Датчик был упакован в антистатик, что подозреваю и спасло его от почтовых неприятностей. :0)
К сожалению мусорный мешок выбросил по пути домой, а антистатик уже дома, так что показать кроме датчика вам нечего, да и сам датчик уже потрепался (ножки выпрямил) в процессе изготовления устройства.
ТТХ датчика:
- 45*20*23 мм. ДхШхГ (Г - с выпрямленными ножками)
- вес - 8,28 грамм
- напряжение питания - DC 5V
- ток потребления - 15mA
- минимальное рабочее расстояние - 2 см.
- максимальное рабочее расстояние - 4 метра
- угол зоны обнаружения - 15 градусов
Кратко.
Датчик работает по принципу эха. Один пьезик датчика излучает пакет импульсов с частотой 40 кГц, сигнал отражается от поверхности перед датчиком, отраженный сигнал принимает другой пьезик, блок обработки обрабатывает полученные данные и на выходе выдает импульс длинной пропорциональной расстоянию прохождения УЗ сигнала.
Т.е. на выходе мы имеем импульс, длительность которого нам и важна.
В изготавливаемом нами автоматическом включателе/выключателе мы сравниваем длительность импульса занесенного в память микроконтроллера, с длительностью нового отраженного импульса. Если длительность нового импульса меньше того что в памяти, микроконтроллер решает, что в зоне обнаружение есть объект и нужно включить нагрузку… Если длинна импульса больше, то ничего не делаем или выключаем нагрузку, если она включена.
Далее:
Сам датчик.


Маркировка на микросхемах стерта.


Быстренько перерисовываем готовую схему в Diptrace, там же рисуем печатку, изготавливаем платку для опытов.

Процесс изготовления спрятал под спойлер, по тому как думаю многих уже притомил процессами.
Один раз я уже показывал, как делаю платки. В этот же раз наделал фоток, жалко выкидывать.
Больше народ процессами мучить не буду, если есть вопросы по платам, пишите пожалуйста в личку.
ссылка на скачивание того, что я собрал по теме, плюс схема и печатка платки в Diptrace.
Несколько фоток.
Подготавливаем платку и шаблон. Фоторезист нанесен.


Засвечиваем, промываем, травим.


Травим, смываем фоторезист.


Наносим маску, засвечиваем шаблон.


Режем платку, сверлим.



Сама платка.
Собрана схема на ATtiny13.
Зачем для тестов такая красивая? Просто она делалась попутно с другой платой, под эл. нагрузку.
Почему так бестолково расположены радиоэлементы? По тому что тестовая. Чтобы проверить, рабочее ли устройство в сборе. Не было смысла разводить и компоновать.


Припаиваем датчик к платке.


Программируем.


В результате получаем готовый бескорпусной датчик присутствия с питанием пять вольт, кушающее 30mA, способное обнаруживать посторонние предметы в заранее запрограммированной зоне обнаружения с углом в 15 градусов и расстоянием от 2 сантиметров, до 3,5 метров. При обнаружении включать светодиод.
Принцип работы прост. Направляем датчик, куда нам нужно. Нажимаем кнопку.
Настроечный светодиод (у меня он красненький) начинает мигать.
Мигает он в 3-х режимах:
10% светодиод включен- объект вне зоны действия, нагрузка выключена.
90% светодиод включен- объект в зоне действия, нагрузка включена.
50% светодиод включен- зона обнаружения свободна, идет отсчет 60 или 10 секунд, или одна секунда, в зависимости от прошивки, до выключения, лампа включена.
Дальше у вас есть 10 секунд чтобы уйти из зоны обнаружения.
Можно ограничить зону. Для этого нужно в момент запоминания настроек встать на границе зоны, тем самым зона будет ограничена.
Паспортные минимальные 2 сантиметра я подтверждаю. Если ограничить зону как на фото, то при просовывании пальца между коробкой и датчиком светодиод загорается, убираем палец, гаснет.
Если подвинуть коробку на полсантиметра ближе, то свтодиод загорается, устройство настраиваться отказывается.


Максимальные 4 метра подтвердить не удалось. Максимальное расстояние которое удалось подтвердить, где устройство уверенно фиксирует человека равно 3.5 метра. На з-х метрах уверенно фиксирует мою руку с коробкой 15х15 сантиметров. Включает нагрузку и не отключает, пока коробку не уберешь.
Выводы.
- Получившийся датчик присутствия мне понравился.
- Простейшая и удобная настройка.
- Реально работает.
- Дешево и сердито.
В общем, вот такое получилось годное устройство на ультразвуковом модуле измерения расстояния HY-SRF05.
В недалеком будущем я приспособлю его по месту, только коробку подберу.
Теперь можно будет замирать в нужной позе не боясь отключения света.
Желающие думаю могут придумать еще множество способов его использования. Особенно ардуинщики, для кого этот датчик в принципе и разработан. А может и не для них… Планирую купить +41 Добавить в избранное Обзор понравился +41 +81

Входное напряжение 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 sensor(2,3); // Объявляем объект sensor, указывая номера arduino подключенные к выводам TRIG и ECHO датчика // Можно использовать любые выводы Arduino void setup(){ Serial.begin(9600); // Инициализация передачи данных в монитор последовательного порта } void loop(){ delay(500); // Задержка 0,5 сек Serial.println(sensor.distance()); // Вывод расстояния (см) при температуре воздуха, около +23 °C Serial.println(sensor.distance(-20)); // Вывод расстояния (см) при температуре воздуха, около -20 °C Serial.println("=================="); }

Определение расстояния с использованием библиотеки iarduino_HC_SR04_int:

#include // Подключаем библиотеку iarduino_HC_SR04_int sensor(2,3); // Объявляем объект sensor, указывая номера arduino подключенные к выводам TRIG и ECHO датчика // (вывод ECHO нужно подключить к выводу Arduino использующему внешнее прерывание) void setup(){ Serial.begin(9600); // Инициализация передачи данных в монитор последовательного порта } void loop(){ delay(500); // Задержка 0,5 сек Serial.println(sensor.distance()); // Вывод расстояния (см) при температуре воздуха, около +23 °C Serial.println(sensor.distance(-20)); // Вывод расстояния (см) при температуре воздуха, около -20 °C Serial.println("=================="); }

Результат работы обоих примеров:


Из примера видно, что если во время измерений не учитывать температуру воздуха, то можно получить результаты с высокой погрешностью.

Для измерения расстояния до объектов, можно воспользоваться ультразвуковым дальномером 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() {
Serial.begin (9600);//Задаём скорость com-порта.
pinMode(TrigPin, OUTPUT);//Устанавливаем пин Trig как выход.
pinMode(EchoPin, INPUT);//Устанавливаем пин Echo как вход.
}
void loop() {
int distance, duration;
.
.
.
.
Serial.print(duration);//Выводим значение дистанции на дисплей.
Serial.println(" cm");
delay(1000);//Ждём 1000 милисекунд.
}

Строка «duration = duration/29/2; » вычисляет расстояние в «см », если нужно производить расчёты в дюймах, строка должна выглядеть так: «duration = duration/74/2; ».

Результат выполнения скетча будет отображаться в окне монитора последовательного порта.

Скетч №2 включает встроенный на плате Uno светодиод, если расстояние до объекта менее 50 см. Светодиод висит на 13 пине.

int TrigPin = 2;
int EchoPin = 3;
int LedPin = 13;

void setup() {
Serial.begin (9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(LedPin, OUTPUT);
}
void loop() {
int distance, duration;
digitalWrite(TrigPin, HIGH);//На пин Trig подаётся логическая единица.
delayMicroseconds(10);//Удерживается это состояние 10 микросекунд
digitalWrite(TrigPin, LOW);//убирается это состояние
duration = pulseIn(EchoPin, HIGH);//Значение с пина Echo, считывается и записывается в значение duration
duration = duration/29/2;//Подсчёт дистанции. Скорость звука 340 м/с или 29 микросекунд на сантиметр
Serial.print(duration);
Serial.println(" cm");
if (duration<50) // Если расстояние менее 50 сантиметром
{
digitalWrite(LedPin, HIGH); // Светодиод горит
}
else
{
digitalWrite(LedPin, LOW); // иначе не горит
}
delay(1000);
}

Если вместо светодиода, подключить лампу накаливания, как это описано в статье « », у нас получится простая система автоматического освещения. Разместив подобную конструкцию в каком то помещении, при попадании посетителя в зону действия дальномера, в помещении автоматически включится свет. Ток покоя дальномера составляет менее 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() {
Serial.begin (9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(BeepPin, OUTPUT);
}
void loop() {
int distance, duration;
digitalWrite(TrigPin, HIGH);//На пин Trig подаётся логическая единица.
delayMicroseconds(10);//Удерживается это состояние 10 микросекунд
digitalWrite(TrigPin, LOW);//убирается это состояние
duration = pulseIn(EchoPin, HIGH);//Значение с пина Echo, считывается и записывается в значение duration
duration = duration/29/2;//Подсчёт дистанции. Скорость звука 340 м/с или 29 микросекунд на сантиметр
Serial.print(duration);
Serial.println(" cm");
if (duration<50) // Если расстояние менее 50 сантиметром
{
analogWrite(BeepPin, 50); // включаем пьезоизлучатель
}
else
{
analogWrite(BeepPin, 0); // выключаем пьезоизлучатель
}
delay(1000);
}

Если расстояние до объекта будет менее 50 см, зуммер издаст звук.

В скетче №4 мы так же будем использовать зуммер, но только с функцией tone() , которая будет позволять менять тональность звука, при разных ситуациях.

int TrigPin = 2;
int EchoPin = 3;
int BeepPin = 5;

void setup() {
Serial.begin (9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(BeepPin, OUTPUT);
}
void loop() {
int distance, duration;
digitalWrite(TrigPin, HIGH);//На пин Trig подаётся логическая единица.
delayMicroseconds(10);//Удерживается это состояние 10 микросекунд
digitalWrite(TrigPin, LOW);//убирается это состояние
duration = pulseIn(EchoPin, HIGH);//Значение с пина Echo, считывается и записывается в значение duration
duration = duration/29/2;//Подсчёт дистанции. Скорость звука 340 м/с или 29 микросекунд на сантиметр
Serial.print(duration);
Serial.println(" cm");
if (duration<50) // Если расстояние менее 50 сантиметром
{
}
else
{
noTone(BeepPin); // выключаем пьезоизлучатель
}
delay(1000);
}

В строке " tone(BeepPin, 500) ;" параметром "500 " задаётся частота звука - 500 Гц. Этот параметр можно выставлять от 31 Гц и до пределов, которыми ограничены параметры пьезоизлучателя и человеческого слуха. Данный скетч будет повторять эксперимент скетча №3, только с использованием функции tone(), которая будет устанавливать частоту звука.

В скетче №5 попробуем изменять тональность звука. При расстоянии более 50 см, будет издаваться звук, частотою 1000Гц. Если расстояние до объекта будет менее 50 см, звук изменит частоту на 500Гц.

int TrigPin = 2;
int EchoPin = 3;
int BeepPin = 5;

void setup() {
Serial.begin (9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(BeepPin, OUTPUT);
}
void loop() {
int distance, duration;
digitalWrite(TrigPin, HIGH);//На пин Trig подаётся логическая единица.
delayMicroseconds(10);//Удерживается это состояние 10 микросекунд
digitalWrite(TrigPin, LOW);//убирается это состояние
duration = pulseIn(EchoPin, HIGH);//Значение с пина Echo, считывается и записывается в значение duration
duration = duration/29/2;//Подсчёт дистанции. Скорость звука 340 м/с или 29 микросекунд на сантиметр
Serial.print(duration);
Serial.println(" cm");
if (duration<50) // Если расстояние менее 50 сантиметром
{
tone(BeepPin, 500); // включаем пьезоизлучатель c частотой 500 Гц
}
else
{
tone(BeepPin, 1000); // включаем пьезоизлучатель c частотой 1000 Гц
}

Используя функцию tone() нужно обратить внимание на то, что она мешает использовать ШИМ на пинах 3 и 11 Ардуино, (на платформу Mega это не распространяется). Допустим, в моих примерах функция tone() вызывается на 5 пине, но она может мешать работе ШИМ на выводах 3 и 11, это нужно учитывать при построении дальнейших своих устройств. Ещё один момент, с функцией tone() нельзя одновременно использовать более одного пьезоизлучателя. Для того что бы включить звук на втором пьезоизлучателе, первый обязательно нужно отключить функцией noTone() .

В процессе данных экспериментах выяснил, что более точное определение расстояния производится с расстоянием до 2 м. Так же, дальномер до исследуемого объекта нужно располагать под прямым углом, поскольку эффективный угол наблюдения порядка 15°.

Ардуино – уникальная система, представляющая собой пластилин в руках инженера, из которого он может слепить, что пожелает. Возможно это благодаря большому разнообразию датчиков и модулей разных направленностей. От простых чипов, измеряющих силу тока, до вещей вроде Arduino hc hc sr04.

Это специальный датчик, позволяющий, при помощи ультразвуковых волн, измерить расстояние до объекта, на который его направили. Несложно догадаться, что проще всего его применить для создания простого дальномера. Рассмотрим Arduino hc sr04 и какие нюансы в работе с ним стоит учитывать, прежде чем начать собирать проект.

1. Основы сборки дальномера на Ардуино с помощью датчика HC SR04

Если вы собираетесь собрать дальномер на Ардуино, то без HC SR04 просто не обойтись. Ведь именно этот модуль чаще всего применяют в подобных системах из-за его высокой востребованности, по причине простоты работы, доступности и низкой стоимости. При этом точность показаний остаётся на высоте, что очень важно в подобных системах. Из данного чипа можно собрать не только дальномер на Ардуино, но и полноценного робота, который будет чувствовать расстояние до объекта и обходить любое препятствие.

Однако сегодня мы рассмотрим именно вариант с дальномером на Аrduino, так как он идеально подойдёт для новичков в сфере, которые ещё не слишком хорошо разбираются в основах. Если же вы захотите затем модифицировать своё изобретение, то можно научить его моделировать полноценную трехмерную карту помещения, что будет удобно для тех, кто занимается дизайном и конструированием мебели или зданий. Но сначала стоит рассмотреть, как вообще работает данный прибор и какие основы сборки стоит усвоить, прежде чем создать лазерный дальномер на Ардуино своими руками.

Наш дальномер на Arduino будет основан на сонаре, применяемом в природе дельфинами, для измерения расстояния до объектов и спокойного обхождения препятствий. Делается это с помощью физических свойств ультразвуковых волн, которые способны отражаться, сталкиваясь с твердыми объектами, и возвращаться обратно к датчикам.

Далее в ход вступает программный код, который высчитывает, сколько времени прошло между посланием и возвратом волны, делит его на два и с помощью формул и скорости звука высчитывает усреднённое расстояние до объекта.

Почему усреднённое?

Дело в том, что любой ультразвуковой датчик все равно будет ошибаться на десятые доли метра, связано это с тем, что различные материалы, окружение и прочие переменные могут повлиять на скорость движения и отражения от поверхности звука. А в данном проекте мы берём идеальную систему, которая в реальном мире работать не может.

Можно постараться учесть все эти факторы, но каждую переменную вы все равно не запрограммируете, поэтому наша задача – получить данные, максимально приближённые к показаниям профессиональных приборов, ведь дальномер Ардуино всё ещё далёк от них по точности.

Есть и ещё один нюанс, который вам стоит заранее учесть, собирая ультразвуковой дальномер Arduino – не все поверхности подходят для измерения. Дело в том, что некоторые материалы способны поглощать звук или слишком сильно искажать его движение, подобно тому, как черная рубашка поглощает электромагнитную световую волну.

Соответственно, лучше всего применять прибор к гладким и плоским поверхностям, которые не будут нарушать движения УВ, что также ограничивает его функционал. Но благодаря низкому ценнику и удобству работы датчик всё ещё остается достаточно популярным.

2. Что будет в уроке?

Мы соберем дальномер, который будет работать по следующему принципу: при приближении объекта на расстояние менее 4 сантиметров - загорается красный светодиод, иначе горит зеленый.

Достаточно простой пример, в котором мы проверим точность измерения расстояния дальномером hc-sr04. Основа проверки точности станет простая линейка 🙂

3. Инструменты

Чтобы лишний раз не бегать в магазин прямо посреди процесса сборки системы, лучше заранее подготовить все инструменты, что могут вам пригодиться. Так, стоит побеспокоиться, чтобы под рукой были:

  1. Паяльник. Хорошим выбором станут приборы с регулируемой мощностью, их можно приспособить к любой ситуации.
  2. Проводники. Естественно, датчик необходимо будет подсоединять к МК, и для этого не всегда подходят стандартные пины.
  3. Переходник под usb-порт. Если на вашем микроконтроллере нет встроенного порта, побеспокойтесь о том, чтобы его можно было подключить к ПК другим способом. Ведь вам необходимо будет подгружать дополнительные библиотеки и новую прошивку в ваш проект.
  4. Припой, канифоль и прочие мелочи, в том числе изолированное рабочее пространство.
  5. Сам чип и МК, а также, при необходимости, корпус будущего устройства. Наиболее опытные инженеры предпочитают распечатывать оболочку для своих проектов на 3Д принтере, однако, если вы живёте в крупном городе, не обязательно тратиться. Можете поискать компании, дающие в аренду принтеры.

Стоит понимать, что дальномер Arduino относится к приборам бесконтактного типа и способен обеспечивать точные измерения. Но всё же не стоит забывать, что профессиональные устройства используют совершенно другие технологии и проходят длительную калибровку под все материалы, а соответственно, в любом случае, окажутся лучше. Также у нашего проекта будет ограниченный диапазон измерения расстояний, от 0.03 до 4 метров, что подойдёт не во всех случаях.

Но, что хорошо, на работу устройства не оказывается никакого влияния со стороны ЭМ излучений и солнечной энергии. А в комплекте к датчику уже находятся нужные ресиверы и трансмиттеры, которые пригодятся, когда вы будете собирать ультразвуковой дальномер Ардуино.

Важно! В нашем уроке можно будет ничего не паять, т.к. мы будем использовать макетную плату и провода-перемычки. Но если вы захотите в итоге собрать законченное устройство - вам пригодится всё что мы указали выше.

4. Комплектующие

Так как мы решили пока ничего не паять - оптимальный набор деталей будет следующим:

  • 1 - Arduino UNO R3 (или аналог)
  • 1 - Ультразвуковой датчик расстояния HC-SR04
  • 1 - красный светодиод
  • 1 - зеленый светодиод
  • 2 - резистор 560 Ом
  • 1- макетная плата
  • 8 - проводов-перемычек (папа-папа)
  • 1 - линейка для измерения расстояния

5. Подключение датчика HC SR04

С подключением датчика не должно возникнуть никаких проблем. Достаточно с помощью проводников соединить пин на питание с источником или МК, а ввод и вывод, соответственно, присоединить непосредственно к МК. Воспользуйтесь схемой ниже для сборки схемы:

У самого сенсора SR04 следующие характеристики от которых вам стоит отталкиваться:

  1. Напряжение для питания – 5В.
  2. Работает в цепях с силой тока 15 мА.
  3. Если датчик не используется, то для поддержания его в пассивном состоянии всё ещё требуется до 2 мА.
  4. Угол обзора у модуля небольшой, всего 15 градусов.
  5. Разрешение сенсора – 3 десятых см.
  6. А вот угол для измерений составляет уже приятные 30 градусов.

Также на датчике имеются четыре вывода по стандарту 2.54 мм. В них входит контакт для питания с положительным напряжением +5В, пины для ввода и вывода сигнала и заземление.

В конечном варианте выглядеть устройство должно примерно таким образом:

6. Код

Код для нашего устройства ниже. Помните, что красный светодиод должен загораться при расстоянии менее 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); }

Единственное, о чем стоит помнить, – далеко не все функции и библиотеки написаны профессионалами. Многие из них создаются такими новичками, как и вы, соответственно, старайтесь просматривать код, прежде чем заключать, что датчик не работает или выдаёт неправильные данные.

Но значительно лучше будет изучить основы программирования и С++, чтобы в дальнейшем самостоятельно писать многие вещи самому.

7. Запуск и настройка

При первом запуске устройства происходит следующее:

  1. Подается импульс на вход Trig.
  2. В самом датчике сигнал преобразуется в 8 импульсов, у которых частота достигает 40 кГц, их он, соответственно, и посылает вперёд.
  3. Доходя до препятствия, импульсы отражаются и возвращаются на приемник, происходят моментальные расчеты в МК, и вся информация подаётся на устройство вывода. В нашем случае – это консоль ПК, но в будущем мы сделаем урок, где данные будут выводиться на LED-экранчик.

При первом запуске мы используем линейку, которая позволит сравнить точность измерений. Запустив устройство, проверьте данные, которые будут выведены в консоли.

Датчик пользуется большой популярностью и всё больше людей пишут свои решения для работы с ним.

В данное статье рассмотрим принцип работы ультразвукового дальномера HC-SR04.

Принцип работы ультразвукового дальномера основан на испускании ультразвука и его отражения от впереди находящихся предметов. Исходя из времени возвращения звука, по простой формуле, можно рассчитать расстояние до объекта. Дальномер HC-SR04 является самым дешевым дальномером для хоббийного использования. При малой цене обладает хорошими характеристиками, способен измерять расстояние в диапазоне от 2 до 450см.

Используемые компоненты (купить в Китае):

Принцип работы датчика можно условно разделить на 4 этапа:

1. Подаем импульс продолжительностью 10 мкс, на вывод Trig.

2. Внутри дальномера входной импульс преобразуется в 8 импульсов частотой 40 КГц и посылается вперед через "T глазик"

3. Дойдя до препятствия, посланные импульсы отражаются и принимаются "R глазиком". Получаем выходной сигнал на выводе Echo.

4. Непосредственно на стороне контроллера переводим полученный сигнал в расстояние по формуле:

ширина импульса (мкс) / 58= дистанция (см)

ширина импульса (мкс) / 148= дистанция (дюйм)

Подключение к Arduino

Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм

VCC : "+" питания

TRIG (T) : вывод входного сигнала

ECHO (R) : вывод выходного сигнала (Длина сигнала зависит от расстояния объекта до датчика)

GND : "-" питания

Подключив датчик к Arduino остается только залить скетч для работы. В приведенном ниже скетче информация о расстоянии будет отсылаться в порт компьютера, а также при дистанции менее 30 сантиметров зажигать светодиод подключенный к 13 пину.

пример программного кода:

#define Trig 9 #define Echo 8 #define ledPin 13 void setup //инициируем как выход pinMode (Echo, INPUT ); //инициируем как вход pinMode (ledPin, OUTPUT ); Serial .begin (9600); /* задаем скорость общения. В нашем случае с компьютером */ } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop () { digitalWrite (Trig, HIGH ); /* Подаем импульс на вход trig дальномера */ delayMicroseconds (10); // равный 10 микросекундам digitalWrite (Trig, LOW ); // Отключаем impulseTime=pulseIn (Echo, HIGH ); // Замеряем длину импульса distance_sm=impulseTime/58; Serial .println (distance_sm); // Выводим на порт if (distance_sm<30) // Если расстояние менее 30 сантиметром { digitalWrite (ledPin, HIGH ); // Светодиод горит } else { digitalWrite (ledPin, LOW ); // иначе не горит } delay (100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ }

Дополнительный пример работы:

Взаимодействие дальномера и сервопривода. Дистанция, измеряемая дальномером преобразуется в угол поворота сервопривода

Пример программного кода

//Тестировалось на Arduino IDE 1.0.1 #include #define coef 10 //(коэффициент соответствия 10 градусов на 1см) #define dead_zone 4 #define max_value 22 #define Trig 9 #define Echo 8 #define ledPin 13 #define servoPin 11 Servo myservo; void setup () { pinMode (Trig, OUTPUT ); //инициируем как выход pinMode (Echo, INPUT ); //инициируем как вход pinMode (ledPin, OUTPUT ); myservo.attach (servoPin); myservo.write (0); } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop () { digitalWrite (Trig, HIGH ); /* Подаем импульс на вход trig дальномера */ delayMicroseconds (10); // равный 10 микросекундам digitalWrite (Trig, LOW ); // Отключаем impulseTime = pulseIn (Echo, HIGH ); // Замеряем длину импульса distance_sm = impulseTime/58; // Пересчитываем в сантиметры if (distance_sm >= dead_zone && distance_sm <= max_value) { myservo.write (coef * (distance_sm - dead_zone)); } else if (distance_sm < dead_zone)// если дистанция менее 4 см, серва в положении ноль градусов { myservo.write (0); } else { myservo.write (180); } delay (100); /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего. Это время называется периодом цикла (cycle period). Рекомендованный период между импульсами должен быть не менее 50 мс. */ }