Как сделать ультразвуковой дальномер на HC-SR04 и Arduino
Предлагается проект дальномера, основанного на ультразвуковом датчике HC-SR04 и Arduino. Показания датчика отображаются на жидкокристаллическом дисплее, а питание осуществляется от батареи на 9 вольт.
Для проекта нам понадобится:
- Arduino Nano или аналог;
- ультразвуковой дальномер HC-SR04;
- какой-нибудь миниатюрный дисплей, например, такой;
- корпус с отсеком для батареи типа «Крона»;
- монтажная печатная плата;
- тумблер включения;
- соединительные провода;
- термоусадочная изоляционная трубка;
- паяльник с принадлежностями для пайки.
1Сборка ультразвукового дальномера
Для начала, необходимо подобрать подходящего размера корпус. Размер зависит от того, какую плату Arduino вы собираетесь использовать (UNO, Mini, Nano, или другую), а также от того, какого размера у вас ЖК-дисплей. Можно вместо ЖК дисплея использовать миниатюрный светодиодный индикатор на 3 символа. Этого будет вполне достаточно для отображения дистанции в сантиметрах, т.к. используемый ультразвуковой датчик имеет диапазон измерений от 3 до 400 см.
Прикинем, как будут скомпонованы внутри корпуса детали. Вырежем отверстия под ультразвуковой датчик, под дисплей и под тумблер включения.
Я буду использовать в проекте Arduino Nano, и размещу его на макетной плате. На нижней части Arduino расположен кварцевый генератор. Он довольно высокий, поэтому я для него вырежу отверстие, иначе вся плата будет выступать и занимать гораздо больше места. Тут же на макетной плате будет размещён переменный резистор на 10 кОм.
2Электрическая схема ультразвукового дальномера
Теперь рассмотрим схему нашего прибора.
Питание осуществляется от батареи «Крона» 9 В. Тумблер S1 – для включения и выключения прибора. Жидкокристаллический индикатор (ЖКИ, LCD) подключается по стандартной схеме с потенциометром на 10 кОм для регулировки контрастности. И ЖКИ, и ультразвуковой датчик питаются от 5 В.
3Скетч Arduino для ультразвукового дальномера
Напишем скетч для нашего дальномера:
const int trigPin = 6; // вывод триггера датчика HC-SR04 const int echoPin = 5; // вывод приёмника датчика HC-SR04 #include <LiquidCrystal.h> // подключаем стандартную библиотеку LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //инициализация ЖКИ void setup() { pinMode(trigPin, OUTPUT); // триггер - выходной пин pinMode(echoPin, INPUT); // эхо - входной digitalWrite(trigPin, LOW); lcd.begin(16, 2); //задаём кол-во строк и символов в строке lcd.setCursor(10, 0); // выравниваем надпись по правому краю lcd.print("Dist:"); lcd.setCursor(14, 1); lcd.print("cm"); } void loop() { long distance = getDistance(); // получаем дистанцию с датчика lcd.setCursor(10, 1); lcd.print(" "); // очищаем ЖКИ от предыдущего значения lcd.setCursor(10, 1); lcd.print((String)distance); // выводим новую дистанцию delay(100); } // Определение дистанции до объекта в см long getDistance() { long distacne_cm = getEchoTiming() * 1.7 * 0.01; return distacne_cm; } // Определение времени задержки long getEchoTiming() { digitalWrite(trigPin, HIGH); // генерируем импульс запуска delayMicroseconds(10); digitalWrite(trigPin, LOW); // определение на пине echoPin длительности уровня HIGH, мкс: long duration = pulseIn(echoPin, HIGH); return duration; }
Тут всё просто. Сначала инициализируем ЖКИ на выводах 12, 11, 10, 9, 8 и 7 с помощью библиотеки LiquidCrystal из состава Arduino IDE. Далее привяжем выводы «триггер» и «эхо» дальномера к выводам 6 и 5 платы Arduino. Каждые 100 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.
У меня на LCD дисплее имеется дефект, и его левая половина почти не работает. Поэтому я вывожу надписи выровненными по правому краю.
После того как записали скетч в память Arduino, можем собирать прибор. Предлагаемая мной компоновка внутренностей показана на рисунке. Дисплей и датчик я закрепил с помощью термоклея. Он держит достаточно прочно, но при этом даёт возможность снять соединённые детали, если понадобится. Желательно всё разместить так, чтобы можно было подключиться к USB порту Arduino и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции. Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.
Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.
Но следует иметь в виду несколько важных замечаний при его использовании:
- Ультразвук лучше отражается от гладких поверхностей, чем от поглощающих (например, мягкого ковра). Поэтому следует выбирать место расположения дальномера при измерении так, чтобы напротив дальномера располагалась гладкая отражающая поверхность (например, стена).
- Показания прибора могут существенно отличаться в зависимости от угла направления на цель. Поэтому лучше всего провести несколько измерений, немного изменяя угол направления на цель, и взять среднее значение от всех измерений.
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 будет показывать расстояние более точно.
Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).
Поблагодарить автора:
Поделиться
Related items
4 comments
-
Вутшы Среда, 03 Апрель 2019 15:19 Ссылка на комментарий
Можно ли сделать поправку на длину корпуса? Что бы задней стенкой прикладывать....
-
aave1 Четверг, 04 Апрель 2019 22:05 Ссылка на комментарий
Конечно! Просто вычитайте длину корпуса из результата. Можно также вычитать длину корпуса прямо в скетче, тогда не придётся пересчитывать самому.
-
Андрей Воскреснье, 19 May 2019 12:27 Ссылка на комментарий
В схеме ошибка : провода на lcd1602 7,8,9,10 нужно соединить на 11,12,13,14 .
-
aave1 Воскреснье, 19 May 2019 22:14 Ссылка на комментарий
Андрей, в схеме всё верно. Пины, с которыми работает LCD, прописываются в секции инициализации скетча.