Ультразвуковой датчик расстояния ардуино hc-sr04

Введение

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

Формула Герона позволяет рассчитать площадь любого треугольника, для которого известны все стороны. Как только вы узнаете площадь треугольника, вы сможете рассчитать положение одного объекта (относительно известной базовой линии), используя тригонометрию и теорему Пифагора.

Точность отличная. При использовании распространенных ультразвуковых датчиков HC-SR04 или HY-SRF05 возможны большие области обнаружения.

Конструкция проста: всё, что вам нужно, это острый нож, два сверла, паяльник и ножовка по дереву.

Изображения:

  • видеоролик, показывающий работу устройства;
  • фото 1 показывает собранный эхолокатор;
  • на фото 2 показан типовой дисплей. Объект отображается красной (мигающей) точкой;
  • на фото 3 показана тестовая установка, используемая на видео. Было необходимо установить два ультразвуковых датчика HY-SRF05 на 50 см ниже базовой линии, чтобы полностью «осветить» зону обнаружения со звуком.

Рисунок 1 – Собранный эхолокатор на двух датчиках и Arduino
Рисунок 2 – Скриншот экрана обнаружения объектаРисунок 3 – Тестовый стенд для проверки эхолокатора на Arduino

Программирование своего собственного приложения с использованием Processing

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

Подобное приложение использует две библиотеки, которые называются “Ketai library” и “ControlP5 library”. Ketai library используется для управления всеми аппаратными средствами вашего смартфона, например, уровнем заряда батареи, значениями с датчика близости (proximity sensor), значениями с датчика ускорения (accelerometer sensor), настройками Bluetooth и т.д. Ко всем этим настройкам можно легко получить доступ с использованием Ketai library. В нашей программе мы используем эту библиотеку для установления связи между Bluetooth смартфона и Bluetooth модулем HC-05, подключенном к Arduino. Библиотека “ControlP5 library” используется для построения графиков на основе данных, получаемых от нашего радара.

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

Если вы закончили с написанием программы и успешно скомпилировали ее вы можете соединить ваш смартфон с компьютером соответствующим кабелем и скопировать и установить ее на ваш смартфон.

Шаг 4: сборка

Рисунок 8 – Монтажный уголокРисунок 9 – Собранный эхолокатор

Монтажные уголки

Два монтажных уголка были изготовлены из алюминиевого листа толщиной 2 мм. Размеры уголков показаны на рисунке 8.

Два отверстия обозначенные «базовая линия», предназначены для крепления шнура к каждому датчику. Для простоты настройки просто привяжите к ним шнур требуемой длины.

Разъемы датчиков

Разъемы датчиков (рисунок 9) выполнены из стандартных разъемов от Arduino. Все ненужные выводы были вытащены, и в пластике было просверлено отверстие 3 мм.

При пайке соединений старайтесь не замыкать провода на алюминиевый уголок.

Защита от натяжений

Небольшой кусок термоусадочной трубки на каждом конце кабеля препятствует разрыву проводов. Для предотвращения нежелательных перемещений кабеля были использованы кабельные стяжки.

Установка датчика H206

Установка данных типов датчиков немного капризна. Они могут устанавливаться только на двигатели, которые имеют ось, выступающие с обоих концов двигателя. Поэтому одна сторона оси прикрепляется к колесу, а к другой стороне оси прикрепляется пластина с сетчатой градуировкой как показано на следующем рисунке.

Поскольку при таком креплении получается что и колесо, и пластина с делениями датчика смонтированы на одной оси, это будет обозначать что они вращаются с одинаковой скоростью. То есть измеряя скорость вращения пластины мы можем определить скорость вращения колеса. При установке убедитесь в том, что отверстия (деления) пластины попадают в область действия инфракрасного датчика потому что только он сможет определить число отверстий, которое прошло через него. При желании вы можете на свой вкус модифицировать механическую часть проекта – главное чтобы соблюдались указанные условия.

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.  

Объяснение программы для приемного датчика

В приемном датчике мы должны заклеить передающую часть непрозрачной лентой (как обсуждалось ранее). И затем мы должны просто использовать описанный ранее в статье метод чтобы приемный датчик синхронизировался с передающим датчиком.

Arduino

Trigger_US();
while (digitalRead(echoPin)==HIGH);
delayMicroseconds (10);
Trigger_US();
duration = pulseIn(echoPin, HIGH);

1
2
3
4
5

Trigger_US();

while(digitalRead(echoPin)==HIGH);

delayMicroseconds(10);

Trigger_US();

duration=pulseIn(echoPin,HIGH);

Сначала мы запускаем в работу датчик с помощью функции Trigger_US() и затем в цикле while ждем до тех пор пока на контакте echo будет напряжение высокого уровня. Как только на контакте echo появится напряжение низкого уровня мы ждем заранее известную нам задержку – она должна быть в интервале от 10 до 30 микросекунд (можно экспериментально определить наилучшее значение для этой задержки или использовать прием описанный нижу в данной статье). После этой задержки мы снова запускаем в работу датчик с помощью функции Trigger_US() и затем используем функцию pulseIn() чтобы определить длительность импульса.

И затем по известной формуле мы можем рассчитать расстояние.

Arduino

distance= duration*0.034;

1 distance=duration*0.034;

Как подключить ультразвуковой датчик к Ардуино

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • УЗ дальномер HC-SR04;
  • 1 светодиод и резистор 220 Ом;
  • провода «папа-папа» и «папа-мама».

Схема подключения ультразвукового датчика к Arduino Uno

Схема подключения указана на рисунке выше. Отметим, что ультразвуковой дальномер HC-SR04 имеет диапазон измерения от 2 см до 400 см, работает при температурах от 0° до 60° С. Точность измерения составляет ± 1 см, рабочее напряжение датчика до 5,5 В. Для начала мы используем простой скетч, без использования библиотеки Ultrasonic. После подключения к Arduino дальномера HC-SR04 загрузите следующий скетч:

Скетч для подключения датчика hc-sr04 к Arduino

int trigPin = 8; // назначаем имя для Pin8
int echoPin = 9; // назначаем имя для Pin9
 
void setup() { 
  Serial.begin (9600); // подключаем монитор порта
  pinMode(trigPin, OUTPUT); // назначаем trigPin (Pin8), как выход
  pinMode(echoPin, INPUT); // назначаем echoPin (Pin9), как вход
} 
 
void loop() { 
  int duration, cm; // назначаем переменную "cm" и "duration" для показаний датчика
  digitalWrite(trigPin, LOW); // изначально датчик не посылает сигнал
  delayMicroseconds(2); // ставим задержку в 2 ммикросекунд

  digitalWrite(trigPin, HIGH); // посылаем сигнал
  delayMicroseconds(10); // ставим задержку в 10 микросекунд
  digitalWrite(trigPin, LOW); // выключаем сигнал

  duration = pulseIn(echoPin, HIGH); // включаем прием сигнала

  cm = duration / 58; // вычисляем расстояние в сантиметрах

  Serial.print(cm); // выводим расстояние в сантиметрах
  Serial.println(" cm");

  delay(1000); // ставим паузу в 1 секунду
}

Пояснения к коду:

  1. для подключения выходов Trig и Echo на датчике сонара Ардуино можно использовать любые цифровые входы на микроконтроллере;
  2. чтобы получить значение датчика в миллиметрах следует использовать следующую формулу для расчета: .

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 будет показывать расстояние более точно.

Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).

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); – дистанция будет отображаться в дюймах.

1Сборка ультразвукового дальномера

Для начала, необходимо подобрать подходящего размера корпус. Размер зависит от того, какую плату Arduino вы собираетесь использовать (UNO, Mini, Nano, или другую), а также от того, какого размера у вас ЖК-дисплей. Можно вместо ЖК дисплея использовать миниатюрный светодиодный индикатор на 3 символа. Этого будет вполне достаточно для отображения дистанции в сантиметрах, т.к. используемый ультразвуковой датчик имеет диапазон измерений от 3 до 400 см.

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

Я буду использовать в проекте Arduino Nano, и размещу его на макетной плате. На нижней части Arduino расположен кварцевый генератор. Он довольно высокий, поэтому я для него вырежу отверстие, иначе вся плата будет выступать и занимать гораздо больше места. Тут же на макетной плате будет размещён переменный резистор на 10 кОм.

Шаг 6: тестирование

Рисунок 10 – Скетч ProcessingРисунок 11 – Графический экран Processing

Подключите USB кабель Arduino к компьютеру.

Запустите “dual_sensor_echo_locator.pde”, нажав кнопку запуска вверху слева в Processing 3 IDE.

На вашем экране должны начать появляться числа, разделенные запятой (рисунок 10).

Сообщение об ошибке при запуске

При запуске может появиться сообщение об ошибке. Если это так, то измените в строке 88 (рисунок 10) на номер, связанный с вашим COM портом.

В зависимости от вашей системы могут быть указаны несколько COM портов. Один из номеров будет работать.

На рисунке 10 номер связан с моим «COM4»

Расположение датчиков

Расположите датчики на расстоянии 100 см друг от друга и 100 см от объекта, фронтальной стороной к нему.

Медленно поворачивайте оба датчика к диагонально противоположному углу воображаемого квадрата со стороной 1 метр.

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

