Ультразвуковий сенсор hc sr04. Підключення датчика HC-SR04 до Arduino

Нові статті

● Проект 23: Ультразвуковий датчик відстані HC-SR04. Принцип роботи, підключення, приклад

У цьому експерименті ми розглянемо ультразвуковий датчикдля вимірювання відстані та створимо проект виведення показань датчика на екран РКІ WH1602.

Необхідні компоненти:

Ультразвуковий далекомір HC-SR04 (рис. 23.1) - це поміщені на одну плату приймач та передавач ультразвукового сигналу. Випромінювач генерує сигнал, який, відбившись від перешкоди, потрапляє на приймач. Вимірявши час, за який сигнал проходить до об'єкта та назад, можна оцінити відстань. Крім самих приймача та передавача, на платі знаходиться ще й необхідна обв'язка, щоб зробити роботу з цим датчиком простою та зручною.

Характеристики ультразвукового далекоміра HC-SR04:

Вимірюваний діапазон - від 2 до 500 см;
. точність – 0,3 см;
. кут огляду -< 15°;
. напруга живлення – 5 В.

Датчик має 4 виводи стандарту 2,54 мм:

VCC – харчування +5 В;
. Trig(T) - виведення вхідного сигналу;
. Echo (R) - виведення вихідного сигналу;
. GND – земля.

Послідовність дій для отримання даних така:

Подаємо імпульс тривалістю 10 мкс на виведення Trig;
. всередині далекоміра вхідний імпульс перетворюється на 8 імпульсів частотою 40 кГц і посилається вперед через випромінювач T;
. дійшовши до перешкоди, надіслані імпульси відбиваються і приймаються приймачем R, в результаті отримуємо вихідний сигнал на виводі Echo;
. безпосередньо на стороні контролера переводимо отриманий сигнал у відстань за формулою:

Ширина імпульсу (мкс)/58 = дистанція (см);
- Ширина імпульсу (мкс) / 148 = дистанція (дюйм).

У нашому експерименті ми створимо звукову сигналізацію, яка буде включатися при наближенні до плати Arduino на відстань менше 1 м. Датчик розміщений на кронштейні серви, що обертається, і контролює простір з кутом огляду 180°. Якщо датчик виявляє об'єкт у радіусі 1 м, подається звуковий сигнална пьзоизлучатель, обертання серви припиняється. Схема сполуки елементів представлена ​​на рис. 23.2.

Мал. 23.2. Схема з'єднання елементів для звукової сигналізації

При написанні скетчу будемо використовувати бібліотеку Servo для роботи із сервоприводом та бібліотеку Ultrasonic.
Для роботи Arduinoз датчиком HC-SR04 є готова бібліотека – Ultrasonic.
Конструктор Ultrasonic приймає два параметри: номери пінів, до яких підключені висновки Trig та Echo, відповідно:

Ultrasonic ultrasonic(12,13);

Вміст скетчу показано у лістингу 23.1.

#include // Підключення бібліотеки Servo Servo servo1; const int pinServo=8; // пін для підключення сервоприводу int pos = 0; // Змінна для зберігання позиції сервоприводу int dir = 1; // Напрямок переміщення сервоприводу // Висновки для підключення HC-SR04 Trig – 12, Echo – 13 Ultrasonic ultrasonic ( 12 , 13 ) ; float dist_cm; // Змінна для дистанції, см // Підключити динамік до pin 9 int speakerPin = 9; void setup(){ // підключити змінну servo1 до виводу pinServo1 servo1.attach(pinServo1); pinMode(speakerPin, OUTPUT); ) void loop ()(servo1.write(pos); // Поворот сервоприводів на отриманий кут delay(15); // Пауза для очікування повороту сервоприводів float dist_cm = ultrasonic.Ranging(CM); if (dist_cm<100 && dist_cm>20) tone (speakerPin,); // Включити п'єзозуммер else (tone (speakerPin,0); // відключити п'єзозуммер pos=pos+dir; // Зміна змінної положення сервоприводу if (pos==0 || pos==180) dir=dir*(-1); // Зміна напрямку руху } }
Порядок підключення:

1. Закріплюємо датчик відстані HC-SR04 на сервоприводі.
2. Підключаємо датчик HC-SR04, п'єзозумер і сервопривід до плати Arduino за схемою на рис. 23.2.
3. Завантажуємо в плату Arduinoскетч із лістингу 23.1.
4. Спостерігаємо за циклічним переміщенням сервоприводу, при попаданні об'єкта в поле зору датчика HC-SR04 п'єзозумер видає сигнал, сервопривід зупиняється, при зникненні об'єкта з поля зору датчика сервопривід відновлює рух.

