Arduino ide создание библиотеки
Arduino использует C++, поэтому, библиотеку придётся писать на этом языке. Для новой библиотеки нужно создать дополнительный класс с кодом, который будет взаимодействовать с устройством.
Нам понадобится один заголовочный файл .h, в котором будет описан ваш класс с функциями, константами. А также второй файл .cpp, в котором все эти объявленные функции и константы реализуются.
Для начала создадим в папке ..\libraries собственную папку с именем библиотеки, например, Kitty.
Внутри папки Kitty создаём файлы kitty.h и kitty.cpp.
Библиотеки нужно писать на C++. Если внутри нашей библиотеки используем какие-нибудь функции или объекты из стандартной библиотеки Arduino, то следует подключать соответствующий заголовочный файл Arduino.h.
Есть два используемых способа создания класса. Если экземпляр класса может быть только один, то объявляется экземпляр в этом же .h-файле. Примеры таких классов - HardwareSerial, Serial.
Заголовочный файл не содержит выполняемого кода, а лишь определяет имена классов и методов в библиотеке.
Полностью заголовочный файл будет следующего содержания.
Закрытый раздел private содержит переменную. В нашем примере она просто для демонстрации и не используется.
В общедоступном разделе public указаны конструкторы и методы.
Теперь реализуем созданные функции в файле kitty.cpp:
Теперь нужно перезапустить Arduino IDE, если она у вас была запущена. Откройте меню Sketch | Include Library. Если всё было сделано правильно, то увидите собственную библиотеку.
После создания библиотеки вы можете вносить изменения, которые будут учитываться автоматически.
Если выбрать свою библиотеку, то в скетче появится строка:
Это означает, что библиотека подключена и мы можем её использовать в скетче.
Запускаем скетч, открываем Serial Monitor и наблюдаем за мяуканьем кота. Жрать просит!
Правилом хорошего тона считается создать дополнительный файл keywords.txt и папку examples.
Файл keywords.txt содержит объявления ключевых слов вашей библиотеки, имена типов, методов, функций, констант. Это поможет редактору раскрасить указанные слова соответствующими цветами. Синтаксис файла (в качестве разделителя используйте TAB):
Перезапустите Arduino IDE ещё раз. Теперь названия вашего класса и её функций будут подсвечены.
В папке examples создаются примеры использования в формате pde. Создайте необходимый скетч, переименуйте его в нужный формат и снова перезапустите IDE. Примеры станут доступны для использования.
Arduino довольно сильно основан на C ++ (язык программирования). Этот язык основан на вещах, называемых заголовками, функциями и библиотеками. Эти вещи, фактически, переносятся и используются в Arduino. Как правило библиотеки включаются в самое начало вашего кода и используются для упрощения кода всего проекта, например:
Большинство нужных библиотек вы можете найти на нашем сайте в разделе Библиотеки. В этом уроке мы продемонстрируем, как создать собственную библиотеку для Ардуино.
Шаг 1. Программное обеспечение
Существует много специализированного программного обеспечения, которое вы можете использовать для этого, но ваш основной текстовый редактор - это «Блокнот», которого вполне достаточно для работы.
Вы также можете попробовать что-то вроде Notepad++, VSCode. Мы обычно используем Sublime Text 3 для программирования.
Шаг 2. Код Arduino
Это базовый эскиз Blink для включения встроенного светодиода:
Этот код не очень сложный, и ему вообще не нужна библиотека. Однако, ради демонстрации, мы все равно сделаем это.
Шаг 3. Создание библиотеки
- Найдите где расположена папка «библиотеки» (Arduino > Библиотеки / Arduino > Libraries).
- Создайте новую папку под названием "MyLibrary", но не оставляйте кавычки.
- В папке, которую вы только что создали, создайте новый .txt документ под названием "BlinkLED".
- Сохраните файл с расширением .h.
- Повторите, но с расширением .cpp.
Код для .h файла:
Код для .cpp файла:
Теперь сохраните оба файла и выйдите.
Шаг 4. Встраивание библиотеки
Закройте Arduino IDE и снова откройте её. Перейдите в:
Sketch > Include Library / Включить Библиотеку
Прокрутите страницу вниз до "Contributed Libraries". Вы должны увидеть одну из них под названием MyLibrary. Нажмите на нее, и вы увидите:
Если появится вышеприведенный код, то это значит мы на правильном пути. Просто загрузите остальную часть кода.
Теперь единственное, что присутствует в loop(), - это функция, которую мы сделали ранее в нашем .cpp-файле. Все, что вам нужно сделать, это указать контакт, к которому подключен ваш светодиод и частоту, с которой вы хотите чтобы он мигал.
Вместо того, чтобы объявить вывод и сказать ему, чтобы он включался и выключался, мы просто используем нашу библиотеку. Все, что вам нужно сделать, это сказать, какой контакт и как часто включать светодиод.
Если вы хотите, чтобы ваша библиотека делала больше, чем просто мигала светодиодом, все, что вам нужно сделать, это отредактировать два файла, которые мы создали ранее. Если вы заинтересованы в создании более сложных библиотек, вам может помочь изучение C++.
На примере библиотеки для работы с PS/2-устройствами можно оценить как здорово работать через библиотеку :)
Раз подключил и готово :)
Разумеется, нужно ещё разобраться что к чему, но главное – библиотека – это очень удобно :) Поэтому, давайте научимся создавать собственную библиотеку для ардуино :)
Как мы помним, ардуина программируется на C++, поэтому, как Вы уже догадались, библиотека – это всего-навсего дополнительный класс, который инкапсулирует в себе функции для работы с устройством :)
Т.о. для создания библиотеки нужно будет создать, как минимум, один .h файл в котором будет описываться Ваш класс/функции/ константы и один .cpp, в котором все эти функции реализуются :)
Итак, создаём в библиотечной директории Arduino IDE (\hardware\libraries\) папку RoboCraft – так по-скромному будет называться наша библиотека :)
Для Arduino IDE 0017 свои библиотеки можно хранить в директории libraries, находящейся в каталоге с пользовательскими скетчами (путь указывается через File — Preferences, строчка Sketchbook location )
А внутри нашей новой директории создаём наши файлы
robocraft.h и robocraft.cpp
Ну что – можно сказать половина дела сделана :)
Библиотеки компилируется без дополнительных преобразований, поэтому их нужно писать на «чистом C++» и поэтому если внутри нашей библиотеки мы захотим использовать какие-нибудь функции или объекты из стандартной библиотеки Arduino, то нам нужно подключать соответствующий заголовочный файл («Arduino.h» (в старых версиях IDE: «WConstants.h», «WProgram.h»))
На всякий случай, напишем:
код оформляется в виде класса и если по смыслу выполняемых задач экземпляр этого класса может быть только один, то заодно происходит объявление этого экземпляра в .h файле.
Помните, как в классе HardwareSerial – у нас один COM-порт и экземпляр класса там же и объявляется:
Пора писать код :)
Для начала, напишем что-нибудь простое, вроде обычного в таких случаях “Hello world”-а :)
— robocraft.h —
— robocraft.h end — , а теперь реализуем эти функции:
— robocraft.cpp — — robocraft.cpp end — Остаётся перезапустить Arduino IDE и с удовольствием отметить появление нового класса (меню Sketch – Import Library ) :)
При выборе нашего (да и любого другого) класса – всего лишь появляется строчка
допишем необходимые setup и loop:
Пробуем скомпилировать – «Done compiling» — с чем нас и поздравляю – наш класс работает! :)
Однако, заглянув в папку к любому другому классу в глаза бросаются файл keywords.txt и директория examples
Попробуем разобраться.
Файл keywords.txt содержит объявления ключевых слов вашей библиотеки, имена типов, методов, функций, констант – это нужно, чтобы редактор “раскрашивал” их соответствующими цветами. Синтаксис у файла простой — вот пример (разделитель — TAB):
Сохраним этот keywords.txt в каталог с нашей библиотекой и перезапустим Arduino IDE
— сравните с предыдущим скриншотом – название нашего класса и функция hello() теперь подсвечиваются! :)
Теперь остаётся добавить к нашей библиотеке нужных и полезных примеров использования.
Для этого создаём директорию examples, а в ней поддиректории с примерами в формате .pde.
Например, скопируем туда наш скетч в директорию hello_robocraft и переименуем его аналогично в hello_robocraft.pde
В очередной раз перезапускаем Arduino IDE и видим, доступность нашего примера :)
Замечательно! Заготовка для нашей робототехнической библиотеки создана! :)
Этот документ поможет разобраться, как создавать библиотеки для Ардуино. Сначала будет рассмотрена программа, генерирующая сигналы азбуки Морзе, а затем даны пояснения, как вынести ее функции в отдельную библиотеку. Использование библиотек позволяет другим людям использовать написанный вами код, а также легко обновлять его по мере выхода новых версий вашей библиотеки.
Начнем с программы, генерирующий простой сигнал азбуки Морзе:
Если запустить эту программу, то можно убедиться, что она подает сигнал SOS (сигнал бедствия) светодиодом, подключенным к 13 выводу.
В программе есть несколько участков, которые нам необходимо объединить в библиотеку. Во-первых, конечно же, это функции dot() и dash(), которые и формируют сигнал. Во-вторых, это переменная pin, которая используется функциями для того, чтобы знать, с каким именно выводом необходимо работать. И, наконец, в программе есть вызов функции pinMode(), которая заставляет работать указанный вывод в качестве выхода.
Пора бы сделать из нашей программы библиотеку!
Для этого вам понадобится, по меньшей мере, два файла: заголовочный файл (с расширением .h) и файл с исходным кодом (с расширением .cpp). Заголовочный файл представляет собой описание библиотеки: чаще всего, это просто список всего, что в ней есть. Файл-исходник содержит непосредственно программный код библиотеки. Назовем нашу библиотеку "Morse", соответственно, наш заголовочный файл будет "Morse.h". Давайте посмотрим, что внутри этого файла. Поначалу содержимое файла может показаться вам немного странным, однако все станет на свои места, как только вы увидите исходник, идущий "в комплекте".
Структура заголовочного файла представляет собой набор строк, каждая из которых соответствует одной функции библиотеки. Эти строки находятся внутри класса, который также может включать в себя все необходимые переменные:
Класс - это просто набор функций и переменных, собранных в одном месте. Эти функции и переменные могут быть общедоступными (public) - т.е. могут вызываться людьми, работающими с вашей библиотекой, или внутренними (private) - которые видны только в пределах самого класса. У каждого класса есть специальная функция, называемая конструктором (constructor), которая предназначена для создания экземпляра (instance) класса. Конструктор имеет такое же имя, как и класс, и не возвращает никаких значений.
И последнее: общепринято заключать все содержимое заголовочного файла в странную конструкцию:
По сути, это предотвращает возможные проблемы на случай, если кто-то подключит вашу библиотеку дважды.
В завершение, наверху библиотеки обычно располагают комментарий, содержащий название библиотеки, краткое описание того, что она делает, автора, дату создания и тип лицензии.
Давайте взглянем на заголовочный файл и посмотрим, что у нас получилось:
А теперь давайте разберем содержимое исходного файла - Morse.cpp.
Затем идет конструктор, который описывает, что должно произойти, когда кто-то создаст экземпляр вашего класса. В данном случае пользователь указывает, какой именно вывод он хотел бы использовать. Мы конфигурируем этот вывод в качестве выхода и сохраняем его во внутреннюю переменную для последующего использования в других функциях:
В этом коде есть непонятные моменты. Во-первых, конструкция Morse:: перед именем функции. Это значит, что функция является частью класса Morse. То же самое вы увидите при объявлении других функций этого класса. Второй момент - это знак подчеркивания в имени нашей внутренней private-переменной, _pin. Вообще-то эта переменная может иметь любой имя, главное, чтобы она соответствовала имени, объявленному в заголовочном файле. Добавление подчеркивания перед именем переменной - это общепринятая методика, применяющаяся для того, чтобы явно отличать private-переменные. Кроме того, подчеркивание позволяет программе отличить private-переменную от аргумента функции (pin в данном случае).
Далее идет сам код из первоначальной программы (ну наконец-то!). Он выглядит абсолютно точно так же, за исключением приставки Morse:: перед именами функций и переменной _pin вместо pin:
В завершение, хорошим тоном считается добавление комментария в начале исходного файла. Посмотрим что получилось:
И это все, что необходимо сделать (есть еще некоторые возможности, но мы поговорим о них чуть позже). Теперь попробуем нашу библиотеку в действии.
Прежде всего, создайте папку Morse в директории libraries внутри вашей рабочей папки с проектами. Скопируйте или переместите файлы Morse.h и Morse.cpp в созданную папку. Теперь запустите среду разработки Ардуино - в меню Sketch > Import Library вы должны увидеть библиотеку Morse. Она будет автоматически компилироваться вместе с использующими ее программами. Если этого не произойдет - проверьте ее расширение и убедитесь, что файл действительно имеет формат .cpp или .h (без дополнительных расширений вроде .pde или .txt, например).
Попробуем переписать нашу старую программу "SOS" с использованием новой библиотеки:
По сравнению с предыдущей версией в программе появилось несколько отличий (кроме того факта, что часть кода перенесена в библиотеку).
Во-вторых, теперь мы создаем экземпляр класса Morse с именем morse:
При выполнении этой строки (а фактически, это произойдет даже до функции setup()) будет вызван конструктор класса Morse, которому будет передан указанный здесь аргумент (в данном случае 13).
Обратите внимание, что теперь наша функция setup() пуста, поскольку вызов pinMode() в данном случае происходит внутри библиотеки (при создании экземпляра класса).
Ну и наконец, вызов функций dot() и dash() теперь необходимо предварять префиксом morse. - именем того экземпляра, который мы хотим использовать. Мы можем создать несколько экземпляров класса Morse, каждый со своим выводом, хранимым во внутренней переменной _pin только в пределах этого экземпляра. Указывая определенный экземпляр класса при вызове функции, мы тем самым задаем, переменными какого экземпляра должна оперировать та или иная функция. То есть, если у нас два экземпляра:
то внутри функции morse2.dot() переменная _pin будет равна 12.
При написании новой программы, вы, наверняка заметите, что среда разработки не распознает и не подсвечивает элементы созданной нами библиотеки. К сожалению, IDE Ардуино не умеет автоматически распознавать и интерпретировать то, что мы объявили внутри библиотеки (кстати, было бы хорошо добавить эту функцию), поэтому ей нужно немного помочь. Для этого создайте файл keywords.txt в директории Morse и запишите в него следующее:
Каждая строка должна содержать ключевое слово, символ табуляции (не пробелы) и тип ключевого слова. Классы подсвечиваются оранжевым и должны иметь тип KEYWORD1; функции - коричневым и должны быть типа KEYWORD2. Для того, чтобы внесенные изменения вступили в силу, необходимо перезапустить среду Ардуино.
Также неплохо было бы снабдить библиотеку примером работы с ней. Для этого, создайте папку examples в директории Morse и переместите (либо скопируйте) в нее папку с нашей программой (назовем ее SOS). (Отыскать программу можно с помощью команды Sketch > Show Sketch Folder). Если вы перезапустите среду Ардуино (честно слово, это в последний раз) - то увидите пункт Library-Morse в меню File > Sketchbook > Examples с вашим примером. Можете добавить немного комментариев, объясняющих, как пользоваться вашей библиотекой.
Если вы захотите посмотреть готовую библиотеку (с примером и ключевыми словами) - можно сказать ее отсюда: Morse.zip.
На сегодня, пожалуй, это все, но в ближайшее время возможно появится расширенное руководство по созданию библиотек. А тем временем, если у вас возникнут проблемы или появятся предложения, пожалуйста, пишите их на форум.
Читайте также: