В мікропроцесорній техніці паралельно виконувані завдання називаються тредами (Threads) – потоками. Це дуже зручно, адже часто буває необхідно виконувати кілька операцій одночасно. А чи можна змусити мікроконтролер Arduino виконувати відразу кілька завдань, як справжній процесор? Зараз подивимося.

Параллельные потоки в программе на Arduino

Вам знадобиться

  • – Arduino;
  • – 1 світлодіод;
  • – 1 пьезопищалка.

Інструкція

1. Взагалі кажучи, Arduino не підтримує даний розпаралелювання задач, або мультипоточность. Але можна при кожному повторенні циклу “loop()” вказати мікроконтролеру перевіряти, чи не настав час виконати якусь додаткову, фонову завдання. При цьому користувачу буде здаватися, що кілька завдань виконуються одночасно. Наприклад, давайте будемо блимати світлодіод з заданою частотою і паралельно цьому видавати наростаючі і затихаючі подібно сирені звуки з пьезоизлучателя.І світлодіод, і пьезоизлучатель ми вже не раз підключали до Arduino. Зберемо схему, як показано на рисунку. Якщо ви підключаєте світлодіод до цифрового висновку, відмінного від “13”, не забувайте про струмообмежувальних резисторі приблизно на 220 Ом.

Схема подключения пищалки и светодиода к Arduino

2. Напишемо ось такий скетч і завантажимо його в Ардуїнов.Після завантаження плати видно, що скетч виконується не зовсім так, як нам потрібно: поки повністю не відпрацює сирена, світлодіод не блимне, а ми б хотіли, щоб світлодіод блимав ПІД ЧАС звучання сирени. В чому ж тут проблема?Справа в тому, що звичайним чином це завдання не вирішити. Завдання виконуються мікроконтролером строго послідовно. Оператор “delay()” затримує виконання програми на вказаний проміжок часу, і поки цей час не закінчиться, наступні команди програми не будуть виконуватися. З-за цього ми не можемо задати різну тривалість виконання для кожної задачі в циклі “loop()” програми. Тому потрібно якось зімітувати багатозадачність.

Управление пищалкой и светодиодом последовательно

3. Варіант, при якому Arduino буде виконувати завдання псевдо-паралельно, запропонований розробниками Ардуїнов у статті https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.Суть методу в тому, що при кожному повторенні циклу “loop()” ми перевіряємо, чи настав час блимати світлодіод (виконувати фонову завдання) чи ні. І якщо настав, то інвертуємо стан світлодіода. Це своєрідний варіант обходу оператора “delay()”.Істотним недоліком даного методу є те, що ділянка коду перед блоком управління світлодіодом повинен виконуватися швидше, ніж інтервал часу мигання світлодіода “ledInterval”. В іншому випадку блимання буде відбуватися рідше, ніж потрібно, і ефекту паралельного виконання завдань ми не отримаємо. Зокрема, в нашому скетчі тривалість зміни звуку сирени становить 200+200+200+200 = 800 мсек, а інтервал миготіння світлодіодом ми поставили 200 мсек. Але світлодіод буде мигати з періодом 800 мсек, що в 4 рази відрізняється від того, що ми задали. Взагалі, якщо в коді використовується оператор “delay()”, в такому випадку важко зімітувати псевдо-паралельність, тому бажано його уникати.В даному випадку потрібно було б для блоку управління звуком сирени також перевіряти, прийшов час чи ні, а не використовувати “delay()”. Але це б збільшило кількість коду і погіршило сприйняття програми.

Мигание светодиодом без оператора delay()

4. Щоб вирішити поставлене завдання, скористаємося чудовою бібліотекою ArduinoThread, яка дозволяє з легкістю створювати псевдо-паралельні процеси. Вона працює схожим чином, але не дозволяє писати код по перевірці часу – потрібно виконувати завдання в цьому циклі або не потрібно. Завдяки цьому скорочується обсяг коду і поліпшується читаність скетчу. Давайте перевіримо бібліотеку в дії.Першим ділом завантажити з офіційного сайту https://github.com/ivanseidel/ArduinoThread/archive/master.zip архів бібліотеки і разархивируем його в директорію “libraries” середовища розробки Arduino IDE. Потім перейменуємо папку “ArduinoThread-master” в “ArduinoThread”.

Установка библиотеки ArduinoThread

5. Схема підключень залишиться колишньою. Зміниться лише код програми. Тепер він буде такий, як на урізанні. В програмі ми створюємо два потоку, кожен виконує свою операцію: один блимає світлодіод, другий керує звуком сирени. В кожній ітерації циклу для кожного потоку перевіряємо, чи настав час його виконання чи ні. Якщо прийшов – він запускається на виконання за допомогою методу run()”. Головне – не використовувати оператор “delay()”.У коді дано більш докладні пояснення.Завантажимо код в пам’ять Ардуїнов, запустимо. Тепер все працює в точності так, як треба!

Управление пищалкой и светодиодом параллельно с помощью потока

НАПИСАТИ ВІДПОВІДЬ

Please enter your comment!
Please enter your name here