Лістинги програм

  • макетна плата (breadboard);
  • персональний комп'ютер із середовищем розробки Arduino IDE.
  • 1 Принцип діїультразвукового далекоміра HC-SR04

    Дія ультразвукового далекоміра HC-SR04 заснована на принципі ехолокації. Він випромінює звукові імпульси у простір і приймає відбитий від перешкоди сигнал. За часом поширення звукової хвилі до перешкоди і обернено визначається відстань до об'єкта.

    Запуск звукової хвилі починається з подачі позитивного імпульсу тривалістю щонайменше 10 мікросекунд на ніжку TRIGдалекоміра. Щойно імпульс закінчується, далекомір випромінює у простір собі пачку звукових імпульсів частотою 40 кГц. У цей же час на ніжці ECHOдалекоміра утворюється логічна одиниця. Як тільки датчик вловлює відбитий сигнал, на виведенні ECHO з'являється логічний нуль. По тривалості логічної одиниці на ніжці ECHO («Затримка відлуння» малюнку) визначається відстань до перешкоди.

    Діапазон вимірювання відстані далекоміра HC-SR04 - до 4 метрів з роздільною здатністю 0,3 см. Кут спостереження - 30 °, ефективний кут - 15 °. Струм споживання в режимі очікування 2 мА, при роботі – 15 мА.

    2 Схема підключеннядатчика відстані

    Живлення ультразвукового далекоміра здійснюється напругою +5 В. Два інші висновки підключаються до будь-яких цифрових портів Arduino, ми підключимо до 11 та 12.



    3 Отримання дистанції до об'єктаз датчика HC-SR04

    Тепер напишемо скетч, що визначає відстань до перешкоди та виводить його у послідовний порт. Спочатку задаємо номери висновків TRIG та ECHO - це 12 та 11 піни. Потім оголошуємо тригер як вихід, а луна - як вхід. Ініціалізуємо послідовний порт на швидкості 9600 бод. У кожному повторенні циклу loop()зчитуємо дистанцію та виводимо в порт.

    Const int trigPin = 12; const int echoPin = 11; void setup() ( pinMode(trigPin, OUTPUT); // Тригер - вихідний пін pinMode(echoPin, INPUT); // Відлуння - вхідний digitalWrite(trigPin, LOW); Serial.begin(9600); // ініціалізація послід. порту } void loop() ( long distance = getDistance(); // Отримуємо дистанцію з датчика Serial.println (distance); // Виводимо в послідовний порт delay (100); } // Визначення дистанції до об'єкта см long getDistance() ( long distacne_cm = getEchoTiming() * 1.7 * 0.01; return distacne_cm; } // Визначення часу затримки long getEchoTiming() ( digitalWrite(trigPin, HIGH); // генеруємо 10 мкс імпульс запуску delayMicroseconds(10); digitalWrite(trigPin, LOW); // Визначення на піні echoPin тривалості рівня HIGH, мкс: long duration = pulseIn(echoPin, HIGH); return duration; }

    Функція getEchoTiming()генерує імпульс запуску. Вона створює той 10-микросекундный імпульс, який є тригером для початку випромінювання далекоміром звукового пакета в простір. Далі вона запам'ятовує час від початку передачі звукової хвилі до приходу луни.

    Функція getDistance()розраховує дистанцію до об'єкта. З шкільного курсуфізики ми пам'ятаємо, що відстань дорівнює швидкість помножити на час: S = V×t Швидкість звуку в повітрі 340 м/сек, час у мікросекундах ми знаємо (змінна duration). Щоб отримати час durationв секундах, потрібно розділити його на 1 000 000. Оскільки звук проходить подвійне відстань - до об'єкта і назад - потрібно розділити результат навпіл. Ось і виходить, що відстань до об'єкту S = 34000 см/сек × тривалість / 1 000 000 сек / 2 = 1,7 см/сек / 100,що ми й написали у скетчі.

    Операцію множення мікроконтролер виконує швидше, ніж операцію поділу, тому :100 я замінив на еквівалентне ×0,01.

    4 Бібліотека для роботиз ехолокатором HC-SR04

    Також для роботи з ультразвуковим далекоміром написано безліч бібліотек. Наприклад, ось ця бібліотека Ultrasonic. Установка бібліотеки відбувається стандартно: завантажити, розархівувати у директорію /libraries/яка знаходиться в папці з Arduino IDE. Після цього бібліотекою можна скористатися.

    Встановивши бібліотеку, напишемо новий скетч.

    #include // Підключаємо бібліотеку 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);- дистанція відображатиметься у дюймах.

    5 Висновки щодо роботиіз сонаром HC-SR04

    Отже, ми з вами підключили Arduino ультразвуковий далекомір HC-SR04 та отримали з нього дані двома у різний спосіб: з використанням спеціальної бібліотеки та без.

    Перевага використання бібліотеки в тому, що кількість коду значно скорочується і покращується читання програми, вам не доводиться вникати в тонкощі роботи пристрою і ви відразу можете його використовувати. Але в цьому криється і недолік: ви гірше розумієте, як працює пристрій і які в ньому відбуваються процеси. У будь-якому випадку, яким способом користуватися вирішувати тільки вам.

    Придбати ультразвуковий далекомір за гарною ціною можна

    терморегулятор W1209 DC, Релейний модуль, датчик руху HC-SR501, Модуль Wi-Fi ESP8266-12E, датчик руху HC-SR501, Блок живлення, Мікросхема контролера колекторного електродвигуна, ІЧ-пульт дистанційного керування, Радіомодуль NRF24L01, OKI 120A2, SD Card Module, Мікросхема контролера колекторного електродвигуна, Модем M590E GSM GPRS, Годинник реального часу DS 3231/DS 1307, Mini 360 на схемі LM2596, L2 Інфрачервоні датчикивідстані, Годинник реального часу, HC-SR501, блок живлення Mini 360 на схемі LM2596, Контролер L298N, HC-SR501, GSM GPRS, Модем M590E GSM GPRS, Годинник реального часу DS 3231/DS 1307, Модуль Wi-Fi ESP Card Module, Блок живлення, Mini 360, L293D, блок живлення Mini 360 на схемі LM2596, Радіомодуль, ІЧ-пульт дистанційного керування, ІЧ-пульт, Ethernet shield, Мікросхема контролера колекторного електродвигуна, Мікросхема контролера колекторного електродвигуна SD Card Module, Радіомодуль NRF24L01, двигун OKI, L293D, Кроковий двигун, Блок живлення, L293D, блок живлення Mini 360 на схемі LM2596, Карта пам'яті SD, Ethernet shield, датчик руху HC-SR501, Модуль Wi-Fi ESP8266-12E, Кроковий двигун OKI 120A2, Кроковий двигун,

    Ультразвукові далекоміри HC-SR04

    Познайомимося з датчиками відстані, які стануть у нагоді в проектах, що розглядаються в наступних розділах. Ультразвуковий далекомір HC-SR04 - це поміщені на одну плату приймач та передавач ультразвукового сигналу. Крім самих приймача та передавача на платі знаходиться ще й необхідна обв'язка, щоб зробити роботу з цим датчиком простим і невимушеним.



    Датчик має низьке енергоспоживання, що також є важливою перевагою у випадку з мобільними роботами, не прив'язаними до розетки. Живиться датчик HC-SR04 від 5, що теж зручно при підключенні його до Arduino.

    Характеристики ультразвукового далекоміра HC-SR04:

    Вимірюваний діапазон - від 2-х до 500 см;

    Точність – 0,3 см;

    Кут огляду -< 15 °;

    Напруга живлення – 5 В.

    Датчик має 4 виводи стандарту 2,54 мм:

    VCC – харчування +5 В;

    Trig(T) - виведення вхідного сигналу;

    Echo (R) - виведення вихідного сигналу;

    GND – земля.

    Перевірка роботи датчика

    Залити програму

    Sketch code

    /* Скетч з бібліотекою NewPing, яка може використовуватись і для датчика HC-SR04

    наведеного тут SRF06 і дозволяє підключати ультразвукові датчики

    за допомогою одного піна на Arduino. Можна додатково підключити конденсатор на 0.1 мкФ до пін Ехо та Тригер на датчику.*/

    #include

    #define TRIGGER_PIN 12 / / Arduino pin необхідний trigger pin на ultrasonic sensor.
    #define ECHO_PIN 11 / / Arduino pin необхідний echo pin на ultrasonic sensor.
    #define MAX_DISTANCE 200 // Максимальна відстань, яку ми контролюємо (в сантиметрах). Максимальна відстань подібних датчиківзнаходиться у діапазоні 400-500см.

    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Налаштування пінів та максимальної відстані

    void setup() (
    Serial.begin(115200); // Відкриття серійного протоколу з частотою передачі 115200 біт/сек.
    }

    void loop() (
    delay(500); // Затримка 500 мілісекунд між генерацією хвиль. 29 мілісекунд – мінімально припустима затримка.
    unsigned int uS = sonar.ping(); // Генерація сигналу, отримання часу мікросекундах (uS).
    Serial.print("Ping:");
    Serial.print(us/US_ROUNDTRIP_CM); // Перетворення часу на відстань та відображення результату (0 відповідає виходу за допустимий діапазон)
    Serial.println("cm");
    }

    Відкрити монітор порту

    Принцип роботи ультразвукового далекоміра HC-SR04

    У складі далекоміра є два п'єзоелементи: один працює як випромінювач сигналу, інший - як приймач. Випромінювач генерує сигнал, який, відбившись від перешкоди, потрапляє на приймач. Вимірявши час, за який сигнал проходить до об'єкта та назад, можна оцінити відстань.

    Послідовність дій така:

    1. Подаємо імпульс тривалістю 10 мкс на виведення Trig.
    2. Всередині далекоміра вхідний імпульс перетворюється на 8 імпульсів частотою 40 кГц і посилається вперед через випромінювач T .
    3. Дійшовши до перешкоди, надіслані імпульси відбиваються і приймаються приймачем R , в результаті отримуємо вихідний сигнал на виведенні Echo.
    4. Безпосередньо на стороні контролера переводимо отриманий сигнал у відстань за формулою:

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

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

    Бібліотека Ultrasonic

    Для роботи Arduino з датчиком HC-SR04 є готова бібліотека Ultrasonic. Конструктор Ultrasonic приймає два параметри: номери пінів, до яких підключені висновки Trig та Echo відповідно:

    Ultrasonic ultrasonic(12,13);

    тут виведення датчика Trig підключений до 12-го піну Arduino, а Echo - до 13-го.

    Бібліотека має один метод Ranging, як параметр якого задається, у що перераховувати відстань до об'єкта: сантиметри або дюйми:

    #define CM 1

    #define INC 0

    Таким чином рядок ultrasonic.Randing (CM) поверне відстань до об'єкта (типу long) в сантиметрах.

    Файли бібліотеки ви можете знайти в папці libraries/Ultrasonic електронного архіву, що супроводжує книгу. Для використання бібліотеки у своїх проектах помістимо її в папку libraries каталогу установки Arduino.

    Скетч, що видає відстань до послідовного порту до об'єкта в сантиметрах, представлений у прикладі.

    Sketch code

    #include "Ultrasonic.h"

    // sensor connected to:

    // Trig - 12, Echo - 13 Ultrasonic ultrasonic (12, 13);

    Serial.begin(9600);

    float dist_cm = ultrasonic.Ranging(CM); Serial.println(dist_cm);

    Підключення датчика HC-SR04 до Arduino

    Ультразвуковий датчик HC-SR04 визначає відстань і виводить отримані значення у вікно серійного монітора середовище Arduino IDE.

    Невелика примітка: вільному доступііснує відмінна бібліотека NewPing, яка ще більше полегшує використання HC-SR04, приклад її використання також наведено нижче.// Генеруємо короткий LOW імпульс, щоб забезпечити чистий імпульс HIGH:

    digitalWrite(trigPin, LOW);

    delayMicroseconds(5);

    digitalWrite(trigPin, HIGH);

    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);

    // Зчитуємо дані з ультразвукового датчика: значення HIGH, яке

    // залежить від тривалості (у мікросекундах) між відправкою

    // акустичної хвилі та її зворотному прийомі на ехолокаторі.

    pinMode(echoPin, INPUT);

    duration = pulseIn(echoPin, HIGH);

    // Перетворення часу у відстань

    cm = (duration/2)/29.1;

    inches=(duration/2)/74;

    Serial.print(inches);

    Serial.print("in, ");

    Serial.print(cm);

    Serial.print("cm");

    Serial.println();

    Sketch code

    #include

    #define TRIGGER_PIN 12

    #define ECHO_PIN 11

    #define MAX_DISTANCE 200

    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Налаштування пінів та максимальної відстані.

    Serial.begin(9600);

    unsigned int uS = sonar.ping_cm();

    Serial.print(uS);

    Serial.println("cm");

    Якщо HC-SR04 не зчитує сигнал відлуння, вихідний сигнал ніколи не перетворюється на LOW. Датчики Devantec та Parallax забезпечують час затримки 36 мілісекунд 28 мілісекунд відповідно. Якщо ви використовуєте наведений вище скетч, програма «зависне» на 1 секунду. Тому бажано вказувати параметр затримки.

    Датчик HC-SR04 погано працює при вимірі відстаней понад 10 футів. Час повернення імпульсу становить близько 20 мілісекунд, так що рекомендується в таких випадках виставляти час затримки більше 20, наприклад, 25 або 30 мілісекунд.

    Можна підключити ультразвуковий датчик відстані HC-SR04 лише до одного піну Arduino. Для цього необхідно між пінами Тригера та Відлуння встановити резистор на 2.2 кОм і підключити до Arduino тільки пін Тригера.

    Вхідна напруга 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()); );// Виведення відстані (см) при температурі повітря, близько -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 .println("==================");

    Результат роботи обох прикладів:


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