Также, когда датчики захватят ваш объект, будут отображаться дополнительные данные (рисунок 11):

  • расстояние d1
  • расстояние d2
  • базовая линия (base)
  • смещение (offset)
  • полупериметр (s)
  • площадь (area)
  • координата X
  • координата Y

Разбор скетча

Ну что ж, пришло время разобрать скетч. Объяснять простые моменты я не буду, а постараюсь рассказать про интересные участки кода.

Рассмотрим самый интересный участок скетча, который и отвечает за работу проекта. Поделим этот участок кода на две части, которые вы можете увидеть выше. Рассмотрим каждую часть в отдельности.

1 часть кода Как вы видите, составляющим первой части кода является действие, которое называется условием. Мы указываем условие, при котором выполняются некоторые команды. Смысл этой команды такой: если расстояние, которое замерил дальномер, больше или равно минимальному значению (это минимальное значение мы задали в начале скетча) и меньше или равно максимальному значению (это максимальное значение мы также указали в начале скетча), то поворачиваем сервопривод на угол, вычисляющийся по формуле (10*(замеряемая длина — минимальное значение)).

2 часть кода Вторая часть кода продолжает первую часть… Иначе (при значении, не попадающим в указанный нами интервал), если замеренная датчиком длина меньше минимального значения, то сервопривод устанавливается в положение с углом поворота равным 0 градусов. Иначе сервопривод устанавливается в положение с максимальным углом поворота равным 180 градусов.

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

Улучшенная идея по калибровке датчиков используя известное расстояние

Одним из главных недостатков описанного метода является то, что мы предполагаем что на контакте Echo появляется низкий уровень сразу после того как передатчик передающего датчика излучил волну. Однако это не совсем так поскольку волне нужно время чтобы она «долетела» от передающего датчика до приемного. Следовательно, скорее всего, в результате этого метода передающий и приемный датчики не достигнут идеального синхронизма.

Чтобы преодолеть этот недостаток мы можем сначала откалибровать датчик используя известное расстояние – в этом случае мы можем точно определить время распространения волны от передающего датчика до приемного. Давайте обозначим это время как дельта D как показано на следующем рисунке.

Сборка: практические рекомендации

Структурная схема импульсного лазерного дальномера.

Чтобы изготовить дальномер своими руками можно за основу взять схему лазерной связи. В данном случае передача данных происходит очень быстро, скорость равна 10 Мбит. Такая величина соответствует имеющейся частоте модуляции.

Для такого лазерного устройства берется самый простой усилитель мощности. Он состоит из одной микросхемы 74HC04, которая собрана из шести инверторов. Подача тока ограничивается специальными резисторами. Однако умельцы могут заменить резисторы более надежными деталями.

Пусконаладочная плата становится источником 5-вольтового напряжения. Таким образом усилитель получает питание. Чтобы убрать наводки сигнала на другую часть электрической схемы, усилительный корпус делается стальным, каждый провод экранируется.

В качестве лазера выступает привод, установленный в DVD-приставках. Такое устройство имеет вполне достаточную мощность для функционирования на частоте, достигающей 10 МГц.

В состав приемника входит:

В состав усилителя входит полевой транзистор, специальная микросхема. Когда увеличивается расстояние, происходит падение освещенности фотодиода. Поэтому необходимо иметь мощное усиление. Собираемая схема позволяет достичь 4000 единиц.

Когда увеличивается частота, начинают уменьшаться сигналы фотодиода. Усилитель подобной конструкции является главной и сильно уязвимой частью. Его настройка требует очень высокой точности. Желательно отрегулировать коэффициент усиления таким образом, чтобы получать максимальные значения. Самым простым способом будет подача на транзистор 3 В. Можно установить обыкновенную батарейку.

Чтобы приемник начал работать, необходимо подать 12 В. Для этого устанавливается специальный блок питания.

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

Описанная выше система позволит создать самодельный лазерный дальномер в бытовых условиях.

Водонепроницаемый ультразвуковой датчик JSN SR-04T

JSN SR-04T представляет собой модуль водонепроницаемого ультразвукового датчика, который способен измерять расстояние на дистанциях 25-450 см с точностью 2 мм. Модуль датчика состоит из двух раздельных частей. Одна часть – это датчик, который непосредственно производит передачу и прием ультразвуковых волн, а вторая часть – это плата управления. По принципу действия JSN SR-04T очень похож на датчики парковки, которые устанавливаются в бамперах автомобилей.

