Для чего нужны библиотеки для ардуино

Библиотеки

Очень часто одни и те же части кода кочуют из программы в программу. Например, код для работы с датчиком. Чтобы не писать этот код каждый раз заново, его выносят в отдельные файлы — библиотеки. Огромное количество готового кода уже написано другими людьми, и с помощью библиотек его можно легко использовать в своих программах.

Подключение библиотек

Библиотеки в составе Arduino IDE

Очень много готовых библиотек уже содержатся в среде Arduino IDE. Добавить библиотеку в свой код можно из меню Эскиз Импорт библиотек… Название библиотеки :

После выбора пункта «Servo» IDE сама вставит в код нужные строчки:

Конечно, если вы знаете название нужной библиотеки, можно просто написать в самом верху скетча #include — результат будет тем же самым.

Чтобы посмотреть пример работы с библиотекой из состава Arduino IDE, необходимо выбрать в меню Файл Образцы Название библиотеки Название примера

Сторонние библиотеки

Библиотек для Arduino действительно очень много. И только незначительная часть из них входит в среду программирования Arduino IDE. Многие библиотеки можно найти на сайте GitHub.

Давайте попробуем добавить в свой проект библиотеку для работы с четырёхразрядным индикатором. На странице описания товара есть ссылка на библиотеку для работы с ним. Если зайти на страницу библиотеки, можно увидеть множество файлов библиотеки и примеры работы с ней. Но нас пока будет интересовать только кнопка Download ZIP : После нажатия на неё начнётся загрузка .zip-архива со всеми файлами библиотеки. В данном случае это будет файл QuadDisplay-master.zip . Название библиотеки может состоять только из латинских букв и цифр, при этом название не может начинаться с цифры, поэтому давайте сразу переименуем наш архив. Теперь он будет называться QuadDisplay.zip .

После загрузки архива нужно зайти в Arduino IDE и выполнить импорт библиотеки в вашу рабочую папку Sketchbook/libraries , в которой должны находится все сторонние библиотеки. Сделать это можно прямо из среды программирования в меню Эскиз Импорт библиотек… Добавить библиотеку… : Откроется диалоговое окно, в котором необходимо выбрать наш архив QuadDisplay.zip и нажать кнопку Open . Готово. Теперь библиотеки можно добавлять в код. Примеры работы с библиотекой доступны в меню Файл Sketchbook libraries Название библиотеки Название примера

В Arduino 1.6.7 и выше: Файл Примеры Название библиотеки Название примера

Создание библиотеки

Обычно при создании библиотеки создаются два файла: заголовочный файл и файл с кодом библиотеки. Давайте попробуем написать библиотеку, которая позволяла бы нам посчитать площадь круга. Создадим в директории %Sketchbook%\Arduino\libraries папку с названием нашей библиотеки (название может состоять только из латинских букв и цифр, но при этом не может начинаться с цифры). Назовём нашу библиотеку circleArea. Перейдём в созданную нами папку %Sketchbook%\Arduino\libraries\circleArea и создадим там два файла:

Код circleArea.h будет таким:

Код circleArea.cpp будет таким:

Использование библиотеки в скетче будет таким:

Источник

Библиотеки. Расширяем возможности контроллера

В этом уроке

  • Что такое библиотеки и для чего они нужны
  • Установка и подключение библиотек
  • Работа с библиотекой iarduino_I2C_Motor

Видео версия урока

Назначение библиотек

Некоторым модулям для работы необходимы библиотеки. Один из таких модулей — наш мотор, поэтому сейчас необходимо сказать пару слов о библиотеках и научиться их подключать. Это не займёт много времени.

Как и многие другие платформы, среда программирования Arduino IDE может существенно расширять свои возможности за счет использования библиотек. Они позволяют использовать дополнительные функции, что зачастую сильно облегчает процесс написания программы. Такие функции могут использоваться, например, для управления модулями.

В Arduino IDE ряд библиотек установлен автоматически вместе со средой разработки, но Вы также можете скачивать или создавать собственные библиотеки.

Подключение библиотек в Arduino IDE

Для управления моторами нам понадобится библиотека iarduino_I2C_Motor. Её нужно скачать самостоятельно. После этого её необходимо установить согласно нашей инструкции ниже. Если возникнут вопросы, прочитайте нашу подробную инструкцию по установке библиотек.

