У цьому уроці ми збираємося обговорити та розробити схему вимірювання відстані. Ця схема розроблена шляхом взаємодії ультразвукового датчика “HC-SR04” з мікроконтролером AVR. Цей датчик використовує техніку під назвою „ECHO”, яку ви отримуєте, коли звук відбивається назад після удару об поверхню.
Ми знаємо, що звукові коливання не можуть проникати крізь тверді речовини. Отже, коли джерело звуку генерує вібрації, вони рухаються по повітрю зі швидкістю 220 метрів в секунду. Ці вібрації, коли вони стикаються з нашим вухом, ми описуємо їх як звукові. Як вже було сказано раніше, ці вібрації не можуть проходити крізь тверде тіло, тому, коли вони вдаряються поверхнею, як стіна, вони відбиваються назад з однаковою швидкістю до джерела, яке називається ехо.
Ультразвуковий датчик “HC-SR04” забезпечує вихідний сигнал, пропорційний відстані на основі луни. Тут датчик генерує звукову вібрацію в ультразвуковому діапазоні після спрацьовування тригера, після чого він чекає повернення звукової вібрації. Тепер, виходячи з параметрів, швидкості звуку (220 м / с) і часу, необхідного для того, щоб ехо досягло джерела, воно забезпечує вихідний імпульс, пропорційний відстані.
Як показано на малюнку, спочатку нам потрібно ініціювати датчик для вимірювання відстані, тобто ВИСОКИЙ логічний сигнал на спусковому штифті датчика більше 10 мкС, після цього датчик передає звукову вібрацію, після відлуння датчик забезпечує сигнал на вихідному штифті, ширина якого пропорційна відстані між джерелом та перешкодою.
Ця відстань обчислюється як, відстань (в см) = ширина імпульсного виходу (в сС) / 58.
Тут ширину сигналу потрібно приймати, кратну до US (мікросекунда або 10 ^ -6).
Потрібні компоненти
Апаратне забезпечення: ATMEGA32, блок живлення (5 в), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), конденсатор 1000 мкФ, резистор 10 кОм (2 штуки), датчик HC-SR04.
Програмне забезпечення: Atmel studio 6.1, progisp або flash magic.
Принципова схема та робоче пояснення
Тут ми використовуємо PORTB для підключення до порту даних РК (D0-D7). Той, хто не хоче працювати з FUSE BITS ATMEGA32A, не може використовувати PORTC, оскільки PORTC містить спеціальний тип зв'язку, який можна вимкнути, лише змінивши FUSEBITS.
У схемі, як ви помічаєте, я взяв лише два керуючі штифти, це надає гнучкість кращого розуміння. Біт контрасту та READ / WRITE використовуються не часто, тому їх можна закоротити на землю. Це дає РК-дисплею найвищий контраст і режим читання. Нам просто потрібно контролювати ENABLE та RS-шпильки, щоб відповідно надсилати символи та дані.
Підключення, які виконуються для РК-дисплея, наведені нижче:
PIN1 або VSS на землю
PIN2 або VDD або VCC до + 5 В потужності
PIN3 або VEE на землю (забезпечує максимальний контраст найкращий для початківця)
PIN4 або RS (реєстрація вибору) до PD6 uC
PIN5 або RW (читання / запис) на землю (переведення РК в режим читання полегшує зв'язок для користувача)
PIN6 або E (увімкнути) для PD5 uC
PIN7 або D0 до PB0 uC
PIN8 або D1 до PB1 uC
PIN9 або D2 до PB2 uC
PIN10 або D3 до PB3 uC
PIN11 або D4 до PB4 uC
PIN12 або D5 до PB5 uC
PIN13 або D6 до PB6 uC
PIN14 або D7 до PB7 uC
У схемі ви можете бачити, що ми використовували 8-бітовий зв'язок (D0-D7), однак це не є обов'язковим, і ми можемо використовувати 4-бітний зв'язок (D4-D7), але з 4-бітовою програмою зв'язку стає трохи складнішою. Отже, як показано у наведеній вище таблиці, ми підключаємо 10 висновків РК-дисплея до контролера, в якому 8 висновків є висновками даних і 2 висновками для управління.
Ультразвуковий датчик - це чотириконтактний пристрій, PIN1-VCC або + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- ЗЕМЛЯ. Тригерний штифт - це місце, де ми даємо тригер, щоб сказати датчику виміряти відстань. Ехо - вихідний штифт, де ми отримуємо відстань у вигляді ширини імпульсу. Ехо-пін тут підключений до контролера як зовнішнє джерело переривання. Отже, щоб отримати ширину вихідного сигналу, луна датчика підключена до INT0 (переривання 0) або PD2.
1. Спрацьовування датчика шляхом підтягування спускового штифта принаймні 12 мкС.
2. Як тільки луна підніметься високо, ми отримуємо зовнішнє переривання, і ми збираємось розпочати лічильник (що дозволяє лічильник) в ISR (Interrupt Service Rutine), який виконується відразу після спрацьовування переривання.
3. Як тільки луна знову знизиться, генерується переривання, цього разу ми зупинимо лічильник (відключивши лічильник).
4. Отже, для імпульсу від низького до низького на ехо-піні ми запустили лічильник і зупинили його. Цей підрахунок оновлюється до пам'яті для отримання відстані, оскільки ми маємо зараз ширину відлуння.
5. Ми будемо робити подальші обчислення в пам’яті, щоб отримати відстань у см
6. Відстань відображається на РК-дисплеї 16x2.
Для налаштування вищезазначених функцій ми збираємося встановити наступні регістри:
Наведені вище три регістри мають бути встановлені відповідно, щоб установка працювала, і ми збираємось коротко їх обговорити, СИНИЙ (INT0): цей біт повинен бути встановлений високо, щоб увімкнути зовнішнє переривання0, після встановлення цього виводу ми відчуваємо зміни логіки на виводі PIND2.
BROWN (ISC00, ISC01): ці два біти коригуються для відповідної зміни логіки на PD2, що вважається перериванням.
Отже, як було сказано раніше, нам потрібне переривання, щоб почати відлік і зупинити його. Отже, ми встановлюємо ISC00 як один і отримуємо переривання, коли є логіка LOW до HIGH при INT0; чергове переривання, коли є логіка HIGH to LOW.
ЧЕРВОНИЙ (CS10): Цей біт призначений просто для ввімкнення та вимкнення лічильника. Хоча він працює разом з іншими бітами CS10, CS12. Ми не проводимо жодних попередніх оцінок тут, тому нам не потрібно турбуватися про них.
Тут слід пам’ятати кілька важливих речей:
Ми використовуємо внутрішній годинник ATMEGA32A, який становить 1 МГц. Тут немає жодного попереднього масштабування, ми не робимо процедуру генерування переривання збігів, тому немає складних налаштувань реєстру.
Значення підрахунку після підрахунку зберігається в 16-бітному регістрі TCNT1.
Також перевірте цей проект за допомогою arduino: Вимірювання відстані за допомогою Arduino
Пояснення програмування
Робота датчика вимірювання відстані пояснюється поетапно в нижченаведеній програмі C.
#include // заголовок, щоб увімкнути управління потоком даних над висновками #define F_CPU 1000000 // повідомляє контролер про частоту кристала, прикріплений