суботу, 20 лютого 2016 р.

Далекомір HC-SR04 -- огляд

Купив я колись, багато років тому, собі таку штуку, як на фото -- ультразвуковий далекомір-"ехолокатор", HC-SR04. (Взагалі, перша моя покупка на e-bay. Купляв по 2.5 бкс, зараз менше 2. Та й продавець той, "Чіп партнер", як показала практика,  цілком приємний).

Пристрій простий, як двері. Datasheet -- аж дві сторінки крупним шрифтом із малюнками. 

Опис

Коротко про те, як він працює. За командою генерується короткий ультразвуковий імпульс. Через якийсь час передаються результати виміру: протягом часу, що був потрібен, щоб імпульс дійшов до перешкоди та повернувся, на одному з виводів утримується логічна одиничка. Знаючи час і швидкість звуку, можна знайти віддаль. Максимальна можлива тривалість сигналу -- 38 мс, свідчить що відбитий звук не вдалося вловити. Така тривалість відповідає віддалі майже 13 метрів, але фактично йому, для локації на таких відстанях, не вистачає ні точності ні чутливості -- в різних даташітах обіцяють від 3 до 5 метрів, тому імпульси із даними будуть мінімум вдвічі коротшими, ніж найтриваліший можливий. Посилає 8 послідовних імпульсів на частоті 40 кГц, сумарна тривалість такого пакету -- 200 мкс, тому мінімальна віддаль (така щоб сигнал повернувся після завершення передачі) мала б бути порядку 6 см, однак пристрій цілком пристойно справляється до обіцяних в даташітах 1-2 см. Ймовірно, завади від "динаміка" на мікрофоні незначні або компенсуються. Точність -- до 3 мм.

Підсумовуючи інформацію із специфікації:
  • Робоча напруга -- 5В
  • Струм споживання -- 15 мА
  • Струм в стані спокою -- до 2 мА
  • Максимальна віддаль -- 3-5 м
  • Мінімальна віддаль -- 2 см
  • Точність -- до 3 мм (+1% від віддалі)
  • Кут -- приблизно 15 градусів
  • Розмір -- 40х20х15 мм
  • Робоча частота -- 40 кГц, +-2кГц
Звичайно, є як покращені його варіанти -- HC-SR05, так і якісно кращі пристрої. Але для того, щоб побавитися, цілком вистачить.
На практиці робота з ним виглядає так -- на вивід Vcc  подається живлення, +5В, Gnd підключається до землі. Тоді, на Trig слід подати імпульс (логічну одиницю) тривалістю близько 10 мкс. Він запустить генерацію локаційного сигналу. Сигнал генерується незалежно, Trig тільки запускає його, тому точна тривалість не дуже важлива. Знявши Trig, слід почати слухати Echo, як тільки вона підніметься до 1, заміряти час до того, як рівень опуститься до нуля. З отриманого часу віддаль до перешкоди можна знайти так: \[l = t c /2, \] де l -- віддаль до перешкоди в метрах, якщо t -- тривалість імпульсу на Echo, в секундах, двійка в знаменнику враховує, що звук йшов до перешкоди і назад, а c -- швидкість звуку. Тобто, щоб працювати із пристроєм, важливо її знати. Приблизно її можна записати так: \[ c\approx 331.5 + 0.6\cdot t,\] де швидкість c -- в метрах на секунду, t -- температура в градусах Цельсія. За температури 20 градусів це приблизно 343 м/с.

Діаграма функціонування. (c) Datasheet

Якщо звук не зміг повернутися -- до перешкод задалеко, або поверхня погано відбиває (наприклад, пухнасте хутро) -- імпульс триватиме 38 мс.

Експериментально визначена "дальнобійність" для різних кутів. (c) Datasheet
Пристрій 5-вольтовий, для роботи на Vcc слід подати саме 5В (+-0.5)! Але для запуску достатньо 3.3В, тому з ним цілком можуть працювати контролери на 3.3В логіці, якщо у цих контролерів виводи нормально витримують прикладену напругу 5В -- є, як їх називають, 5V Tolerant. Багато 3В-контролерів справді витримують, якщо ж ні, слід скористатися перетворювачем рівнів, у даному випадку підійде простий подільник напруги. 

Обидва куплених мною на e-bay далекоміри мають одну особливість -- після 30-40 хвилин неперервної роботи вони іноді "втомлюються", і потім видають імпульси фіксованої довжини, що відповідають віддалі в 6-7 см. Постоявши вимкненими, "відпочивши" хвилин 10, повертаються до нормальної роботи. Погано, звичайно, але враховуючи їх ціну -- зійде. :-)
В кого на зубах є коронки, майте на увазі, є реальний шанс, що ясна під ними нитимуть!
Додаткові посилання: "Ультразвуковой дальномер HC-SR04". Даташіт, наприклад, тут: [1], [2].

"Прилади та матеріали"


Щоб випробувати далекомір, скористаємося STM32VLDiscovery, з процесором STM32F100RB, (типу ARM Cortex-M3), який якраз 3.3-вольтовий. Для розробки використовуватимемо CoIDE, (подробиці див. "Стандартна бібліотека C та SemiHosting (на прикладі STM32 і CoIDE)" та "C++ із ARM GCC + STM32 (+ CoIDE)", старий пост по CoIDE 1.5 містить все разом, але доволі примітивно і з помилками та неточностями, тому посилання не даю), але особливої ролі це не грає, в інших комбінаціях компіляторів та оболонок відмінності будуть незначними.

Для простоти (робота з UART чи LED -- цілком окрема тема), вивід здійснюватиметься засобами Semihosting, описаними раніше.

Увага: printf з Newlib стандартного стеку може бути замало -- будуть загадкові зависання. В старих версіях CoIDE він міг вказуватися вручну, див. стартовий файл cmsis_boot/startup/startup_stm32f10x_md_vl.c:

#define STACK_SIZE       0x00000200 
У нових визначається автоматично, лінкером, за вимогами в об'єктних файлах, і проблем не мало б бути.

Ще одне зауваження:
Semihosting слід дозволити в оболонці (Debug -> Debug configuration -> Advanced/Semihosting Enable). CoIDE, особливо -- старіші версії, чомусь періодично і абсолютно загадково вимикає його підтримку, (ні, певні закономірності я зауважив, але чи це справді закономірності чи прояв апофенії -- не знаю). Тому, якщо під час запуску програми з-під відладника, програма зупиняється у файлі sh_cmd.s, на стрічці:
SH_DoCommand:
    BKPT 0xAB     /* Wait ICE or HardFault */
                  /* ICE will step over BKPT directly */
                  /* HardFault will step BKPT and the next line */

перевірте, чи Semihosting все ще дозволено.

Працюємо за допомогою GPIO

Почнемо з найпримітивнішого способу роботи -- сигнал подаємо вручну, "смикаючи" за ніжки, тривалість луни вимірюється регулярним опитуванням лінії Echo. При чому, спочатку хардкор, робитимемо це лише засобами CMSIS, безпосередньо працюючи з регістрами. Потім, в рамках самоосвіти і порівняльного аналізу -- за допомогою старішої SPL та більш нової HAL, потім із використанням CoX, бібліотеки роботи з периферією від авторів CoIDE і на завершення -- ілюстрація, чому C++ буває корисною і для мікроконтролерів.

Плата має два світлодіоди, синій на піні PB8 і зелений на PB9, то на додачу до виводу інформації про віддаль та повідомлень про помилку засобами Semihosting, засвічуватимемо синій у випадку помилки, зелений -- якщо все ОК.

Немає коментарів:

Дописати коментар