1) Войдите в меню «Скетч» и наведите курсор на строку «Подключить библиотеку».

2) «Подключить библиотеку». При наведении курсора на подменю справа отобразится список доступных библиотек. Для того, чтобы добавить новую, нажмите «Добавить .ZIP библиотеку».

3) «Добавить библиотеку». Укажите путь к заранее скачанному архиву с библиотекой и дважды щелкните клавишей мыши по файлу.

4)«Библиотека добавлена». После того, как архив будет загружен, в области уведомлений Вы увидите сообщение о том, что библиотека загружена. Найти её Вы можете в меню «Скетч» → подменю «Подключить библиотеку».

Давайте сразу скачаем и подключим все библиотеки, которые нам понадобятся при работе с машинкой. Так нам не придётся при использовании нового модуля возвращаться к этому уроку.

Скачайте и установите аналогично iarduino_I2C_Motor следующие библиотеки:

  1. iarduino_HC_SR04 — для работы с ультразвуковым датчиком расстояния;
  2. iarduino_HC_SR04_tmr — вторая библиотека для работы с ультразвуковым датчиком расстояния (пояснение ниже);
  3. iarduino_IR — для работы с инфракрасным приёмником;
  4. iarduino_I2C_IR— вторая библиотека для работы с инфракрасным приёмником (пояснение ниже);
  5. iarduino_I2C_Bumper — для работы с модулем Бампер-датчик линии;
  6. iarduino_I2C_Matrix_8x8 — для работы с матрицей 8х8;
  7. iarduino_I2C_Track — для работы с дорожными знаками и светофорами;
  8. iarduino_I2C_Address — для установки адресов модулей серии I2C-flash.

Убедитесь, что библиотеки добавлены. Все они должны быть в списке:

Щелкните клавишей мыши по строке с именем нужной библиотеки, и она будет добавлена в скетч. Кстати, в меню «Файл», подменю «Примеры» можно увидеть примеры работ с библиотеками. Там можно найти уже готовые интересные и полезные скетчи, обязательно загляните туда.

Как Вы заметили, мы установили по две библиотеки для работы с ультразвуковым датчиком расстояния и инфракрасным приёмником. Вторые библиотеки пригодятся нам в следующей главе, сейчас мы просто установили их заранее.

Проверка модулей-моторов. Функции управления моторами

Теперь, после того как библиотека для работы с модулем-мотором подключена, мы можем загрузить в контроллер небольшой скетч, который позволит вращать колесо сначала в одну сторону, а затем — в другую (напомним, мы пока подключили только правое колесо).

  1. Директива #include(1, 2 строки) используется для подключения библиотек в наш скетч. Некоторые библиотеки уже установлены в Arduino IDE, а некоторые нужно установить самостоятельно, как мы делали ранее. Однако, все они подключаются с помощью этой директивы.
  2. Библиотека Wire .h позволяет работать с шиной I2C (именно по ней передаётся сигнал управления модулями). Библиотека уже установлена в нашу среду разработки.
  3. Библиотека iarduino_I2C_Motor .h. Библиотека добавляет удобные функции управления моторами. Постепенно мы с ними познакомимся.
  4. iarduino_I2C_Motor mot(0x09);(3 строка). С помощью подключенной нами библиотеки iarduino_I2C_Motor создаём объект мотора с именем mot. Объект имеет имя и свойства. Одно из свойств — адрес. В нашем случае — 0х09 (это просто номер, записанный в шестнадцатеричной системе счисления).
  5. mot.setSpeed(100,MOT_PWM); (9 строка) setSpeed() — это одна из тех удобных функций управления мотором, про которые мы писали выше. В неё передаётся два параметра: скорость (в нашем случае 100%) и способ её задания. MOT_PWM означает, что число, переданное в функцию, — это процент заполнения ШИМ. Чем меньше число, тем медленнее вращается колесо. Подробнее про ШИМ мы расскажем позже.

Отлично! У машинки вращается одно колесо, правда, так далеко не уедешь. Теперь можете попробовать подключить левое колесо к плате и снова включить машинку. Теперь оба колеса вращаются, но в разные стороны, а машинка крутится на месте. Но ведь это совсем не то, чего мы хотели, что же произошло? С этим мы разберёмся в следующем уроке.