Модуль датчика JSN SR-04T имеет водозащищенное исполнение датчика, отличается устойчивым функционированием в сложных условиях эксплуатации и высокой точностью измерения расстояния. Он может использоваться в системах дальнометрии, предотвращения столкновения с препятствиями, автоматизированного контроля, мониторинга движения объектов, контроля трафика, системах безопасности и искусственного интеллекта и многих других применениях.

Назначение контактов (распиновка) датчика JSN SR-04T представлены на следующих рисунке и таблице.

№ контакта Название контакта Назначение контакта
1 5V Напряжение питания
2 Trig Входной контакт датчика. На него необходимо подать импульс длительностью 10 мкс чтобы запустить датчик в работу (чтобы он начал излучение ультразвуковой волны).
3 Echo Выходной контакт датчика. После приема отраженной от препятствия ультразвуковой волны на этом контакте формируется импульс высокого уровня (high), длительность которого равна времени распространения ультразвуковой волны до препятствия и обратно.
4 Gnd Общий провод (земля)

Модуль датчика JSN SR-04T во многом похож на модуль ультразвукового датчика, но по сравнению с ним у него есть ряд преимуществ:

  • в отличие от HC-SR04 у модуля JSN SR-04T непосредственно датчик не распаян на печатной плате модуля, вместо этого он закреплен на конце достаточно длинного кабеля (2,5 метра), поэтому чувствительный элемент датчика может быть удален на значительное расстояние от платы управления;
  • чувствительный элемент датчика заключен в защищённый водонепроницаемый корпус, поэтому его можно размещать в жестких условиях эксплуатации и агрессивных средах.

Но несмотря на эти преимущества имеются и некоторые недостатки. К примеру, минимальное расстояние измерения у датчика JSN SR-04T составляет 20 см, в то время как у датчика HC-SR04 оно равно 2 см. Причина этого заключается в том, что JSN SR-04T имеет только один чувствительный элемент в то время как у датчика HC-SR04 их два – один используется для передачи ультразвуковых волн, а другой для приема. В результате этого чувствительному элементу датчика JSN SR-04T приходится переключаться двумя режимами (прием/передача), а на это требуется дополнительное время. Поэтому и минимальное расстояние измерения для датчика JSN SR-04T равно 20 см, а датчик HC-SR04 может измерять значительно меньшие расстояния благодаря наличию у него отдельных передатчика и приемника.

Основные технические характеристики и особенности датчика JSN SR-04T:

  • рабочее напряжение: DC 5V (постоянного тока);
  • ток в состоянии покоя (ожидания): 5mA;
  • ток в рабочем состоянии: 30mA;
  • частота ультразвуковой волны: 40 кГц;
  • диапазон измерения расстояний: от 25 см до 4,5 м;
  • длина кабеля: 2,5 метра.

Ремонт лазерного дальномера

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

В качестве первого пациента выступает дальномер Bosch DLE 50, с поврежденной фокусировкой луча в следствии падения со 2-го этажа. Вместо сконцентрированной точки, лазер принял форму фонарика с размытым пятном света. Измерительная способность устройства сократилась до 70 см, и при попытке измерения больших расстояний дисплей отображает ошибку “Error”. Задача заключается в калибровке фокусирующей линзы по отношению к измерительному каналу. Все элементы расположены внутри корпуса, поэтому разбирать необходимо.

Вполне вероятно, что производители модели Bosch DLE 50, исключили надобность в самостоятельном ремонте ещё на стадии проектирования. Корпус прибора, имеет всего 3 внешних резьбовых соединения (2 под батарейками и 1 на откидной скобе), в то время, как остальные элементы спаяны или приклеены. Разумеется, в гарантийном сервисе, разборка и сборка подобного монолита происходит без проблем, однако в быту этот процесс может вызвать затруднение. Потребуется паяльник, для отсоединения контактов питания, и термофен, для снятия приклеенной клавиатуры. Все соединительные элементы, представлены на приведенных ниже фотографиях, в порядке разборки инструмента.

Датчик уровня жидкости (Water Sensor Arduino)

Рабочее напряжение аналогового сенсора — 5v. Выходное напряжение (показания датчика) зависит от степени погружения датчика в жидкость и от параметров, влияющих на коэффициент передачи напряжения, например, проводимость жидкости. Это простой в использование и недорогой датчик уровня жидкости, который широко применяется в системах автоматизации и при разработке Умного дома.

Подключение к Ардуино датчика воды (Water Sensor)

Как вы уже заметили на фото к этому занятию, датчик уровня жидкости имеет три контакта. Правый контакт (-) подключается к Земле (GND), средний к питанию 5v, а левый к аналоговому входу, например, A0. При полностью сухом датчике выходное напряжение и показания на аналоговом входе будут равны нулю, чем больше датчик будет погружен в воду, тем больше будут его показания (от 0 до 1023).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector