Разработка модулей для arduino

Arduino для начинающих. Часть 1

Предисловие

Доброго времени суток, Хабр. Запускаю цикл статей, которые помогут Вам в знакомстве с Arduino. Но это не значит, что, если Вы не новичок в этом деле – Вы не найдёте ничего для себя интересного.

Введение

Было бы не плохо начать со знакомства с Arduino. Arduino – аппаратно-программные средства для построения систем автоматики и робототехники. Главным достоинством есть то, что платформа ориентирована на непрофессиональных пользователей. То есть любой может создать своего робота вне зависимости от знаний программирования и собственных навыков.

Начало

Создание проекта на Arduino состоит из 3 главных этапов: написание кода, прототипирование (макетирование) и прошивка. Для того, чтоб написать код а потом прошить плату нам необходима среда разработки. На самом деле их есть немало, но мы будем программировать в оригинальной среде – Arduino IDE. Сам код будем писать на С++, адаптированным под Arduino. Скачать можно на официальном сайте. Скетч (набросок) – программа, написанная на Arduino. Давайте посмотрим на структуру кода:

Важно заметить, что обязательную в С++ функцию main() процессор Arduino создаёт сам. И результатом того, что видит программист есть:

Давайте разберёмся с двумя обязательными функциями. Функция setup() вызывается только один раз при старте микроконтроллера. Именно она выставляет все базовые настройки. Функция loop() — циклическая. Она вызывается в бесконечном цикле на протяжении всего времени работы микроконтроллера.

Первая программа

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

Принцип работы этой программы достаточно простой: светодиод загорается на 1 секунду и тухнет на 1 секунду. Для первого варианта нам не понадобиться собирать макет. Так как в платформе Arduino к 13 пину подключён встроенный светодиод.

Прошивка Arduino

Для того, чтоб залить скетч на Arduino нам необходимо сначала просто сохранить его. Далее, во избежание проблем при загрузке, необходимо проверить настройки программатора. Для этого на верхней панели выбираем вкладку «Инструменты». В разделе «Плата», выберете Вашу плату. Это может быть Arduino Uno, Arduino Nano, Arduino Mega, Arduino Leonardo или другие. Также в разделе «Порт» необходимо выбрать Ваш порт подключения (тот порт, к которому вы подключили Вашу платформу). После этих действий, можете загружать скетч. Для этого нажмите на стрелочку или во вкладке «Скетч» выберете «Загрузка» (также можно воспользоваться сочетанием клавиш “Ctrl + U”). Прошивка платы завершена успешно.

Прототипирование/макетирование

Для сборки макета нам необходимы следующие элементы: светодиод, резистор, проводки (перемычки), макетная плата(Breadboard). Для того, чтоб ничего не спалить, и для того, чтоб всё успешно работало, надо разобраться со светодиодом. У него есть две «лапки». Короткая – минус, длинная – плюс. На короткую мы будем подключать «землю» (GND) и резистор (для того, чтоб уменьшить силу тока, которая поступает на светодиод, чтоб не спалить его), а на длинную мы будем подавать питание (подключим к 13 пину). После подключения, загрузите на плату скетч, если вы ранее этого не сделали. Код остаётся тот же самый.

На этом у нас конец первой части. Спасибо за внимание.

Источник

Проекты на Arduino и их моделирование

Многие из вас уже знакомы с таким весьма интересным и удобным в разработке “конструктором” как — Arduino. Эта статья — один из подходов к разработке и реализации проектов на Arduino.

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

Основные этапы проекта

Работа над проектом на базе Arduino, как и робота над любым другим проектом включает в себя стандартные этапы.

Основные действия можно описать следующим образом:

Этап Описание
Идея На этом этапе нам надо понять какие задачи будет решать наше устройство и что от него нужно.
Условия реализации Сколько ресурсов мы готовы потратить и какая итерационная трата самого устройства нам нужна (расходники, электричество).
Элементы Одна из сложных задач, учитывая большое разнообразие элементной базы, — выбор элементной базы. Облегчается за счет следующего этапа.
Моделирование схемы Создание виртуальной схемы/модели, подбор элементов и нахождения ошибок на этапе моделирования.
Скетч Создание программы, которая будет выполняться микроконтроллером. Одна из двух основных составляющих работы схемы, имеет также подпункт об использовании библиотек и алгоритма работы.
Сборка Окончательная сборка схемы, её настройка и проверка выполнения задач.

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

Чтобы n-ный раз не повторять других авторов пишущих про Arduino, далее я рассмотрю именно работу с программой Fritzing.

Больше по теме самой Arduino можно почитать тут, тут или на официальном сайте Arduino.

Моделирование схем

Основная проблема в создании проекта — его описание и моделирование на ранних этапах, так вот с Arduino все гораздо легче!

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

Изучая этему создания проектов на Ардуино, я нашел такую программу как — Fritzing!

Удобный интерфейс бесплатной, по сути, альтернативной IDE для Arduino позволяет смоделировать схему любой сложности и с любыми элементами, которые мы бы хотели. Большинство стандартных элементов уже есть в библиотеке программы, >> свинтить нужный нам элемент >>> Profit!»>много создано сообществом или можем создать сами, благо программа позволяет нам это сделать.


Окно «Добро пожаловать»

Содержит информацию об открытых ранее проектах, возможностях новых версий и изменения программы.


Окно «Макетная плата»

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


Экспорт Макетной платы как изображения


Окно «Принципиальная схема»


Пример завершенной автотрассировки


Окно «Печатная плата»

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


Окно «Код»

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

Программа также может помочь в загрузке кода (скетч) в Arduino и в моделировании печатной платы (разводка дорожек, размещение элементов и т.д.).


Схема с использыванием модуля RFID


Схема с использованием дисплея и модуля барометра

Заключение

Опробовал эту программу в обучении и создании минимальных проектов на базе Arduino и решил поделиться этой удобной и полезной, фактически, IDE для Arduino. В поисках подходящих комплексных программных решений остановился на этой из-за большого функционала программы. Итог — завершенные 7 проектов на базе Arduino!

Источник

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

Как написать свою библиотеку?

В этом уроке мы научимся писать собственные библиотеки для Arduino и разберём некоторые типовые вопросы по взаимодействию кода в библиотеке и кода в скетче (в главном файле программы). Это третий урок, который относится к библиотекам: обязательно прочитайте и усвойте урок про объекты и классы из блока программирования, и урок по использованию библиотек из блока базовых уроков, а также урок про создание функций. В этом уроке мы будем использовать все наши предыдущие знания, так что рекомендую разобраться со всем, что было непонятно. Писать библиотеки очень удобно в текстовом редакторе Notepad++ (официальный сайт) – так называемом блокноте программиста. Данный блокнот распознаёт и подсвечивает синтаксис, умеет в автодополнение текста и расширенный поиск, и многое многое другое. Безумно рекомендую работать именно в нём, если вы не умеете пользоваться Microsoft Visual Studio и прочими серьёзными средами разработки. Также рекомендую к прочтению вот этот урок с сайта Arduino.ru, в нём кратко пошагово рассказывают о создании библиотеки без излишеств. Если будете компилировать пример из этой статьи – замените WProgram.h на Arduino.h.

Разбираемся с файлами

Библиотека – это в первую очередь текстовый файл с кодом, который мы можем подключить в свой скетч и использовать имеющиеся там команды. Библиотека может иметь несколько файлов или даже папок с файлами, но подключается всегда один – главный заголовочный файл с расширением .h, а он в свою очередь подтягивает остальные необходимые файлы. В общем случае библиотека имеет такую структуру (название библиотеки testLib):

  • testLib – папка библиотеки
    • examples – папка с примерами
    • testLib.h – заголовочный файл
    • testLib.cpp – файл реализации
    • keywords.txt – карта подсветки синтаксиса

Иногда файлы .h и .cpp могут находиться в папке src. Все файлы и папки, кроме заголовочного .h, являются необязательными и могут отсутствовать, т.е. библиотека может состоять только из заголовочного файла. В таком виде библиотека лежит в папке со всеми остальными библиотеками и может быть подключена в скетч при помощи команды #include. Вообще есть два места, где программа будет искать библиотеку (именно файл библиотеки):

  • Папка со скетчем
  • Папка с библиотеками

Соответственно команда include имеет два варианта поиска файла, название заключается в <> или “”:

  • #include – будет искать файл в папке с библиотеками
  • #include “файл.h” – попробует найти файл в папке со скетчем, если не найдёт – пойдёт искать в папку с библиотеками

Выглядит это вот так:

Основа библиотеки

Давайте заполним наш файл testLib.h, нашу тестовую библиотеку, минимальным кодом для работы:

Конструкция из директив препроцессора запрещает повторное подключение библиотеки и в целом является необязательной, но лучше не лениться и писать так. Файл библиотеки testLib.h находится в папке testLib в папке со всеми остальными библиотеками. Также мы подключаем основной файл Arduino.h для использования ардуино-функций в своём коде. Если таковых нет – его можно не подключать. Также подключаем testLib.h в наш тестовый скетч, как на скриншоте в прошлой главе. Конструкцию с #ifndef-define вы найдёте практически во всех библиотеках. На текущих версиях IDE (и, соответственно версии компилятора) можно делать так:

Конструкция pragma once говорит компилятору, что данный файл нужно подключить только один раз, это просто короткая альтернатива #ifndef-define. Дальше будем использовать её

Источник

Как написать крупный проект?

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

Улучшаем “Ардуино-код”

Разделить на функции

Используйте функции (урок про функции)! Практически любую часть кода можно обернуть в функцию и вынести из основного цикла. Например:

Эти функции можно располагать во вкладках и группировать по смыслу.

Глобальные переменные

Нужно стремиться к уменьшению количества глобальных переменных в скетче. Во-первых это просто “некрасиво”, а во вторых – в какой то момент могут начаться проблемы с придумыванием уникальных имён и распознаванием их в полотне кода.

Первый шаг – использовать статические переменные там, где это возможно. Самый простой пример – конструкция программного таймера из урока про многозадачность:

Если понадобится несколько таймеров – придётся создать больше переменных и придумывать им названия. Можно вынести каждый таймер в отдельную функцию и в ней сделать переменную статической. Пример с двумя таймерами:

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

Объединим в структуры и упростим имена переменных:

Разделить данные и код

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

Рассмотрим абстрактный пример, в котором две независимые функции обращаются к одной и той же глобальной переменной:

Давайте избавимся от глобальной переменной, например так:

Можно пойти дальше и избавиться даже от локальной переменной:

Использовать классы

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

Разбиваем на файлы

Чтобы проект можно было разделить на несколько файлов, он изначально должен состоять из частей, которые могут функционировать независимо друг от друга и не пересекаться друг с другом. Такую часть можно назвать “подпрограммой”, которая содержат свой код и набор переменных и точно так же может состоять из нескольких файлов. Знакомая история? Ведь именно так и реализованы библиотеки! Библиотека содержит набор инструментов, который не зависит от основной программы может использоваться даже в другом проекте. Используя библиотеку, мы уже разделяем свой проект на несколько файлов.

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

Пример 1

Давайте рассмотрим пример превращения ужасного “винигретного” кода с кучей глобальных переменных и бардаком в главном цикле в понятную программу с отдельными независимыми подпрограммами. В этом примере у нас подключены две кнопки (на пины D2 и D3) и два светодиода (используем бортовой на пине D13 и внешний на D12).

Напишем программу, которая будет:

  • Асинхронно опрашивать кнопки с программным гашением дребезга контактов
  • Мигать светодиодом 1 с периодом, который настраивается кнопками
  • Мигать светодиодом 2 с периодом, который:
    • Задаётся случайно при помощи алгоритма аппаратного рандома
    • Делает это каждые 2 секунды по таймеру

Подробно комментировать код не буду, потому что все используемые конструкции мы уже разбирали в уроках.

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

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

Обработчик кнопки теперь работает следующим образом: возвращает true , если соответствующая кнопка была нажата. В основной программе мы поместим метод click() в условие и будем изменять период светодиода по нему.

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

Теперь достаточно объявить и настроить таймер, а для проверки – опрашивать метод ready() , который вернёт true при срабатывании. Настроить период можно через setPeriod() , а получить – через getPeriod() .

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

Теперь достаточно объявить светодиод с указанием пина и периода мигания и просто вызывать в цикле метод blink() .

Остался у нас алгоритм получения случайных чисел с аналогового пина. Для него класс не нужен, достаточно будет просто вынести функцию в отдельный файл и сделать так, чтобы она принимала номер пина. Здесь нам придётся создать два файла: заголовочный и файл реализации. Переменную генератора мы “спрячем” от основной программы, объявив её как static внутри файла реализации.

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

Программа стала гораздо компактнее, а также занимает меньше памяти: 1618 байт против 1796. Легче почти на 200 байт!

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

И финальная программа:

Пример 2

Далее давайте вспомним пример с метеостанцией и попробуем его немного “причесать”:

Что тут можно сделать? В проекте используются:

  • Дисплей LCD1602
  • Датчик температуры ds18b20
  • Микросхема реального времени DS3231

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

Также сделаем класс для таймера, потому что там он используется в трёх местах.

Источник

Adblock
detector