Источник

Пишем свою библиотеку под Arduino

Одна из довольно сильных сторон любого программного обеспечени — это возможность единожды написанной программы быть использованной многократно как в виде отдельных частей, так и целиком, что и привело к зарождению концепции «библиотеки».

Можно сказать, что она вполне вписывается в общую парадигму развития цивилизации, которая позволила человеку стать царём дикой природы и обеспечила технический, культурный и интеллектуальный прогресс — это накопление информации и возможность поделиться ею с другими людьми.

Итак, как вы уже поняли, в этом рассказе пойдёт речь о библиотеках. Если бы мы попытались охватить тему библиотек под разные платформы и языки, то это получился бы чудовищных размеров рассказ, поэтому ограничимся небольшой сферой — библиотеками для Arduino.

Рано или поздно любой проект для Arduino сталкивается с тем, что необходимо снова и снова использовать отдельные компоненты кода, так как они не только отработаны и содержат в себе удачные решения, но и к тому же разработчику хорошо знакомы.

Такие фрагменты имеет смысл упаковывать в библиотеки, кроме того, если над одним и тем же проектом работает несколько человек, можно с лёгкостью поделиться своими наработками с другими (не забыв дать им описание API, кстати говоря, подробнее расскажу об этом чуть ниже).

Если вы до этого уже интересовались сутью библиотек и пытались разбирать существующие библиотеки Arduino, то наверняка успели заметить, что они состоят из двух отдельных файлов, один из которых имеет расширение .cpp — что означает «С Plus Plus». Так как язык Wiring для Arduino базируется, по сути, на языке C++, то и решили создавать файлы с таким расширением. Видимо, создатели подумали, что «а ещё это просто красиво» ©. Второй же компонент библиотеки имеет расширение .h ( «Headers»):

  • Файл .cpp — называется файлом реализации.
  • Файл .h — называется файлом заголовков.

Теперь рассмотрим эту концепцию разделения на два файла на примере конкретного кода.

Допустим, что у нас есть некий код, который управляет двигателями. Этот код состоит из ряда участков, среди которых инициализация каких-то переменных и какая-то функция:

В принципе, весь этот код мы можем поместить в файл реализации, то есть с расширением .cpp.

Я специально в качестве кода для примера взял код для esp32 (чуть ниже поясню почему).

Как можно было видеть в коде выше, в его начале расположены стандартные строки #include , которые импортируют библиотеки, используемые в вашем коде. То есть если ваша библиотека является своего рода надстройкой над чужим кодом, то в файле реализации, как и в обычном скетче, необходимо поместить импорты этих библиотек.

Те, кто давно работает с esp32, знают, что у неё некоторые функции отличаются от стандартных Arduino, теоретически мы могли бы не помещать в этот код импорт стандартных функций Arduino (ведь железка-то отличается!), но это будет неверно, так как в любом случае для инициализации пинов мы используем стандартную функцию pinMode() , кроме того, используется стандартная digitalWrite() . Поэтому, хочешь не хочешь, нам придётся включить строку:

Повторюсь, всё как и в обычном скетче: подключаем только те библиотеки, которые реально используются в вашем коде.

Далее мы обратим внимание вот на какой момент. Дело в том, что любая работа с какой-либо периферией требует её подключения с использованием вышеназванной функции pinMode() как минимум, а есть ещё разнообразные настройки, как в нашем случае.

На первый взгляд всё хорошо и в файле присутствует подключение периферии. Однако самые внимательные уже заметили, что обычно подключение периферии в скетче у нас происходит внутри блока setup () <> .

Однако в данном случае мы работаем над созданием библиотеки, и здесь никакого блока setup () <> не существует, и если мы попытаемся оставить всё как есть, и функции подключения периферии останутся лежать «просто так, снаружи», то код с подключённой нашей самодельной библиотекой не сможет скомпилироваться, и компилятор выдаст ошибку, если мы используем вот такое содержимое файла реализации (.cpp):

Я сейчас говорю вот об этом участке, который лежит как «не пришей кобыле хвост»:

И что же делать в таком случае? А вот что: необходимо функции инициализации пинов обернуть в функцию! То есть они не должны лежать снаружи, их нужно поместить внутрь функции (setupMotors() ) :

