Контакти

Ардуіно: ультразвуковий далекомір HC-SR04. Ультразвуковий далекомір hc-sr04 - вимірювальна техніка - Інструменти Ультразвуковий далекомір на мікроконтролері своїми руками схема

Bruno Gavand

Проект, в якому розглядається просте і дешеве рішення ультразвукового сенсора для вимірювання відстані, виконаний на базі мікроконтролера PIC16F877A компанії, але користувачами вихідний код може бути адаптований під інші мікроконтролери. Сенсор може бути вбудований в призначені для користувача розробки та пристрої: детектори присутності, роботи, автомобільні системи парковки, пристрої вимірювання відстані та ін.

Відмітні особливості:

  • невелика кількість зовнішніх компонентів;
  • розмір коду 200 Байт;
  • діапазон робочих відстаней: 30 см - 200 см;
  • точність вимірювань ± 1 см;
  • індикація при виході за межі вимірювань.

Як відомо, швидкість звуку в повітрі дорівнює близько 340 м / с. Таким чином, принцип ультразвукового сенсора полягає в посилці ультразвукової імпульсу частотою 40 кГц і відстеження відбитого сигналу (луна). Звичайно, звуку ви не почуєте, але ультразвуковий датчик здатний визначити відбитий імпульс. Отже, знаючи час проходження імпульсу і відбитого ультразвукового сигналу, ми зможемо отримати відстань. Розділивши на два, ми отримаємо відстань від ультразвукового датчика до першої перешкоди, від якого був відображений сигнал.

У пристрої застосований пьезокерамический ультразвуковий випромінювач MA40B8S і пьезокерамический ультразвуковий датчик MA40B8R відкритого типу. Основні параметри наведені в таблиці нижче.

Пристрій призначення частота спрямованість,
град
ємність,
пФ
область
детектування,
м
вхідний
напруга,
макс, В
MA40B8S випромінювач 40 кГц 50 (симетричний) 2000 0.2 … 6 40
MA40B8R датчик 40 кГц 50 (симетричний) 2000 0.2 … 6

Для тестування була застосована отладочная платформа компанії.

Однак користувач може використовувати будь-який мікроконтролер PIC, У якого є хоча б один канал АЦП і один канал ШІМ.

Принципова схема ультразвукового сенсора

Управління випромінювачем здійснюється за допомогою транзистора BD135. Діод 1N4007 служить для захисту транзистора від зворотного напруги. Завдяки використанню транзистора і резонансної ланцюжка, яка утворена паралельним включенням дроселя L1 330 мкГн і конденсатора, утвореного самим випромінювачем, напруга живлення випромінювача складе близько 20 В, що забезпечує дальність виявлення до 200 см. Варто зауважити, що управляти випромінювачем можливо безпосередньо з виведення мікроконтролера, однак в такому випадку діапазон відстаней не перевищує 50 см.

Датчик підключений безпосередньо до АЦП мікроконтролера (при використанні PIC16F877A - канал 1 АЦП), резистор, включений паралельно датчику, необхідний для узгодження імпедансу.

Для початку необхідно надіслати ультразвуковий імпульс. Сигнал з частотою 40 кГц легко отримати з використанням апаратного ШІМ мікроконтролера. Відбитий сигнал з датчика надходить в АЦП, дозвіл АЦП становить 4 мВ, що цілком достатньо для зчитування даних з датчика, і додаткові компоненти не потрібні.

Зовнішній вигляд макетної плати ультразвукового сенсора


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

Написи на зображенні:

ultrasonic burst - ультразвуковий імпульс;
mechanical echo (removed by software) - механічне відлуння (виключається програмно);
ultrasonic wave reflected by remote object - ультразвукова хвиля, відбита від віддаленого об'єкта.

Ціна поділки осцилографа: по горизонталі - 1 мс / справ, по вертикалі - 5 мВ / справ.

Механічне відлуння виключається програмно шляхом введення затримки. Відбита хвиля, що має амплітуду близько 40 мВ, отримана через 9.5 мс після відправленого імпульсу. З огляду на, що швидкість звуку 340 м / с, отримуємо:

0.0095 / 2 × 340 \u003d 1.615 м.

У реальності - це була стеля приміщення на відстані від датчика 172 см, на ЖК дисплеї, встановленому на отладочной платі було відображено значення 170 см.

