Щоб будь-який проект ожив, нам потрібно використовувати датчики. Датчики виконують роль очей і вух для всіх вбудованих додатків, це допомагає цифровому мікроконтролеру зрозуміти, що насправді відбувається в цьому реальному аналоговому світі. У цьому підручнику ми навчимося взаємодіяти ультразвуковий датчик HC-SR04 з мікроконтролером PIC.
HC-SR04 є ультразвуковий датчик, який може бути використаний для вимірювання відстані в будь-якому місці між 2 см до 450 см (теоретично). Цей датчик зарекомендував себе як гідний, вписавшись у багато проектів, які включають виявлення перешкод, вимірювання відстані, картографування середовища тощо. В кінці цієї статті ви дізнаєтеся, як працює цей датчик та як взаємодіяти з мікроконтролером PIC16F877A для вимірювання відстані та відображення на РК-екрані. Звучить цікаво правильно !! Тож давайте почнемо…
Необхідні матеріали:
- MCU PIC16F877A з програмуванням
- РК-дисплей 16 * 2
- Ультразвуковий датчик (HC-SR04)
- Підключення проводів
Як працює ультразвуковий датчик?
Перш ніж продовжувати, ми повинні знати, як працює ультразвуковий датчик, щоб ми могли набагато краще зрозуміти цей підручник. Ультразвуковий датчик, що використовується в цьому проекті, показаний нижче.
Як бачите, у нього є два круглих ока, як виступи, і чотири шпильки, що виходять з нього. Два подібні до очей проекції - це ультразвукова хвиля (надалі іменована американською хвилею), передавач та приймач. Передавач випромінює американську хвилю на частоті 40 Гц, ця хвиля подорожує по повітрю і відбивається назад, коли відчуває предмет. Зворотні хвилі спостерігаються приймачем. Тепер ми знаємо час, необхідний для відбиття і повернення цієї хвилі, і швидкість хвилі США також є універсальною (3400 см / с). Використовуючи цю інформацію та наведені нижче формули середньої школи, ми можемо розрахувати пройдену відстань.
Відстань = Швидкість × Час
Тепер, коли ми знаємо, як працює американський датчик, давайте розберемося, як його можна зв’язати з будь-яким MCU / CPU за допомогою чотирьох контактів. Ці чотири висновки - це Vcc, Trigger, Echo і Ground відповідно. Модуль працює на напрузі + 5 В, отже, для живлення модуля використовується Vcc та штифт заземлення. Інші два висновки - це висновки вводу-виводу, за допомогою яких ми обмінюємося своїм MCU. Тригер висновок повинен бути оголошений як вихід і зробив максимум для 10us, це буде передавати США хвилю в повітрі, як 8 циклу звуковий вибух. Як тільки хвиля спостерігається, ехо-пін підніметься на високу точний проміжок часу, який американська хвиля взяла, щоб повернутися назад до модуля датчика. Отже, цей ехо-контакт буде оголошений як вхіднийа за допомогою таймера буде виміряно, наскільки довгий штифт був високим. Це можна зрозуміти далі на часовій діаграмі нижче.
Сподіваюся, ви прийшли до попереднього способу взаємодії цього датчика з PIC. У цьому підручнику ми використовуватимемо модуль таймера та РК-модуль, і, припускаю, ви знайомі з обома, якщо не, поверніться до відповідного підручника нижче, оскільки я пропускаю більшість інформації, пов’язаної з ним.
- РК-інтерфейс з мікроконтролером PIC
- Розуміння таймерів у мікроконтролері PIC
Кругова діаграма:
Повна електрична схема для взаємодії ультразвукового датчика з PIC16F877A наведена нижче:
Як показано, схема включає не що інше, як РК-дисплей і сам ультразвуковий датчик. Американський датчик може живитися від + 5 В, отже, він безпосередньо живиться від регулятора напруги 7805. Датчик має один вихідний штифт (тригерний штифт), який підключений до контакту 34 (RB1), а вхідний штифт (ехо-штифт) підключений до контакту 35 (RB2). Повне контактне з'єднання показано в таблиці нижче.
S.No: |
Номер PIN-коду PIC |
Ім'я PIN-коду |
Пов'язаний з |
1 |
21 |
RD2 |
RS РК |
2 |
22 |
RD3 |
E РК |
3 |
27 |
RD4 |
D4 РК-дисплея |
4 |
28 |
RD5 |
D5 РК-дисплея |
5 |
29 |
RD6 |
D6 РК-дисплея |
6 |
30 |
RD7 |
D7 РК-дисплея |
7 |
34 |
RB1 |
Тригер США |
8 |
35 |
RB2 |
Відлуння США |
Програмування мікроконтролера PIC:
Повна програма для цього підручника наведена в кінці цієї сторінки, далі нижче я пояснив код невеликими значеннями, щоб ви могли зрозуміти цілі фрагменти. Як вже було сказано раніше, програма включає концепцію інтерфейсу РК та таймера, що не буде детально пояснюватися в цьому посібнику, оскільки ми вже висвітлювали їх у попередніх підручниках.
Всередині основну функцію ми починаємо з ініціалізації висновків вводу-виводу та інших регістрів, як зазвичай. Ми визначаємо висновки вводу-виводу для РК-дисплея та датчика США, а також ініціюємо регістр таймера 1, встановлюючи його для роботи на попередньому скалярі 1: 4 та використовуючи внутрішній годинник (Fosc / 4)
TRISD = 0x00; // PORTD оголошений як вихід для взаємодії РК-дисплея TRISB0 = 1; // Визначимо штифт RB0 як вхідний для використання як штифт переривання TRISB1 = 0; // Тригерний штифт датчика США надсилається як вихідний штифт TRISB2 = 1; // Ехо-штир американського датчика встановлений як вхідний штифт TRISB3 = 0; // RB3 - вихідний штифт для світлодіода T1CON = 0x20; // 4 прескаляри і внутрішній годинник
Таймер 1 - це 16-розрядний таймер, що використовується в PIC16F877A, регістр T1CON контролює параметри модуля таймера, і результат буде зберігатися в TMR1H і TMR1L, оскільки 16-бітний результат перших 8 буде зберігатися в TMR1H, а наступні 8 в TMR1L. Цей таймер можна ввімкнути або вимкнути за допомогою TMR1ON = 0 та TMR1ON = 1 відповідно.
Тепер таймер готовий до використання, але ми повинні відправити американські хвилі з датчика, для цього нам потрібно тримати штифт тригера високим на 10 мкСм, це робиться за наступним кодом.
Тригер = 1; __delay_us (10); Тригер = 0;
Як показано на часовій діаграмі вище, штифт Echo залишатиметься низьким, поки хвиля не повернеться назад, а потім буде підніматися високо і залишатись високим протягом точного часу, необхідного для повернення хвиль назад. Цей час повинен вимірюватися за допомогою модуля Таймер 1, що можна зробити за допомогою рядка нижче
while (Відлуння == 0); TMR1ON = 1; в той час як (Відлуння == 1); TMR1ON = 0;
Після вимірювання часу отримане значення буде збережено в регістрах TMR1H і TMR1L, ці регістри повинні бути збиті, щоб зібрати, щоб отримати 16-бітове значення. Це робиться за допомогою рядка нижче
прийняте часом = (TMR1L - (TMR1H << 8));
Цей time_taken буде у байтах форми, щоб отримати фактичне значення часу, ми повинні використати формулу нижче.
Час = (значення 16-бітового регістру) * (1 / Внутрішній годинник) * (Попереднє масштабування) Внутрішній годинник = Fosc / 4 Де в нашому випадку Fosc = 20000000 МГц та Попереднє масштабування = 4 Отже 5000000Mhz і значенням часу буде Time = (16-бітове значення регістру) * (1/5000000) * (4) = (16-бітове значення регістру) * (4/5000000) = (16-бітове значення регістру) * 0,0000008 секунд (АБО) Час = (значення 16-бітового регістру) * 0,8 мікросекунд
У нашій програмі значення 16-бітового регістру зберігається у змінній time_taken, а отже, нижченаведений рядок використовується для обчислення time_taken в мікросекундах
взятий час = прийнятий час * 0,8;
Далі ми повинні знайти, як розрахувати відстань. Як ми знаємо відстань = швидкість * час. Але тут результат слід розділити на 2, оскільки хвиля охоплює і передавальну відстань, і відстань прийому. Швидкість хвилі (звук) у нас становить 34000 см / с.
Відстань = (Швидкість * Час) / 2 = (34000 * (16-бітове значення регістру) * 0,0000008) / 2 Відстань = (0,0272 * 16-бітове значення регістру) / 2
Тож відстань можна обчислити в сантиметрах, як показано нижче:
відстань = (0,0272 * час_зайнятий) / 2;
Після обчислення значення відстані та часу, який нам потрібно, ми просто повинні відобразити їх на РК-екрані.
Вимірювання відстані за допомогою PIC та ультразвукового датчика:
Після встановлення з'єднань і завантаження коду ваша експериментальна установка повинна виглядати приблизно так, як показано на малюнку нижче.
Дошка PIC Perf, показана на цьому малюнку, була створена для нашої навчальної серії PIC, в якій ми навчились користуватися мікроконтролером PIC. Можливо, ви захочете повернутися до цих підручників з мікроконтролера PIC за допомогою MPLABX та XC8, якщо ви не знаєте, як записати програму за допомогою Pickit 3, оскільки я пропускаю всю цю основну інформацію.
Тепер поставте предмет перед датчиком, і він повинен відобразити відстань від датчика. Ви також можете помітити час, який відображається у мікросекундах для передачі та повернення хвилі назад.
Ви можете перемістити об'єкт на бажану відстань і перевірити значення, яке відображається на РК-дисплеї. Я зміг виміряти відстань від 2 см до 350 см з точністю до 0,5 см. Це цілком задовільний результат! Сподіваюся, вам сподобався підручник і ви навчилися робити щось самостійно. Якщо у вас є якісь сумніви, залиште їх у розділі коментарів нижче або скористайтеся форумами.
Також перевірте взаємодію ультразвукового датчика з іншими мікроконтролерами:
- Вимірювання відстані на основі датчика Arduino та ультразвуку
- Виміряйте відстань за допомогою ультразвукового датчика Raspberry Pi та HCSR04
- Вимірювання відстані за допомогою HC-SR04 та мікроконтролера AVR