Такой код благополучно скомпилируется, после того как мы создадим библиотеку, подключим её, а после вызовем вот эту функцию, внутри блока setup :

Есть общее правило: если требуется некий функционал, который должен быть вызван внутри блока setup (для инициализации чего-либо), то он обязательно должен быть обёрнут в функцию.

По сути, ваш файл реализации готов, и мы перейдём к файлу заголовков — с расширением .h.

Для создания файла заголовков вам всего лишь нужно перенести туда названия ваших функций из файла с расширением .cpp в виде простого списка, с точкой с запятой в конце каждой строки:

Файл тоже готов.

Кстати говоря, тут интересный момент: вы сами определяете, какие функции будут доступны «снаружи» для пользователей! То есть этот набор функций, перечисленных в файле с расширением .h — и есть Application Programming Interface (API), то есть набор способов, с помощью которых можно взаимодействовать с вашей программой. Причём, как я уже говорил, у вас в файле реализации могут внутри быть ещё и другие функции, которые вы просто не пожелали дать для использования. Имеете право, почему нет.

А теперь посмотрим чуть более сложный пример, «объектно-ориентированное программирование» у нас или где :)

Допустим, у нас более сложная ситуация и мы не просто разделяем реализацию функций и их перечисление, а хотим сформировать полноценный класс, который содержит некий функционал (то бишь, раз в этот раз мы говорим уже о классе, то это у нас уже не функции, а методы, так будет более корректно).

На самом деле, даже в этой ситуации, код ненамного усложнится:

  • Принципиально подобная библиотека, содержащая класс, также будет состоять из двух отдельных файлов, сохранённых с расширениями .cpp и .h.
  • Вся реализация методов также будет собрана в файле .cpp.
  • Сами методы также будут перечислены в файле с расширением .h.

Нюанс будет заключаться в том, что в файле заголовков (.h) у нас будет находиться сам класс, внутрь которого мы и поместим эти методы.

Чтобы всё это было несколько интересней, мы можем даже немного усугубить ситуацию, добавить модификаторы доступа: public и protected .

В результате всё это будет выглядеть примерно так. Файл реализации (.cpp):

Ну и напоследок, если мы хотим, чтобы наша библиотека была «совсем модной», то можем включить туда предварительно настроенные примеры, чтобы люди могли сразу понять, как им взаимодействовать с этой библиотекой. Для этого необходимо в директории, где находится два основых файла этой библиотеки (.cpp и .h), создать ещё и отдельную папку под названием examples, внутри которой в отдельную, совпадающую по названию со скетчем папку, положить код вашего примера.

Таким образом, путь до вашего примера будет выглядеть следующим образом:

Но мало создать библиотеку, необходимо её ещё и положить в специальное место, для того чтобы среда разработки могла её увидеть:

  • В первом случае вы можете подключить заархивированную библиотеку изнутри Arduino IDE, пройдя по пути: скетч-подключить библиотеку-добавить zip. библиотеку .
  • Во втором случае вы можете просто положить её стандартную папку библиотек Arduino: C:\Arduino\libraries
  • Или если вы используете portable-версию среды разработки (т.к. я, например, ношу её везде с собой на флешке, и она не требует установки), то положить сюда: C:\arduino-1.8.19\portable\sketchbook\libraries (в моём случае используется версия Arduino 1.8.19 – у вас может быть другая).

Как «вишенку на торте», мы можем настроить подсветку ключевых слов, так как, к сожалению, для импортированных библиотек подсветка автоматом не срабатывает. Для этого необходимо создать .txt файл, который надо положить рядом с вашими двумя файлами .cpp и .h

В этом файле мы пишем, разделяя с помощью TAB-клавиши клавиатуры, определённое понятие и цвет его подсветки.

У нас есть 3 варианта подсветки:

  • KEYWORD1: толстый оранжевый шрифт (классы, типы данных).
  • KEYWORD2: оранжевый шрифт (методы, функции).
  • LITERAL1: голубой шрифт (константы).

Например, содержимое этого .txt файла может выглядеть следующим образом:

Вот таким нехитрым образом мы можем обеспечить как многократное использование удачного кода, так и лёгкое его «расшаривание» тем, кто работает в этом же направлении.

НЛО прилетело и оставило здесь промокод для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS .

Источник

Adblock
detector