завантаження

Вихідний код до проекту на мікроконтролері PIC16F877A (компілятор mikroC) -

Деякі зауваження:
Всі деталі, потрібні для створення ультразвукового далекоміра за цією схемою продаються в чіпідіпе, коштує близько 500-900р за все (точно не пам'ятаю - грошей багато було, не рахував :-). (Корпус, пищалки, роз'єми інше)
Деякі коментарі за схемою ультразвукового далекоміра:
1. Пищалки можна юзати будь-які, під різні завдання краще різні ... для мого завдання - чим болше габарити тим краще, кут 50.
2. Можна спробувати використовувати тільки одну відносно дорогу AD822 а на місце компаратора чогось нитка по дешевше (у мене просто не було нічого іншого під рукою взагалі)
3. У меге для генерації 40 кілогерц можна використовувати таймер, для цього потрібно підібрати інший резонатор. (У мене були тільки 16 і 12 .. вони не підходять)
4. Швидкість звуку в повітрі взагалі-то залежить від температури - якщо дуже важлива точність (мені вона пофігу) то зважай це
5. Заметь- що на зображенні далекоміра в корпусі - пищалки не стосуються пластмаси - один чол говорив, що при мегаточной настройки ( дана схема здатна і на таке) звук від пищалки до мікрофона буде передаватися по корпусу, з цього краще перестрахуватися
6. Приклад найпростішої прошивки меги на си (під цю схему) можна подивитися
7. Программатор краще використовувати STK200 / 300 він же avreal - софт і схему можна смикнути
8. По розуму в прошивці треба відстежувати і початок і кінець "пачки", в прикладі тільки початок (точність виросте конкретно) .. може допишу - викладу.
9. Пищалка дуже любить 40кГц - трохи в сторону вже зовсім не те ... напевно правду в мануалі пишуть, що резонансна :-)
10. НА схемою неспроста в випромінювачі понапіхано транзистори - бажаючим дати більше вольт ніж 12 - велком - один чол говорив, що буде пищати голосніше (вважай далі). Я цього робити не став з трьох причин: по-перше 24 вольта ще десь знайти треба, по-друге текущаа версія при соотв налаштування різістора тож бачить стіну за 4 метри, тобто мені не де відчувати його, та й не потрібно. Ну а третя причина цей же чол говорив, що пищалки мають тенденцію вмирати на цьому вольтажі
11. Загальний рада: можна знайти все резистори і конденсатори в неробочому блоці живлення від компа ATX (вони там всі десь 1/8 вата) - грошей зекономиш!
12. Хибна думка, що ультразвук видається пищалкой якось можуть почути Собик і інші тварини, він на них погано впливає: у мене собака прийшла як то вночі і заснула навпаки пищалки включеною.
13. Ще - так просто до відома - меги та інші 8бітних контролери від Атмел - женуться відмінно .. у мене в деяких завданнях замість покладених 16 працюють на 24 і нормально.
14. При устрановке R5 вище кілоомах (10, 50, 100) вийде дуже велике посилення, і швидше за все знадобляться рупора, зате дальність вимірювань сильно виросте.
15. Замість устрановкі рупорів (при великому R5) см. Вище, можна модернізувати прошивку, що б вона не чекала в початковий момент часу корисний сигнал. Але тоді не можна буде міряти відстані близько 10 см і менше.

Коментраій до ради 8 - жовтим позначений момент спрацьовування переривання МК ультразвукового далекоміра на прийомі, власне можна обмежиться саме цим першим моментом, почекати трохи і робити наступне вимір, генерітся следущую пачку імпульсів - а час польоту звуку вважати часом від першого посланого імпульсу (або останнього не суть важливо) до ПЕРШОГО прийнятого.
Другий варіант - позначений червоним - більш точний - оскільки пачка імпульсів як правило доходить аж ніяк не в ідеальному вигляді і не повністю (може не бути пари трійки перших або останніх імпульсів), собствено навіть на зображенні видно, що вона "сплющилася" по краях, хоча вирушав ідеальний прямокутник імпульсів - так ось: суть в тому, що середина пачки повинна залишатися на місці не дивлячись на те, що краї її вже можуть не відчути компаратором. Так що точність в кілька .. (міліметрів треба думати) залежить від того враховувалася в прошивці ультразвукового далекоміра середина або тільки початок пачки при прийомі її назад.

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

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

