- Необхідні матеріали:
- Кругова діаграма:
- Як насправді працює модуль HC-SR04:
- Вимірювання відстані між двома ультразвуковими датчиками (HC-SR04):
- Програма для датчика датчика:
- Програма для датчика приймача:
- Робоча:
- Імпровізована ідея - калібрування датчика на відомій відстані:
Ультразвуковий датчик (HC-SR04) зазвичай використовується для визначення відстані об’єкта від однієї конкретної точки. Це було досить легко зробити з Arduino, і код також досить простий. Але в цій статті ми спробуємо щось інше з цими популярними датчиками HC-SR04. Ми спробуємо обчислити відстань між двома ультразвуковими датчиками, тобто створимо один датчик, який буде виконувати функції передавача, а другий датчик - приймальника. Роблячи це, ми можемо відстежувати розташування одного передавача за допомогою безлічі ультразвукових приймачів, це відстеження називається тріангуляцією і може бути використано для автоматичних стикувальних роботів-багажників та інших подібних додатків. Знаходження відстані між двома американськими датчиками може здатися досить простим завданням, але я зіткнувся з кількома проблемами, які обговорюються в цьому проекті.
Методика, обговорена в цій статті, не є досить точною і може бути корисною в реальних системах без модифікацій. За час написання цієї документації я не виявив, що хтось наближається до результатів, як я, тому я просто поділився своїми поглядами на те, як я працював, щоб людям, які намагаються це зробити, не потрібно було винаходити колесо.
Необхідні матеріали:
- Arduino (2Nos) - будь-яка модель
- Модуль HCSR04 (2Ні)
Кругова діаграма:
Незважаючи на те, що ми збираємося зробити один американський (ультразвуковий) датчик для роботи як передавач, а інший як приймач, обов’язково потрібно з’єднати всі чотири висновки датчиків з Arduino. Чому ми повинні? Більше про це буде розглянуто пізніше, але наразі принципова схема буде такою
Як бачите, принципова схема як передавача, так і приймача однакова. Також перевірте: Інтерфейс ультразвукового датчика Arduino
Як насправді працює модуль HC-SR04:
Перш ніж продовжувати далі, давайте зрозуміємо, як працює датчик HC-SR04. Наведена нижче діаграма часу допоможе нам зрозуміти роботу.
Датчик має два висновки Trigger і Echo, які використовуються для вимірювання відстані, як показано на часовій діаграмі. Спочатку, щоб розпочати вимірювання, нам слід надіслати ультразвукову хвилю від передавача, це можна зробити, встановивши високий штифт тригера на 10 мкС. Як тільки це буде зроблено, висновок передавача надішле 8 звукових сплесків хвиль США. Ця американська хвиля потрапить у відскочений об'єкт і буде отримана приймачем.
Тут діаграма часу показує, що як тільки приймач отримає хвилю, він змусить ехо-пін піднятися на висоту протягом часу, який дорівнює часу, необхідному для проходження хвилі від американського датчика і повернення назад до датчика. Ця часова діаграма, здається, не відповідає дійсності.
Я накрив частину мого датчика Tx (передавач) і перевірив, чи імпульс Ехо підсилювався, і так, він перевищує. Це означає, що імпульс Ехо не чекає, поки на нього прийме УЗ (ультразвукова) хвиля. Як тільки вона передає американську хвилю, вона піднімається високо і залишається високою, поки хвиля не повернеться назад. Тож правильна діаграма часу повинна бути приблизно такою, як показано нижче (Вибачте за мої погані навички письма)
Щоб ваш HC-SR04 працював лише як передавач:
Зробити HC-SR04 практично в якості передавача досить практично. Як показано на часовій діаграмі, ви повинні оголосити тригерний штифт вихідним штифтом і зробити його високим протягом 10 мікросекунд. Це спричинить сплеск ультразвукової хвилі. Отже, коли ми хочемо передавати хвилю, нам просто потрібно керувати спусковим штифтом датчика датчика, для якого код наведено нижче.
Щоб ваш HC-SR04 працював лише як приймач:
Як показано на часовій діаграмі, ми не можемо контролювати підйом ехо-штифта, оскільки він пов’язаний з тригерним штифтом. Отже, жодним чином ми не можемо змусити HC-SR04 працювати лише як приймач. Але ми можемо використати хакерство, просто перекривши частину датчика датчика стрічкою (як показано на малюнку нижче) або ковпачок, коли американська хвиля не може вийти за межі корпусу датчика, і на ехо-пін ця американська хвиля не вплине.
Тепер, щоб змусити ехо піднятися високо, нам просто потрібно натягнути цей фіктивний штифт на 10 мікросекунд. Як тільки цей датчик приймача отримує американську хвилю, що передається датчиком передавача, ехо-штифт буде низьким.
Вимірювання відстані між двома ультразвуковими датчиками (HC-SR04):
Наразі ми зрозуміли, як змусити один датчик працювати як передавач, а інший - як приймач. Тепер ми повинні передавати ультразвукову хвилю від датчика передавача і приймати її разом з датчиком приймача і перевіряти час, необхідний для проходження хвилі від передавача до приймача, звучить просто так, вірно Але, на жаль !, у нас тут проблема, і це не спрацює.
Модуль передавача та модуль приймача знаходяться далеко один від одного, і коли модуль приймача приймає американську хвилю від модуля передавача, він не буде знати, коли передавач посилав цю конкретну хвилю. Не знаючи часу початку, ми не можемо розрахувати зайнятий час і, отже, відстань. Щоб вирішити цю проблему, імпульс ехо-сигналу приймального модуля повинен змуситися підніматися точно, коли модуль передавача передає хвилю США. Іншими словами, модуль передавача та модуль приймача повинні спрацьовувати одночасно. Цього можна досягти наступним способом.
На наведеній вище схемі Tx представляє датчик передавача, а Rx - датчик приймача. Як показано, датчик передавача буде створений для передачі хвиль США з періодичною відомою затримкою, це все, що йому потрібно зробити.
У датчику приймача ми повинні якось змусити штифт спускового механізму піднятися точно саме тоді, коли штифт передавача піднімається високо. Отже, спочатку ми випадково змушуємо триггер приймачів підніматися високо, що буде і залишатиметься високим, поки ехо-пін не опуститься низько. Цей ехо-штифт буде низьким лише тоді, коли він отримає від передавача американську хвилю. Тож як тільки він знизиться, ми можемо припустити, що датчик передавача щойно спрацював. Тепер, з цим припущенням, як тільки відлуння знизиться, ми можемо дочекатися відомої затримки, а потім спрацювати тригер приймачів. Це частково синхронізує тригер як передавача, так і приймача, а отже, ви можете зчитувати тривалість безпосереднього ехо-імпульсу за допомогою pulseIn () і обчислювати відстань.
Програма для датчика датчика:
Повну програму модуля передавача можна знайти внизу сторінки. Він не робить нічого, крім як запускає датчик передавача з періодичним інтервалом.
digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Для спрацьовування датчика ми повинні змусити контактний штифт залишатися високим протягом 10 мкС. Код, щоб зробити те ж саме, показаний вище
Програма для датчика приймача:
У датчику приймача ми закрили вушко датчика датчика, щоб зробити його фіктивним, як обговорювалося раніше. Тепер ми можемо використовувати вищезгадану техніку для вимірювання відстані між двома датчиками. Повна програма наведена внизу цієї сторінки. Нижче пояснено декілька важливих рядків
Trigger_US (); while (digitalRead (echoPin) == HIGH); delayMicroseconds (10); Trigger_US (); тривалість = pulseIn (echoPin, HIGH);
Спочатку ми запускаємо американський датчик за допомогою функції Trigger_US (), а потім чекаємо, поки ехо-штифт залишається високим, використовуючи цикл while. Як тільки він стає низьким, ми чекаємо заздалегідь визначеної тривалості, ця тривалість повинна становити десь від 10 до 30 мікросекунд, які можна визначити за допомогою спроб і помилок (або ви можете використовувати імпровізовану ідею, наведену нижче). Після цієї затримки знову активуйте США, використовуючи ту саму функцію, а потім використовуйте функцію pulseIn () для обчислення тривалості хвилі.
Тепер, використовуючи ті самі старі формули, ми можемо розрахувати відстань, як показано нижче
відстань = тривалість * 0,034;
Робоча:
Встановіть з’єднання, як пояснено в програмі. Накрийте Tx-частину датчика приймача, як показано на малюнку. Потім завантажте код передавача та код приймача, які наведені нижче, на передавач та приймач Arduino відповідно. Відкрийте послідовний монітор приймального модуля, і ви помітите відстань між двома модулями, що відображаються, як показано на відео нижче.
Примітка: Цей метод є лише ідеологією і може бути неточним або задовольняючим. Однак ви можете спробувати імпровізовану ідею нижче, щоб отримати кращі результати.
Імпровізована ідея - калібрування датчика на відомій відстані:
Метод, який до цього дивно пояснили, здається, задовольняє, проте цього було достатньо для мого проекту. Однак я також хотів би поділитися недоліками цього методу та способом їх подолання. Одним з основних недоліків цього методу є те, що ми припускаємо, що ехо-штифт приймача падає низько відразу після того, як датчик передавача передає хвилю США, що не відповідає дійсності, оскільки хвилі знадобиться деякий час, щоб перейти від передавача до приймача. Отже, тригер передавача та тригер приймача не будуть ідеально синхронізованими.
Щоб подолати це, ми можемо відкалібрувати датчик, використовуючи спочатку відому відстань. Якщо відстань відома, ми будемо знати час, необхідний для того, щоб хвиля США дійшла до приймача від передавача. Збережемо цей час як Del (D), як показано нижче.
Тепер ми точно знатимемо, через скільки часу нам слід підняти тригерний штифт приймача до високого рівня, щоб отримати синхронізацію з тригером передавача. Цю тривалість можна обчислити за відомою затримкою (t) - Del (D). Мені не вдалося перевірити цю ідею через обмеження в часі, тому я не впевнений, наскільки точно вона буде працювати. Тож якщо ви випадково спробуєте це, повідомте мені результати через розділ коментарів.