Дальномер с помощью датчика hc-sr04 и arduino

Содержание:

Основы сборки дальномера

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Шаг 7. Установка программного обеспечения

Установите всё что нужно в следующем порядке, как написано ниже.

Arduino IDE

Загрузите и установите Arduino IDE (интегрированное окружение разработки), если еще не установлена. Скачать можно здесь.

Processing 3

Загрузите и установите «Processing 3» отсюда.

Передатчик акустического радара

Скопируйте содержимое файла ниже в «эскиз» Arduino, сохраните его, а затем загрузите в свой Arduino Uno R3:

Закройте Ardino IDE, но оставьте кабель USB подключенным.

Приемник акустического радара

Скопируйте содержимое файла ниже в скетч для «Processing 3» (может понадобиться переименовать расширение .ino в .pde):

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 и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции. Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.

Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.

Вариант компоновки ультразвукового дальномера Внешний вид готового ультразвукового дальномера

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

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

Подключение ультразвукового датчика к Arduino с помощью TinkerCad Circuits

С вашим основным пониманием того, как ультразвуковой датчик работает, теперь вы готовы к подключению устройства к Arduino. Чтобы изучить работу ультразвукового датчика, вы можете построить виртуальную функциональную схему с помощью TinkerCad Circuits.

TinkerCad Circuits является бесплатным онлайн-симулятором схем, который позволяет моделировать различные электрические и электронные схемы, прежде чем соединять их на реальной макетной плате. Вы даже можете протестировать проекты Arduino (в том числе код) с TinkerCad Circuits. Вы можете получить ценные знания в области электроники с помощью экспериментов до принятия решения о создании физической схемы.

На рисунке ниже показан проект функционального ультразвукового датчика Arduino, построенного с помощью TinkerCad Circuits.

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

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

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

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

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

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • датчик газа MQ2;
  • макетная плата;
  • светодиод;
  • резистор 220 Ом;
  • провода «папа-папа», «папа-мама».

Схема подключения датчика MQ2 к Ардуино Уно

Рассмотрим несколько вариантов кода для сенсора. Первый вариант — без библиотеки и еще два примера с библиотеками MQ2.h и TroykaMQ.h от Амперки. Обе библиотеки можно скачать на нашем сайте здесь

Обратите внимание, что при установке сразу двух библиотек будет происходить конфликт и Arduino IDE выдаст ошибку при компиляции. Загрузите первый пример, после сборки схемы, представленной на картинке выше

Скетч. Применяем датчик MQ2 без библиотеки

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода

int value;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(PIN_MQ2, INPUT);
}

void loop() {
   // записываем полученные данные с датчика
   value = analogRead(PIN_MQ2);

   // выводим информацию на монитор порта
   Serial.println("VALUE - " + String(value));
   Serial.println(" ");

   // включаем светодиод при превышении определенного значения
   if (value > 200) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

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

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

Датчик широкого спектра газов MQ-2 и Ардуино

Для следующего примера следует переключить пин A1 на логический порт сенсора газа (цифровой сигнал). Если вы используете датчик широкого спектра газов MQ-2 от компании Амперка, то подключите его к микроконтроллеру, согласно схеме. При этом у сенсора должен быть включен нагрев (замкнута перемычка на плате датчика). После подключения датчика к Arduino, загрузите следующую программу в плату.

Скетч. Подключение датчика с библиотекой MQ2.h

#include <MQ2.h>  // библиотека для датчика

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода
MQ2 mq2(PIN_MQ2);   // создаём объект для работы с датчиком

int lpg, co, smoke;

void setup() {
  Serial.begin(9600);
  mq2.begin();
  pinMode(LED, OUTPUT);
}

void loop() {
   float* values = mq2.read(true);

   // получаем информацию с датчика
   // выводим данные на монитор порта
   lpg = mq2.readLPG();
   co = mq2.readCO();
   smoke = mq2.readSmoke();
  
   // включаем светодиод при превышении концентрации CO
   if (co > 1000) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

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

  1. информация с датчика выводится на монитор порта Arduino IDE;
  2. порог включения светодиода можно изменить в операторе if и настроить программу на определение концентрации другого газа (в примере указан CO).

Скетч. MQ2 от Амперки с библиотекой TroykaMQ.h

#include <TroykaMQ.h>  // библиотека для датчика

#define PIN_MQ2  A1     // имя пина для подключения датчика
MQ2 mq2(PIN_MQ2);    // создаём объект для работы с датчиком

void setup() {
   Serial.begin(9600);
   // выполняем калибровку датчика
   mq2.calibrate();
   // выводим сопротивление датчика в чистом воздухе (Ro)
   Serial.println("Ro = " + String(mq2.getRo()));
}

void loop() {
   // выводим значения газов в ppm
   Serial.println("LPG: " + String(mq2.readLPG()) + " ppm");
   Serial.println("Methane: " + String(mq2.readMethane()) + " ppm");
   Serial.println("Smoke: " + String(mq2.readSmoke()) + " ppm");
   Serial.println("Hydrogen: " + String(mq2.readHydrogen()) + " ppm");

   Serial.println(" ");
   delay(200);
}

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

  1. в представленном примере информация по концентрации газов выводится в последовательный порт, без включения светодиода;
  2. сенсор должен находится в режиме постоянного нагрева (перемычка замкнута).

Шаг 3: теория

Рисунок 6 – Область обнаружения объектаРисунок 7 – Формулы

Диаграммы направленности лучей

На левом рисунке 6 выше показаны наложенные диаграммы направленности для преобразователя A и преобразователя B.

Датчик A получит эхо от любого объекта в «красной зоне».

Датчик B будет получать эхо, только если объект находится в «лиловой зоне». Вне этой зоны определить координаты объекта невозможно (целевая зона может быть полностью «освещена» звуком, если расположить датчики ниже базовой линии).

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

Расчеты

Что касается правого рисунка 7 выше.

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

\[площадь = основание \cdot высота/2 \qquad (1)\]

Преобразование уравнения (1) дает нам высоту (координату Y):

\[высота = площадь \cdot 2 / основание \qquad (2)\]

Пока всё хорошо… Но как мы вычислим площадь?

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

На рисунке 7 показано, как это сделать.

Преобразователь A посылает импульс, который отражается от объекта во всех направлениях. Этот импульс слышат оба преобразователя, и A, и B. Преобразователь B не передает импульсов, он только слушает.

Обратный путь к преобразователю A показан красным цветом. Если разделить его на два и учесть скорость звука, мы можем рассчитать расстояние d1 с помощью формулы:

\[d1 _{(см)} = время_{(микросекунды)}/59 \qquad (3)\]

Значение 59 для константы получается следующим образом:

  • Скорость звука составляет примерно 340 м/с, что составляет 0,034 см/мкс (сантиметр/микросекунда).
  • Обратное значение 0,034 см/мкс составляет 29,412 мкс/см, которое при умножении на 2 (чтобы получить длину обратного пути) дает в результате 58,824 или 59 при округлении.
  • Это значение можно подстроить вверх/вниз, чтобы учесть температуру, влажность и давление воздуха.

Путь к преобразователю B показан синим цветом. Если из этого пути вычесть расстояние d1, мы получим расстояние d2. Формула для d2 будет следующей:

\[d2 _{(см)} = время_{(микросекунды)}/29,5 — d1 \qquad (4)\]

Величина 29,5 для константы получается следующим образом:

Тут нет обратного пути, поэтому мы используем 29,5, что является половиной значения, используемого в формуле (3) выше.

Теперь у нас есть длины всех сторон треугольника ABC… погуглите «Герон».

Формула Герона

Формула Герона использует нечто, называемое «полу-периметром», в который вы добавляете каждую из трех сторон треугольника и делите результат на два:

\[s = (a + b + c)/2 \qquad (5)\]

Теперь полощадь может быть рассчитана по следующей формуле:

\

Как только мы узнаем эту площадь, мы сможем вычислить высоту (координату Y) из формулы (2) выше.

Теорема Пифагора

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

\

Исходный код программы

Код программы для приемной части

Arduino

const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance, Pdistance;
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
Pdistance=distance;
Calc();
distance= duration*0.034;
if (Pdistance==distance || Pdistance==distance+1 || Pdistance==distance-1 )
{
Serial.print(«Measured Distance: «);
Serial.println(distance/2);
}
//Serial.print(«Distance: «);
//Serial.println(distance/2);
delay(500);
}
void Calc()
{
duration=0;
Trigger_US();
while (digitalRead(echoPin)==HIGH);
delay(2);
Trigger_US();
duration = pulseIn(echoPin, HIGH);
}
void Trigger_US()
{
// Fake trigger the US sensor
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

constinttrigPin=9;

constintechoPin=10;

// defines variables

longduration;

intdistance,Pdistance;

voidsetup(){

pinMode(trigPin,OUTPUT);// Sets the trigPin as an Output

pinMode(echoPin,INPUT);// Sets the echoPin as an Input

Serial.begin(9600);// Starts the serial communication

}

voidloop(){

Pdistance=distance;

Calc();

distance=duration*0.034;

if(Pdistance==distance||Pdistance==distance+1||Pdistance==distance-1)

{

Serial.print(«Measured Distance: «);

Serial.println(distance2);

}
//Serial.print(«Distance: «);
//Serial.println(distance/2);

delay(500);

}

voidCalc()

{

duration=;

Trigger_US();

while(digitalRead(echoPin)==HIGH);

delay(2);

Trigger_US();

duration=pulseIn(echoPin,HIGH);

}

voidTrigger_US()

{
// Fake trigger the US sensor

digitalWrite(trigPin,HIGH);

delayMicroseconds(10);

digitalWrite(trigPin,LOW);

}

Код программы для передающей части

Arduino

// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
delay(2);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

// defines pins numbers

constinttrigPin=9;

constintechoPin=10;

// defines variables

longduration;

intdistance;

voidsetup(){

pinMode(trigPin,OUTPUT);// Sets the trigPin as an Output

pinMode(echoPin,INPUT);// Sets the echoPin as an Input

Serial.begin(9600);// Starts the serial communication

}

voidloop(){

// Sets the trigPin on HIGH state for 10 micro seconds

digitalWrite(trigPin,HIGH);

delayMicroseconds(10);

digitalWrite(trigPin,LOW);

delay(2);

}

Выбор дальномера для подключения к arduino

Для определения расстояния есть несколько способов – инфракрасный датчик приближения, лазерный дальномер и ультразвуковой дальномер. Возможно, есть еще какие-то варианты, но я их сходу не нашел. Поэтому выбирал из трех вариантов. Датчик приближения был сразу забракован, поскольку он не умеет измерять, а только настраивается на определение конкретных расстояний. Лазерный датчик умеет делать измерения и довольно точно, но стоит он не мало, из-за этого выбор был остановлен на ультразвуковом датчике, который стоит в 8-10 раз дешевле лазерного, а точность измерения отличается не на много.
Очевидно, что выбор пал на более дешевый датчик HC-SR04, который стоит 50 руб и способен измерять расстояние от 2 до 400 см с точностью до 3 мм, а эффективный угол наблюдения 15 градусов.

Датчик расстояния в проектах Arduino

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

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

Описание датчика HC SR04

Ультразвуковой дальномер HC SR04 имеет такие технические параметры:

  • Питающее напряжение 5В;
  • Рабочий параметр силы т ока – 15 мА;
  • Сила тока в пассивном состоянии < 2 мА;
  • Обзорный угол – 15°;
  • Сенсорное разрешение – 0,3 см;
  • Измерительный угол – 30°;
  • Ширина импульса – 10-6 с.

Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):

  • Контакт питания положительного типа – +5В;
  • Trig (Т) – выход сигнала входа;
  • Echo (R) – вывод сигнала выхода;
  • GND – вывод «Земля».

Схема взаимодействия с Arduino

Для получения данных, необходимо выполнить такую последовательность действий:

  • Подать на выход Trig импульс длительностью 10 микросек;
  • В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
  • Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
  • На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.

При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.

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

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

Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:

Библиотека для работы с HC SR04

Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.

К особенностям библиотеки можно отнести:

  • Возможность работы с различными ультразвуковыми датчиками;
  • Может работать с датчиком расстояния всего через один пин;
  • Отсутствие отставания на 1 секунду при отсутствии пинга эха;
  • Для простой коррекции ошибок есть встроенный цифровой фильтр;
  • Максимально точный расчет расстояния.

Скачать бибилотеку NewPing можно здесь

Точность измерения расстояния датчиком HC SR04

Точность датчика зависит от нескольких факторов:

  • температуры и влажности воздуха;
  • расстояния до объекта;
  • расположения относительно датчика (согласно диаграммы излучения);
  • качества исполнения элементов модуля датчика.

В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.

Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.

Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря,  “глазки” HC-SR04 должны смотреть прямо на предмет.

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

  • усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
  • с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
  • датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.

Исходный код программы

В представленном участке кода мы производим измерение времени с помощью функции pulseIn(pin). Затем после выполнения необходимых вычислений мы показываем результат на ЖК дисплее 16×2.

Далее приведен полный текст программы.

Arduino

#include <LiquidCrystal.h> //подключаем библиотеку для работы с ЖК дисплеем
#define trigger 18
#define echo 19

LiquidCrystal lcd(2,3,4,5,6,7); // контакты, к которым подключен ЖК дисплей

float time=0,distance=0;

void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT); //на вывод данных
pinMode(echo,INPUT); // на ввод данных
lcd.print(» Ultra sonic»);
lcd.setCursor(0,1);
lcd.print(«Distance Meter»);
delay(2000);
lcd.clear();
lcd.print(» Circuit Digest»);
delay(2000);
}

void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10); // импульс длительностью 10 мкс чтобы запустить ультразвуковой датчик в работу
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH); // считываем время (третий график на временных диаграммах в тексте статьи
distance=time*340/20000; // пересчитываем время в расстояние
lcd.clear();
lcd.print(«Distance:»);
lcd.print(distance);
lcd.print(«cm»);
lcd.setCursor(0,1);
lcd.print(«Distance:»);
lcd.print(distance/100); // выводим значение расстояния на экран ЖК дисплея
lcd.print(«m»);
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

#include <LiquidCrystal.h> //подключаем библиотеку для работы с ЖК дисплеем
#define trigger 18
#define echo 19

LiquidCrystallcd(2,3,4,5,6,7);// контакты, к которым подключен ЖК дисплей

floattime=,distance=;

voidsetup()

{

lcd.begin(16,2);

pinMode(trigger,OUTPUT);//на вывод данных

pinMode(echo,INPUT);// на ввод данных

lcd.print(» Ultra sonic»);

lcd.setCursor(,1);

lcd.print(«Distance Meter»);

delay(2000);

lcd.clear();

lcd.print(» Circuit Digest»);

delay(2000);

}

voidloop()

{

lcd.clear();

digitalWrite(trigger,LOW);

delayMicroseconds(2);

digitalWrite(trigger,HIGH);

delayMicroseconds(10);// импульс длительностью 10 мкс чтобы запустить ультразвуковой датчик в работу

digitalWrite(trigger,LOW);

delayMicroseconds(2);

time=pulseIn(echo,HIGH);// считываем время (третий график на временных диаграммах в тексте статьи

distance=time*34020000;// пересчитываем время в расстояние

lcd.clear();

lcd.print(«Distance:»);

lcd.print(distance);

lcd.print(«cm»);

lcd.setCursor(,1);

lcd.print(«Distance:»);

lcd.print(distance100);// выводим значение расстояния на экран ЖК дисплея

lcd.print(«m»);

delay(1000);

}

Схема подключения HC-SR04 к Arduino

Подключение ультразвукового датчика расстояния HC-SR04 к Arduino достаточно просто. Схема подключения показана на рисунке.Контакт земли подключаем к выводу GND на плате Arduino, вывод питания соединяем с 5V. Trig и Echo подсоединяем к цифровым пинам платы.

Arduino HC-SR04
VCC Vcc
13 Trig
12 Echo
GND Gnd

Пример скетча

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

#define ECHO_PIN 12
#define TRIG_PIN 13

void setup() {
/*
задаем скорость общения с компьютером
*/
Serial.begin (9600);
/*
инициируем как выход TRIG пин
*/
pinMode(TRIG_PIN, OUTPUT);
/*
инициируем как вход ECHO пин
*/
pinMode(ECHO_PIN, INPUT);
}

void loop() {
int duration, cm;
/*
для большей точности установим значение LOW на пине Trig
*/
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
/*
установим высокий уровень на пине Trig
*/
digitalWrite(TRIG_PIN, HIGH);
/*
Подождем 10 μs
*/
delayMicroseconds(10);
/*
установим низкий уровень на пине Trig
*/
digitalWrite(TRIG_PIN, LOW);
/*
Узнаем длительность высокого сигнала на пине Echo
*/
duration = pulseIn(ECHO_PIN, HIGH, 30000);
/*
Рассчитаем расстояние в сантиметрах
*/
cm = duration / 58;
/*
Отправляем полученные данные на компьютер
*/
Serial.print(cm);
Serial.println(» cm»);
/*
Ждём четверть секунды и повторяем снова
*/
delay(250);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

#define ECHO_PIN  12
#define TRIG_PIN  13
 

voidsetup(){

/*

    задаем скорость общения с компьютером
  */

Serial.begin(9600);

/*

    инициируем как выход TRIG пин
  */

pinMode(TRIG_PIN,OUTPUT);

/*

    инициируем как вход ECHO пин
  */

pinMode(ECHO_PIN,INPUT);

}
 

voidloop(){

intduration,cm;

/*

    для большей точности установим значение LOW на пине Trig
  */

digitalWrite(TRIG_PIN,LOW);

delayMicroseconds(2);

/*

    установим высокий уровень на пине Trig
  */

digitalWrite(TRIG_PIN,HIGH);

/*

    Подождем 10 μs
  */

delayMicroseconds(10);

/*

    установим низкий уровень на пине Trig
  */

digitalWrite(TRIG_PIN,LOW);

/*

    Узнаем длительность высокого сигнала на пине Echo
  */

duration=pulseIn(ECHO_PIN,HIGH,30000);

/*

    Рассчитаем расстояние в сантиметрах
  */

cm=duration58;

/*

    Отправляем полученные данные на компьютер
  */

Serial.print(cm);

Serial.println(» cm»);

/*

    Ждём четверть секунды и повторяем снова
  */

delay(250);

}

Ультразвуковой датчик и светодиод Ардуино

Представленный скетч работает без библиотеки, поэтому в коде многовато строчек. Мы воспользуемся библиотекой для ультразвуковых дальномеров, что позволит нам значительно упростить скетч. Для начала установите библиотеку Ultrasonic (инструкция по установке библиотек в Arduino IDE) и загрузите следующую программу в Ардуино. Ссылка на скачивание архива со скетчами и библиотекой Ultrasonic.h — здесь.

Подключите дополнительно к плате RGB светодиод или несколько светодиодов, для создания мини проекта. Цвета светодиода будут переключаться, в зависимости от расстояния от датчика расстояния до предмета. Для управления светодиодами от УЗ датчика в программе используется условные операторы if. После сборки схемы, как на картинке выше, загрузите в микроконтроллер следующую программу.

Скетч с использованием библиотеки Ultrasonic.h

#include <Ultrasonic.h>    // подключаем библиотеку Ultrasonic
Ultrasonic ultrasonic(8,9); // назначаем выходы для Trig и Echo
 
void setup() {
  Serial.begin(9600);        // подключаем монитор порта
  pinMode (11, OUTPUT); // подключаем к пину светодиод
  pinMode (12, OUTPUT); // подключаем к пину светодиод
}

void loop () {
  int dist = ultrasonic.Ranging(CM);
  Serial.print(dist);     // выводим расстояние в сантиметрах
  Serial.println(" cm");

  // переключаем цвета светодиода
  if (dist < 50) {digitalWrite(12,0); digitalWrite(11,1);}
  if (dist < 50) {digitalWrite(12,1); digitalWrite(11,0);}

  delay(100);
}
Добавить комментарий

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

Adblock
detector