Librarytutorial програмування Ардуіно
Створення власної бібліотеки для Ардуіно
Цей документ допоможе розібратися, як створювати бібліотеки для Ардуіно. Спочатку буде розглянута програма, що генерує сигнали азбуки Морзе, а потім дані пояснення, як винести її функції в окрему бібліотеку. Використання бібліотек дозволяє іншим людям використовувати написаний вами код, а також легко оновлювати його в міру виходу нових версій вашої бібліотеки.
Почнемо з програми, що генерує простий сигнал азбуки Морзе:
Якщо запустити цю програму, то можна переконатися, що вона подає сигнал SOS (сигнал лиха) світлодіодом, підключеним до 13 висновку.
У програмі є кілька ділянок, які нам необхідно об'єднати в бібліотеку. По-перше, звичайно ж, це функції dot () і dash (). які і формують сигнал. По-друге, це змінна pin. яка використовується функціями для того, щоб знати, з яким саме висновком необхідно працювати. І, нарешті, в програмі є виклик функції pinMode (). яка змушує працювати вказаний висновок в якості виходу.
Пора б зробити з нашої програми бібліотеку!
Для цього вам знадобиться, щонайменше, два файли: заголовки (з розширенням .h) і файл з вихідним кодом (з розширенням .cpp). Заголовки є опис бібліотеки: найчастіше, це просто список всього, що в ній є. Файл-початківець містить безпосередньо програмний код бібліотеки. Назвемо нашу бібліотеку "Morse", відповідно, наш заголовки буде "Morse.h". Давайте подивимося, що всередині цього файлу. Спочатку вміст файлу може здатися вам трохи дивним, проте все стане на свої місця, як тільки ви побачите исходник, що йде "в комплекті".
Структура заголовки являє собою набір рядків, кожна з яких відповідає одній функції бібліотеки. Ці рядки знаходяться всередині класу, який також може включати в себе всі необхідні змінні:
Клас - це просто набір функцій і змінних, зібраних в одному місці. Ці функції і змінні можуть бути загальнодоступними (public) - тобто можуть викликатися людьми, які працюють з вашою бібліотекою, або внутрішніми (private) - які видно тільки в межах самого класу. У кожного класу є спеціальна функція, яка називається конструктором (constructor), яка призначена для створення екземпляра (instance) класу. Конструктор має таке ж ім'я, як і клас, і не повертає ніяких значень.
І останнє: загальноприйнято укладати весь вміст заголовки в дивну конструкцію:
По суті, це запобігає можливим проблемам на випадок, якщо хтось підключить вашу бібліотеку двічі.
Давайте поглянемо на заголовки і подивимося, що у нас вийшло:
А тепер давайте розберемо вміст вихідного файлу - Morse.cpp.
Потім йде конструктор, який описує, що має статися, коли хтось створить екземпляр вашого класу. В даному випадку користувач вказує, який саме висновок він хотів би використовувати. Ми конфігуруємо цей висновок як вихід і зберігаємо його у внутрішню змінну для подальшого використання в інших функціях:
Далі йде сам код з початкової програми (ну нарешті!). Він виглядає абсолютно точно так же, за винятком приставки Morse :: перед іменами функцій і змінної _pin замість pin:
І це все, що необхідно зробити (є ще деякі можливості, але ми поговоримо про них трохи пізніше). Тепер спробуємо нашу бібліотеку в дії.
Перш за все, створіть папку Morse в директорії libraries всередині вашої робочої папки з проектами. Скопіюйте або перенести файли Morse.h і Morse.cpp в створену папку. Тепер запустіть середу розробки Ардуіно - в меню Sketch> Import Library ви повинні побачити бібліотеку Morse. Вона буде автоматично компілюватиметься разом з використовують її програмами. Якщо цього не станеться - перевірте її розширення і переконайтеся, що файл дійсно має формат .cpp або .h (без додаткових розширень на зразок .pde або .txt, наприклад).
Спробуємо переписати нашу стару програму "SOS" з використанням нової бібліотеки:
У порівнянні з попередньою версією в програмі з'явилося кілька відмінностей (крім того факту, що частина коду перенесена в бібліотеку).
По-перше, ми додали оператор #include в початок програми, який включає бібліотеку Morse в відправляється платі код. Тому, якщо в програмі бібліотека більше не використовується, бажано видалити #include для економії пам'яті мікроконтролера.
По-друге, тепер ми створюємо екземпляр класу Morse з ім'ям morse:
При виконанні цього рядка (а фактично, це станеться навіть до функції setup ()) буде викликаний конструктор класу Morse, якому буде передано вказаний тут аргумент (в даному випадку 13).
Зверніть увагу, що тепер наша функція setup () порожня, оскільки виклик pinMode () в даному випадку відбувається всередині бібліотеки (при створенні екземпляра класу).
Ну і нарешті, виклик функцій dot () і dash () тепер необхідно випереджати префіксом morse. - ім'ям того примірника, який ми хочемо використовувати. Ми можемо створити кілька примірників класу Morse, кожен зі своїм висновком, що зберігається у внутрішній змінної _pin тільки в межах цього примірника. Вказуючи певний екземпляр класу при виконанні функції, ми тим самим ставимо, змінними якого примірника повинна оперувати та чи інша функція. Тобто, якщо у нас два примірника:
то всередині функції morse2.dot () змінна _pin буде дорівнює 12.
При написанні нової програми, ви, напевно помітите, що середовище розробки не розпізнає і не підсвічує елементи створеної нами бібліотеки. На жаль, IDE Ардуіно не вміє автоматично розпізнавати і інтерпретувати те, що ми оголосили всередині бібліотеки (до речі, було б добре додати цю функцію), тому їй потрібно трохи допомогти. Для цього створіть файл keywords.txt в директорії Morse і запишіть в нього наступне:
Кожен рядок повинен містити ключове слово, символ табуляції (не пробілів) і тип ключового слова. Класи підсвічуються оранжевим і повинні мати тип KEYWORD1; функції - коричневим і повинні бути типу KEYWORD2. Для того, щоб внесені зміни вступили в силу, необхідно перезапустити середу Ардуіно.
Якщо ви захочете подивитися готову бібліотеку (з прикладом і ключовими словами) - можна сказати її звідси: Morse.zip.
На сьогодні, мабуть, це все, але найближчим часом можливо з'явиться розширене керівництво по створенню бібліотек. А тим часом, якщо у вас виникнуть проблеми або з'являться пропозиції, будь ласка, пишіть їх на форум.