Увага! Так як в основу принципу дії покладено ультразвук, то такий датчик не підходить для визначення відстані до звукопоглинальних об'єктів. Оптимальними для вимірювання є предмети з рівною гладкою поверхнею.

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

Датчик відстані Ардуіно є приладом безконтактного типу, і забезпечує високоточне вимірювання і стабільність. Діапазон дальності його вимірювання складає від 2 до 400 см. На його роботу не робить істотного впливу електромагнітні випромінювання і сонячна енергія. У комплект модуля з HC SR04 arduino також входять ресивер і трансмітер.

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

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

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

  • Контакт харчування позитивного типу - +5 В;
  • Trig (Т) - вихід сигналу входу;
  • Echo (R) - висновок сигналу виходу;
  • GND - висновок «Земля».

Де купити модуль SR04 для Ардуіно

Датчик відстані - досить поширений компонент і його легко можна знайти в інтернет-магазинах. Найдешевші варіанти (від 40-60 рублів за штуку), традиційно на всім відомому сайті.

Модуль датчика відстані HC-SR04 для Ардуіно Ще один варіант ультразвукового сенсора HC-SR04 у надійного постачальника
Датчики відстані SR05 Ultrasonic HC-SR05 (поліпшені характеристики) Модуль HC-SR05 HY-SRF05 для UNO R3 MEGA2560 DUE від надійного постачальника

Схема взаємодії з 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 повинні дивитися прямо на предмет.

Для зменшення помилок і похибки вимірювань зазвичай виконуються наступні дії:

  • усереднюються значення (кілька разів заміряємо, прибираємо сплески, потім знаходимо середнє);
  • за допомогою датчиків (наприклад,) визначається температура і вносяться поправочні коефіцієнти;
  • датчик встановлюється на серводвигун, за допомогою якого ми "повертаємо голову", переміщаючи діаграму спрямованості вліво або вправо.

Приклади використання сенсора відстані

Давайте розглянемо приклад простого проекту з платою Arduino Uno і датчиком відстані HC SR04. У скетчі ми будемо отримувати значення відстані до предметів і виводити їх в монітор порту в середовищі Arduino IDE. Ви зможете легко змінити скетч і схему підключення, щоб датчик сигналізував про наближення або віддаленні предмета.

Підключення датчика до Ардуіно

При написанні скетчу використовувалася наступний варіант терморегулятори підключення датчика:

  • VCC: + 5V
  • Trig - 12 пін
  • Echo - 11 пін
  • Земля (GND) - Земля (GND)

приклад скетчу

Почнемо роботу з датчиком відразу з відносного складного варіанта - без використання зовнішніх бібліотек.

В даному скетчі ми виконуємо таку послідовність дій:

  • Коротким імпульсом (2-5 мікросекунди) переводимо датчик відстані в режим ехолокації, при якому в навколишній простір висилаються ультразвукові хвилі з частотою 40 КГц.
  • Чекаємо, поки датчик проаналізує відбиті сигнали і по затримці визначить відстань.
  • Отримуємо значення відстані. Для цього чекаємо, поки HC SR04 видасть на вході ECHO імпульс, пропорційний відстані. Ми визначаємо тривалість імпульсу за допомогою функції pulseIn, яка поверне нам час, що минув до зміни рівня сигналу (в нашому випадку, до появи зворотного фронту імпульсу).
  • Отримавши час, ми переводимо його в відстань в сантиметрах шляхом ділення значення на константу (для датчика SR04 це 29.1 для сигналу «туди», стільки ж для сигналу «назад», що в сумі дасть 58.2).

Якщо датчик відстані не виконує зчитування сигналу, то перетворення вихідного сигналу ніколи не прийме значення короткого імпульсу - LOW. Так як у деяких датчиків час затримки варіюється в залежності від виробника, рекомендується при використанні зазначених скетчів виставляти його значення вручну (ми це робимо на початку циклу).

Якщо відстань становить понад 3 метрів, при якому HC SR04 починає погано працювати, час затримки краще виставляти більше 20 мс, тобто 25 або 30 мс.

#define PIN_TRIG 12 #define PIN_ECHO 11 long duration, cm; void setup () (// ініціалізувавши взаємодія по послідовному порту Serial.begin (9600); // Визначаємо вводи і висновки pinMode (PIN_TRIG, OUTPUT); pinMode (PIN_ECHO, INPUT);) void loop () (// Спочатку генеруємо короткий імпульс тривалістю 2-5 мікросекунд. digitalWrite (PIN_TRIG, LOW); delayMicroseconds (5); digitalWrite (PIN_TRIG, HIGH); // Виставивши високий рівень сигналу, чекаємо близько 10 мікросекунд. У цей момент датчик буде посилати сигнали з частотою 40 КГц. delayMicroseconds (10); digitalWrite (PIN_TRIG, LOW); // Час затримки акустичного сигналу на Ехолокатори. duration \u003d pulseIn (PIN_ECHO, HIGH); // Тепер залишилося перетворити час в відстань cm \u003d (duration / 2) / 29.1; Serial.print ( "Відстань до об'єкта:"); Serial.print (cm); Serial.println ( "см."); // Затримка між вимірами для коректної роботи скеча delay (250); )

Скетч з використанням бібліотеки NewPing

Тепер давайте розглянемо варіант скетчу з використанням бібліотеки NewPing. Код істотно спроститься, тому що всі описані раніше дії заховані усередині бібліотеки. Все, що нам потрібно зробити - створити об'єкт класу NewPing, вказавши Піни, за допомогою яких ми підключаємо датчик відстані і використовувати методи об'єкта. У нашому прикладі для отримання відстані в сантиметрах потрібно використовувати ping_cm ().

#include #define PIN_TRIG 12 #define PIN_ECHO 11 #define MAX_DISTANCE 200 // Константа для визначення максимальної відстані, яку ми будемо вважати коректним. // Створюємо об'єкт, методами якого будемо потім користуватися для отримання відстані. // Як параметри передаємо номера пинов, до яких підключені виходи ECHO і TRIG датчика NewPing sonar (PIN_TRIG, PIN_ECHO, MAX_DISTANCE); void setup () (// ініціалізувавши взаємодія по послідовному порту на швидкості 9600 Serial.begin (9600);) void loop () (// Стартова затримка, необхідна для коректної роботи. delay (50); // Отримуємо значення від датчика відстані і зберігаємо його в змінну unsigned int distance \u003d sonar.ping_cm (); // Друкуємо відстань в моніторі порту Serial.print (distance); Serial.println ( "см");)

Приклад підключення ультразвукового далекоміра HC SR04 з одним піном

Підключення HC-SR04 до Arduino може бути виконано за допомогою використання одного Піна. Такий варіант стане в нагоді, якщо ви працюєте з великим проектом і вам не вистачає вільних пинов. Для підключення вам потрібно просто встановити між контактами TRIGі ECHO резистор номіналом 2.2K і підключити до Ардуіно контакт TRIG.

#include #define PIN_PING 12 // Пін з Arduino з'єднаний з пинами trigger і echo на датчику відстані #define MAX_DISTANCE 200 // Максимальна відстань, яку ми здатні контролювати (400-500см). NewPing sonar (PIN_PING, PIN_PING, MAX_DISTANCE); // Регулювання пинов і максимальної відстані void setup () (Serial.begin (9600); // Відкривається протокол з даними і частотою передачі 115200 біт / сек.) Void loop () (delay (50); // Затримка в 50 мс між генеруються хвилями. 29 мс - мінімально допустиме значення unsigned int distanceSm \u003d sonar.ping (); // Створення сигналу, отримання параметра його тривалості в мкс (uS). Serial.print ( "Ping:"); Serial.print (distanceSm / US_ROUNDTRIP_CM); // Перерахунок параметра часу в величину відстані і висновок результату (0 відповідає виходу за допустиму межу) Serial.println ( "cm"); )

короткі висновки

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

Виходячи з власного досвіду, Можна стверджувати, що датчик HC-SR04 показує точність в межах одного сантиметра на відстанях від 10 см до 2 м. На більш коротких і далеких дистанціях можлива поява сильних перешкод, що сильно залежить від навколишніх предметів і способу використання. Але в більшості випадків HC-SR04 відмінно справлявся зі своєю роботою.

HC-SR04 один з найпоширеніших і найдешевший далекомір в робототехніки. Він дозволяє вимірювати відстані від 2 см до 4м (може і більше) з пристойною точністю 0,3-1см. На виході цифровий сигнал, Тривалість якого пропорційно дорівнює відстані до перешкод.

