Рейтинг@Mail.ru
Макет ультразвукового дальномера на Arduino и HC-SR04
Макет ультразвукового дальномера на Arduino и HC-SR04

Как сделать ультразвуковой дальномер на HC-SR04 и Arduino

4 комментарии DIY
Print Friendly, PDF & Email

Предлагается проект дальномера, основанного на ультразвуковом датчике HC-SR04 и Arduino. Показания датчика отображаются на жидкокристаллическом дисплее, а питание осуществляется от батареи на 9 вольт.

Для проекта нам понадобится:

  • Arduino Nano или аналог;
  • ультразвуковой дальномер HC-SR04;
  • какой-нибудь миниатюрный дисплей, например, такой;
  • корпус с отсеком для батареи типа «Крона»;
  • монтажная печатная плата;
  • тумблер включения;
  • соединительные провода;
  • термоусадочная изоляционная трубка;
  • паяльник с принадлежностями для пайки.

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

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

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

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

2Электрическая схема ультразвукового дальномера

Теперь рассмотрим схему нашего прибора.

Схема ультразвукового дальномера с HC-SR04 и Arduino
Схема ультразвукового дальномера с HC-SR04 и Arduino

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

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

Ультразвуковой дальномер на HC-SR04 и Arduino
Последнее изменениеСреда, 10 Январь 2024 20:44 Прочитано 15537 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

4 комментарии

  • Вутшы
    Вутшы 03.04.2019 15:19 Комментировать

    Можно ли сделать поправку на длину корпуса? Что бы задней стенкой прикладывать....

  • aave1
    aave1 04.04.2019 22:05 Комментировать

    Конечно! Просто вычитайте длину корпуса из результата. Можно также вычитать длину корпуса прямо в скетче, тогда не придётся пересчитывать самому.

  • Андрей
    Андрей 19.05.2019 12:27 Комментировать

    В схеме ошибка : провода на lcd1602 7,8,9,10 нужно соединить на 11,12,13,14 .

  • aave1
    aave1 19.05.2019 22:14 Комментировать

    Андрей, в схеме всё верно. Пины, с которыми работает LCD, прописываются в секции инициализации скетча.