суботу, 3 грудня 2016 р.

Далекомір HC-SR04 -- зміст

Взято тут -- із тексту
якраз про змісти.
Якось так, слово за словом, постів про ультразвуковий далекомір  HC-SR04 написав багато -- робота із ним виявилася напрочуд хорошим педагогічним прикладом. При чому, пости ці сильно розкидані по часу. Тому вирішив створити окремий зміст.

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

Проекти із кодом, який використовується в постах, зазвичай можна скачати за посилання в кінці посту. Історично склалося так, що проекти для CoIDE. В принципі, зараз перейшов на System Workbench for STM32, але якщо б взявся всі пости переносити -- їх написання точно б ніколи не завершилося. Та й STM32VLDiscovery він не підтримує.

Використано мікроконтролери сімейства STM32, детальніше в тексті.

Код, в основному, написаний на С -- використання C++ додало б декілька зайвих рухів, майже не додавши "педагогічної цінності". Однак, в своїх реальних проектах використовую С++. Проекти в міру (сподіваюся -- в міру) неохайні, хоч і старався, щоб зовсім потворними вони не були. Якщо бачите помилки -- пишіть. 

Див. також зміст суміжної серії постів: "Таймери STM32".


Власне -- він, огляд. Розповідь про те, що це за пристрій та про принципи його роботи ("подав імпульс на TRIG, заміряв тривалість імпульсу на ECHO", але з подробицями).

2. Далекомір HC-SR04 -- використовуючи GPIO/CMSIS
CMSIS -- бібліотека для роботи із мікроконтролерів сімейства ARM Cortex M на найбільш низькому рівні -- безпосередньо маніпулюючи регістрами. GPIO -- збірна назва підсистеми пінів мікроконтролера та способу роботи із ними, коли ми самі їх "смикаємо" (на противагу використанню більш високорівневої периферії, яка автоматично керує пінами). Отож, вимірюємо віддаль, користуючись найбільш низькорівневими інструментами. Для відліку часу використовується SysTick. (На жаль, мікроконтролери STM32F100 не мають вбудованого лічильника тактів -- можна б було, для початку, ще простіше. Див. також "Мікросекундні затримки та відлік мікросекунд для STM32").

3. Далекомір HC-SR04 -- використовуючи GPIO/SPL
Першою (чи однією із перших) спроб надати більш високорівневі засоби та більш портабельні засоби, була Standard Peripherals Library. Тут, для роботи із периферією, замість безпосередньої маніпуляції регістрами, використовується виклики функцій, яким передаються заповнені параметрами структури. І функції і параметри мають "високорівневі" імена. Все ж:

TrigPin_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

читається краще, ніж щось таке:

GPIOC->CRH |= GPIO_CRH_MODE9;

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


4.Далекомір HC-SR04 -- використовуючи GPIO/CoX
Розробники CoIDE і свою бібліотеку роботи з периферією пропонували -- CoX. Її сильна сторона -- кросплатформовість, себто -- не тільки для STM32, а й для інших мікроконтролерів на базі ARM Cortex M. Слабка -- закинутість авторами. Навряд чи вартує використовувати в нових проектах, але глянути, як вона організована, можна.

5. Далекомір HC-SR04 -- використовуючи GPIO/HAL/STM32CubeMX
Наступна спроба STM розробити бібліотеку для периферії -- HAL, Hardware Abstraction Layer. Сама бібліотека виглядає подальшим розвитком SPL, нічого особливо видатного, хоча й цікава. Але вона вийшла разом із STM32CubeMX --засобом графічної конфігурації периферії. Отож, дивимося, що таке цей Cube, як з ним працювати і як писати простий код, що використовує HAL.

6. Далекомір HC-SR04 -- GPIO/C++
C++ -- надзвичайно потужний інструмент. Правда і небезпечний. Якщо писати погано -- результат буде жахливий, якщо на совість -- чудовим. Показано, як трішки шаблонної магії дозволяють писати елегантний та високоефективний  код.

7. Далекомір HC-SR04 -- GPIO/висновки
Порівняння різних способів вирішити ту ж задачу, аналіз отриманих розмірів прошивок. Короткий висновок -- з точки зору розміру, юзабельне все, крім CoX, з точки зору "ергономіки", зручності використання програмістами -- мусите самі думати, кожен підхід має свої плюси та мінуси.

8. Далекомір HC-SR04 -- два таймери/CMSIS
Завершуємо із примітивщиною та GPIO, робимо "по науці" -- із використанням таймерів. Поки таймери не економимо -- один генерує імпульс TRIG, другий  слухає ECHO, третій -- використано для візуалізації віддалі. Якщо таймерів досить, то чого б і ні? Посилається на важливі статті по використанню скінчених автоматів для програмування мікроконтролерів.

Зауважте, програма стала багато громіздкішою, ніж попередні. Може постати питання -- навіщо все це?! Відповідь проста -- якщо нам потрібно лише читати покази і кудись їх передавати, всі ці складності не потрібні. Однак, якщо програма повинна робити ще щось -- в GPIO-підході вона різко ускладнюватиметься, до непідйомності, а такий варіант масштабується добре.

9. Далекомір HC-SR04 -- два таймери/HAL
Те ж, засобами HAL. Принципових відмінностей немає, хіба видно, як хитру конфігурацію, описану вище, побудувати графічними засобами Cube. 

10. Далекомір HC-SR04 -- один таймер/CMSIS
Таймери -- ресурс цінний. Тому треба вміти їх "економити". Хоч і не варто це робити лише заради економії! (Тому цей приклад переускладнений, як для задач, що він вирішує, але його роль -- продемонструвати принцип.)

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

10a. Далекомір HC-SR04 -- трасування, додаток
Якщо людина не встигає за периферією, а прослідкувати роботу пристрою потрібно, можна фіксувати етапи в пам'яті, а вже потім передавати на комп'ютер. От, приклад (відносно примітивний) використання цього підходу.

11. Далекомір HC-SR04 -- один таймер/HAL
Те ж, засобами HAL. Єдине, доводиться трішки руками втручатися -- HAL безпосередньо таких "збочень" не підтримує.

12. Далекомір HC-SR04 -- зовнішні переривання EXTI/CMSIS
Замість хитрозакрученого знущання над таймерами, того ж результату можна досягнути, використовуючи зовнішні переривання (EXTI). Показано, як їх конфігурувати та користуватися ними. Використовується таймер TIM1 для відліку часу та створення затримок, а тривалість Echo вимірюється за допомогою переривань по фронту та по спаду сигналу.

13. Далекомір HC-SR04 -- зовнішні переривання EXTI/HAL
Те ж, засобами STM32CubeMX/HAL.

14. "Зовсім просто про далекомір HC-SR04 із GPIO/HAL"
Код вище складний, у спробі бути готовим до нештатних ситуацій. Якщо такої перестраховки не потрібно, можна простіше. Пост, за сумісництвом, використовується як методичні рекомендації студентам.

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

Поки -- все.

P.S. Про зоопарк бібліотек від STMicroelectronics, див., наприклад, тут: "STM32 embedded software offerring".

2 коментарі:

  1. Вітання.
    Дякую за дописи. Нещодавно Вас знайшов. Думав що я один про STM32 українською. Підписався, слідкую. Мій блог http://stm32withoutfear.blogspot.com/

    ВідповістиВидалити
    Відповіді
    1. Дякую і Вам! Давно читаю Ваш блог, було приємно, що я вже не один такий. :-)

      Видалити