ультразвуковий далекомір

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

УЗ далекомір HC-SR04

Характеристики датчика:

Харчування - 5В
Струм - менш 2мА
Ефективний кут огляду - 15гр
Вимірюється відстань - 2см - 5м
Точність - 3 мм
Взяті з документації до датчика

Принцип роботи HC-SR04

Принцип роботи

У модуля є 4 виведення, два з яких це харчування - земля і +5 В, а ще два - дані. Опитування модуля проводиться таким способом: на висновок Trig посилається імпульс тривалістю 10мкс. Далекомір генерує посилку з 8 ультразвукових 40кГц імпульсів. Які, відбиваючись від більшості поверхонь, повертаються назад, якщо не згаснуть в дорозі. Відразу після відправки сигналу на Trig починаємо чекати у відповідь на позитивний сигнал виведення Echo, тривалістю від 150мкс до 25мс, який пропорційний відстані до об'єкта. Точніше часу проходження від датчика до перешкоди і назад. Якщо відповіді немає (датчик не почує свого луни) - то сигнал повернеться завдовжки в 38 мс. Відстань до об'єкта (перешкоди) обчислюється за такою простою формулою:

Де: L - відстань в сантиметрах до об'єкта, а F - довжина імпульсу на виводі Echo.
Рекомендований час опитування датчика 50мс або 20Гц.

Перші тести цього модуля проводив за допомогою цифрового осцилографа, який ловив відповідь від модуля і в ручну, швидким замиканням Trig на + харчування, намагався отримати стартовий 10мкс імпульс. У половині випадків виходило [:)].

конструкція

Датчик був підключений до плати вольтметра із загальним анодом, трохи модифікованому для роботи з ним (прибрані непотрібні дільник з конденсатором і доданий висновок від RA3). Був застосований мікроконтролер від 5 версії вольтметра - PIC16F688, з переробленої для УЗ далекоміра прошивкою.

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

Взагалі кажучи, нам потрібно буде з'ясувати відстань до об'єкта, тому що сам датчик просто враховує час, який витрачається на те, щоб зловити відлуння від відправлених їм звукових хвиль. Це відбувається таким чином:

  1. Модуль посилає звукові хвилі, в той же час подаючи напругу на особливий пін луни.
  2. Модуль ловить відбитий сигнал і знімає напругу з Піна.

Це все, що робить ультразвукової далекомір. Дистанцію ми можемо визначити самі, адже ми знаємо, скільки часу зайняло у звуку на те, щоб здійснити подорож від модуля і назад (по тому, наскільки довго пін луни був під напругою), а також ми знаємо швидкість звуку в повітрі. Але ми не будемо сильно вдаватися в деталі і дозволимо Arduino зробити все обчислення.

До речі, незважаючи на те, що принцип роботи всіх ультразвукових датчиків однаковий, НЕ ВСЕ ИЗ НИХ виробляють однаковий висновок напруги на пін луни. Так що, якщо у вас модуль, відмінний від HC-S04, то приділіть увагу четвертому кроці, де описані можливі проблеми, І перевірте, можливо, ваш модуль є в списку. Якщо його там немає, то доведеться розбиратися самотужки.

Крок 1: Збірка заліза своїми руками

Збірка дуже проста (збирайте все відключеним від напруги):

  1. З'єднайте 5V від Ардуіно з піном VCC на модулі
  2. З'єднайте GND від Ардуіно з GND на модулі
  3. З'єднайте цифровий пін 7 на Ардуіно з піном Trig на модулі
  4. з'єднайте цифровий модуль 8 на Ардуіно з піном Ехо на модулі

Крок 2: Програмування модуля HC-SR04

Для того щоб бачити результати роботи програми, потрібно запустити serial monitor на Ардуіно. Якщо ви не знайомі з цією функцією, то зараз саме час відкрити її і дізнатися про неї більше - це відмінна річ, яка допомагає налагодити код. В інтерфейсі Ардуіно подивіться у правий кут, там ви знайдете кнопку, яка запускає серійний монітор, вона схожа на збільшувальне скло, клікніть на ній і монітор відкриється (або виберіть TOOLS / Serial Monitor, або натисніть Ctrl + Shift + M).

ось начерк робочої програми:

// Начала скетч для Аруін -
// Визначаємо константи (константи не змінюються і якщо ви спробуєте перевизначити їх то отримаєте помилку під час компіляції)
const int triggerPin \u003d 7; // створює константу з ім'ям «triggerPin» і призначає на неї цифровий пін 7
const int echoPin \u003d 8; // створює константу з ім'ям «echoPin» і призначає на неї цифровий пін 8
// Визначаємо змінні (змінні можуть змінюватися і зазвичай змінюються по ходу програми, в них можуть міститися будь-які розраховуються значення)
int duration \u003d 0; // створює змінну з ім'ям «duration» для зберігання значення, що повертається pulseIn, спочатку значення задається рівним «0»
int distance \u003d 0; // створює змінну для зберігання значення, розрахованого як відстані до об'єкта, що знаходиться перед датчиком, спочатку значення задається рівним «0»
void setup () // В цій секції можна налаштувати вашу плату та інші параметри, необхідні для роботи вашої програми.
{
Serial.begin (9600); // ініціалізує послідовну комунікацію через USB між Ардуіно і комп'ютером, нам це знадобиться
// визначаємо режими пинов
pinMode (triggerPin, OUTPUT); // «triggerPin» буде використовуватися для ВИВЕДЕННЯ, номер Піна оголошений вище в секції «Визначаємо змінні»
pinMode (echoPin, INPUT); // «echoPin» буде використовуватися для ВВЕДЕННЯ, номер Піна оголошений вище в секції «Визначаємо змінні»
) // кінець настройки
// все, що було написано вище зчитується програмою лише один раз - при запуску або скидання (Reset)
void loop () // код програми в зацикленої частини зчитується безперестанку і повторюється до тих пір, поки не буде вимкнено живлення, або поки не буде зроблений скидання
{
digitalWrite (triggerPin, HIGH); // починає подавати ультразвукові хвилі з модуля HC-SR04
delay (5); // невелика пауза, вона потрібна для того, щоб модуль функціонував правильно (можна зменшити це значення, інші мої програми працюють при значенні 1)
digitalWrite (triggerPin, LOW); // зупиняє ультразвукові хвилі, що йдуть від модуля HC-SR04
duration \u003d pulseIn (echoPin, HIGH); // особлива функція, що дозволяє визначити тривалість часу, при якому на пін луни подавалося напруга в останньому завершеному циклі подачі ультразвуку
delay (10); // знову невелика пауза. Вона потрібна для стабільності, надто коротка пауза може не дати результату
distance \u003d (duration / 2) / 58; // перетворюємо тривалість в відстань (значення, збережене в «duration» ділиться на 2, потім це значення ділиться на 58 **) ** для сантиметрів
delay (500); // ще одна пауза для стабільності - можете пограти зі значенням, але це може зіпсувати роботу програми, так що за замовчуванням використовуйте 500
Serial.print (distance); // відправляє обчислене значення відстані на серійний монітор
Serial.println ( »cm»); // додає слово «cm» після значення відстані і переводить каретку на серійному моніторі на новий рядок
Serial.println (); // додає порожній рядок на серійному моніторі (для зручності читання)
) // Кінець циклу

_________________________________________________

Отже, після прочитання моєї інструкції я зрозумів, що начерк програми не відповідає моєму розумінню простоти. Тому я викладаю той же самий малюнок з легкими коментарями.

// Програма модуля ультразвукового датчика відстані HC-SC04
const int triggerPin \u003d 7; // тригер на 7
const int echoPin \u003d 8; // ECHO на 8
int duration \u003d 0; // зберігає значення з pulseIn
int distance \u003d 0; // зберігає значення розрахованого відстані
void setup ()
{
Serial.begin (9600);
pinMode (triggerPin, OUTPUT); // визначає режими пинов
pinMode (echoPin, INPUT);
}
void loop ()
{
digitalWrite (triggerPin, HIGH); // починає відправляти ультразвук
delay (5); // необхідна команда, налаштовується (але не нижче 10мікросекунд)
digitalWrite (triggerPin, LOW); // модуль припиняє відправляти ультразвук
duration \u003d pulseIn (echoPin, HIGH); // визначає, як довго подавалося напруга на пін ECHO
delay (10); // необхідна команда, налаштовується, але акуратно
distance \u003d (duration / 2) / 58; // вираховуємо відстань в см до об'єкта
delay (500); // пауза для стабільності, зменшення може зламати хід програми, краще залишити як є
Serial.print (distance); // відправляє поточне значення, збережене в distance на серійний монітор
Serial.println ( »cm»); // відображає слово «cm» відразу після відстані
Serial.println (); // створює один порожній рядок в серійному моніторі (для зручності читання)
}

До інструкції я також докладу файли.ino

файли

  1. HCSR04BareBones.ino - цей файл сильно закоментований і містить деяку інформацію по модулю HC-SR04, а також інфу по збірці.
  2. BareBonesLight.ino - модуль з невеликою кількістю коментарів

Ось моя порада. Я знаю, що код працює, але перед тим, як прикріплювати файли до інструкції, я перевірив ще раз все і серійний монітор стабільно показував «0 cm». Проблема виявилася в згорілому модулі, а його заміна виправила ситуацію.

Дивіться на те, як відгукується програма, якщо вирішите пограти зі значеннями команд delay. Дослідним шляхом я виявив, що зменшення значень delay або прирівнювання їх до 0 може привести програму до неробочому станом.

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

Схема вище використовувалася мною для того, щоб визначати, що від датчика всі об'єкти знаходяться на відстані далі, ніж 60 см. У проекті використовувалося три діода і пищалка. Коли всі предмети були далі 60 см, горіло зелене діод. Коли щось наближалося менш ніж на 60см, зелений діод гас, а червоний спалахував. Якщо об'єкт залишався на близькій відстані на якийсь час, то спалахував другий червоний діод, а пищалка починала пищати. Коли об'єкт віддалявся на 60см, пищалка замовкала, червоні діоди гасли, і знову спалахував зелений. Це не запобігало все помилкові тривоги, але працювало з більшістю випадків, коли повз датчика пролітала птах або цікава білка пробігала повз.

Крок 4: Відомі проблеми

Якщо ви бачите модель вашого ультразвукового модуля в цьому пункті, то перегортайте нижче. Сподіваюся, ви знайдете вашу проблему і вирішите її.

  1. US-105
  2. DYP-ME007TX

Модуль US-105

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

// Код для ультразвукового модуля US-105 unsigned int EchoPin \u003d 2; unsigned int TrigPin \u003d 3; unsigned long Time_Echo_us \u003d 0; // Len_mm_X100 \u003d length * 100 unsigned long Len_mm_X100 \u003d 0; unsigned long Len_Integer \u003d 0; // unsigned int Len_Fraction \u003d 0; void setup () (Serial.begin (9600); pinMode (EchoPin, INPUT); pinMode (TrigPin, OUTPUT);) void loop () (digitalWrite (TrigPin, HIGH); delayMicroseconds (50); digitalWrite (TrigPin, LOW) ; Time_Echo_us \u003d pulseIn (EchoPin, HIGH); if ((Time_Echo_us 1)) (Len_mm_X100 \u003d (Time_Echo_us * 34) / 2; Len_Integer \u003d Len_mm_X100 / 100; Len_Fraction \u003d Len_mm_X100% 100; Serial.print ( "Відстань:"); Serial.print (Len_Integer, DEC); Serial.print ( "."); if (Len_Fraction< 10) Serial.print("0"); Serial.print(Len_Fraction, DEC); Serial.println("mm"); delay(1000); } // Конец программы

Модуль DYP-ME007TX

// Код для ультразвукового модуля DYP-ME007TX / * Інструкції по підключенню * 5V від Ардуіно до VCC на модулі * GNG від Ардуіно до GND на модулі * OUT від модуля до цифрового піну 7 на Ардуіно * / #include #define RXpin 7 #define TXpin 7 SoftwareSerial mySerial (RXpin, TXpin); long mili \u003d 0; byte mybuffer \u003d (0); byte bitpos \u003d 0; void setup () (Serial.begin (9600); mySerial.begin (9600);) void loop () (bitpos \u003d 0; while (mySerial.available ()) (if (bitpos< 4) { mybuffer = mySerial.read(); } else break; } mySerial.flush(); mili = mybuffer << 8 | mybuffer; Serial.print("Distance: "); Serial.print(mili / 25.4); Serial.print (" inches"); Serial.println(); delay(500); }

Сподобалася стаття? поділіться їй