ARDUINO – Где научиться программировать с нуля?
Привет. Если стоит задача научиться программировать именно с нуля, то не стоит сразу бросаться в изучение синтаксиса какого-то конкретного языка, а начать с основ, понять, что программирование вообще такое и как оно работает. На эту тему есть хороший онлайн-курс от гарварда (он бесплатный, есть на разных образовательных платформах типа edx, есть на рутрекере, есть на гарвардском cdn записи всех лекций/семинаров и пдф-ки с домашними заданиями). Мне в свое время он очень помог, называется CS50 introduction to computer science. По-моему, его даже на русский переводил кто-то где-то. Там расскажут о различных базовых понятиях (алгоритмах, структурах данных, кое-что об архитектуре компьютера) и будут учить писать на C. Хороший курс, рекомендую.Кроме того, есть много хороших открытых курсов от разных издателей на различную тематику на ресурсах вроде edx или udacity, в том числе по конкретным языкам программирования и технологиям.
Еще для практики могут помочь такие ресурсы, как codecademy.com (разные интерактивные курсы с написанием кода прямо в браузере, много бесплатных) и codewars.com (задачки по программированию на разных языках с предварительно написанными тестами, можно смотреть решения других пользователей, сравнивать со своим и все такое).
По поводу книг, опять же, не стоит бросаться на книги вроде “изучите программирование на С++ с нуля за 21 день”. Углубляться в синтаксис языка без понимания того, что этот язык делает, довольно бессмысленно. Больше времени стоит уделять практике и писать код, решать конкретные задачи.
И, да, если возникает вопрос, какой язык выбрать для начала, мое мнение – любой. Подумайте, что вы хотите писать больше всего (там, сайты, андроид-приложения, десктопные приложения и тд), погуглите, какой язык для этого подходит – и вперед.
И, самое главное – не надо “начинать с паскаля, потому что паскаль подходит для обучения”.
community.alexgyver.ru
Программирование Arduino: справочник разработчика программиста
Главная
Программирование Ардуино – это задание определённых алгоритмов, переведённых на компьютерный язык, с целью выполнения машиной конкретной задачи, поставленной пользователем.
Мы предлагаем вам самый полный и дополняемый справочник программиста Arduino. Справочник постоянно дополняется и обновляется.
Ардуино – платформа, позволяющая множеству инженеров со всего мира создавать свои проекты с минимальными вложениями. В первую очередь – это специальный микроконтроллер с одноимённой системой управления и библиотеками, построенными на языке С++. Соответственно, если вы планируете создавать что-то уникальное, вам следует изучить все нюансы, которые имеет программирование Arduino.
Давайте же составим краткое описание программирования Arduino и уточним моменты, на которые стоит обратить внимание, если вы впервые занимаетесь подобным.
Основы Arduino
Прежде чем приступать к решению конкретной задачи на Ардуино, лучше всего иметь базис в сфере программирования. Поэтому давайте рассмотрим, что вообще обозначает этот термин. Абсолютно любой проект построен на поэтапной блок-модели, в которой описывается, что необходимо сделать вашему микроконтроллеру и как это сделать.
Для упрощения работы пользователей в Ардуино созданы готовые библиотеки функций, вам достаточно лишь вводить команды из них, чтобы добиться какой-то цели. Естественно, таким образом вы многого не добьётесь, но для создания собственных библиотек потребуется знание языка С++ на котором и построена прошивка чипа.
Ключевая особенность системы в том, что характеристики Arduino могут быть улучшены с помощью докупаемых компонентов, и вы всегда можете их подстроить под конкретный проект. Соответственно, единственным вашим ограничением является знание языка и его возможностей, а также собственная фантазия.
Все функции строятся из простейших операнд, которые характерны для С++. Этими операндами являются переменные различных типов и способы их применения. Поэтому любая функция, используемая в микроконтроллере для получения сведений или отправки сигнала, – это набор простейших операций, который записан в главной библиотеке. И вы будете ограничены до тех пор, пока не получите достаточно опыта и практики, чтобы понимать, какую библиотеку и для какой цели вам стоит написать.
Главный же недостаток конструирования с Arduino сложных проектов в том, что вам придётся с нуля писать код и подбирать компоненты для системы, поэтому лучше сначала попрактиковаться на простейших задачах.
Также, учитывайте, что язык написания библиотек системы – низкоуровневый, а соответственно, состоит из простейших команд, в отличие от высокоуровневых python или pascal, удобных для пользователей. С другой стороны, он также является мультипарадигмальным, поэтому подходит для решения любой задачи с помощью удобной вам парадигмы программирования.
Чаще всего применяется ООП. Сам С++ имеет ядро из многочисленных библиотек и дополнительных функций или методов, поэтому, если вы собираетесь разобраться во всём кардинально, стоит начинать с освоения языка с нуля.
Особенности Arduino программирования
Именно язык, на котором базируется система, и является главной особенностью Ардуино программирования. Ведь при том, что сама плата и работа с ней достаточно просты, с низким порогом вхождения, чтобы освоить низкоуровневый язык программирования и в совершенстве владеть им, потребуется несколько лет.
У программирования на Ардуино имеются как свои достоинства, так и недостатки, и вам стоит изучить обе стороны вопроса, чтобы понимать, с чем вы имеете дело и чего ожидать от микроконтроллера в принципе, во время работы с ним. Среди достоинств Ардуино, пользователи отмечают:
- Низкий порог вхождения. Этот пункт будет и в недостатках, так как из-за простоты системы и отсутствия требований к базису по программированию в сети гуляет множество библиотек, написанных ужасным образом. На то, чтобы разобраться, как они работают, уйдёт больше времени, чем на создание своей собственной. А стандартных функций от разработчиков не хватает для серьёзных задач.
- Обширное комьюнити. Это главное достоинство Ардуино перед его конкурентами, ведь вы найдёте пользователей, занимающихся созданием проектов на нём, как русскоязычных, так и англоязычных. Но если вы хотите получать действительно ценные советы и погрузиться в работу комьюнити, следует всё же изучить английский язык. Так как большая часть проблем, что вам встретятся, уже давно решены в Гугле, но, зачастую, ответы на английском.
- Большое количество библиотек, под разные случаи. Но, как уже описано чуть выше, у этого есть и свои недостатки.
Имеется у программирования на Ардуино и ряд весомых минусов:
- Низкая планка для вхождения превращает большую часть библиотек, коими наполнена сеть, в полностью бесполезный мусор. Ведь какие-то из них работают просто медленно и написаны без каких-либо знаний основ алгоритмизации, а часть – вовсе не работает, и непонятно, зачем авторы их создавали. Чтобы найти подспорье под конкретный проект, необходимо перелопатить несколько англоязычных форумов или же самостоятельно создать функции с нуля.
- Сложности программирования на С++. На деле – это один из сложнейших языков мультипарадигмального программирования, для создания прошивок и низкоуровневых задач. Однако, если вы имели опыт работы с ним и знаете хотя бы основные алгоритмы, а также работали хоть с одним другим мультипарадигмальным ЯП, тем более используя объектно-ориентированное программирование, вам будет значительно проще освоиться.
- Низкая скорость отклика самих чипов и их слабые характеристики. Да, микроконтроллеры Ардуино можно подстраивать под конкретную задачу, докупать компоненты и датчики, но это играет с ними злую шутку. Так как разработчики не знают, для чего будут использовать их детище, они усредняют все показатели, чтобы значительно уменьшить стоимость конечного продукта. В результате люди, создающие простейшие поделки, переплачивают за ненужную мощность, а тем, кто занимается робототехникой или автоматизацией каких-то процессов, приходится докупать и паять множество дополнительных плат.
Как вы можете заметить, Ардуино имеет множество нюансов, и не столь дружелюбна для новичков, как выглядит на первый взгляд. С другой стороны, если вы имеете малейший опыт работы с языками программирования, вам будет куда проще освоиться.
Как начать правильно пользоваться Arduino
Если вы никогда ранее не программировали, и это ваш первый опыт, то программирование микроконтроллеров Arduino пойдёт куда проще, если вы начнёте с основ. Конечно, когда в планах у вас нет никаких сложных проектов, можете работать на готовых библиотеках и параллельно разбирать, из чего состоят их функции. Это один из хороших способов обучения, но тогда стоит искать наборы функций, которые писались профессионалами, чтобы быть уверенным в их правильности. Иначе вы можете увидеть неправильное решение задачи и, в результате, применять те в своих проектах.
Но куда лучше начать с основ и посвятить хотя бы неделю освоению алгоритмизации и научиться разбивать свои проекты на блоки, а те – уже на конкретные шаги. Подобное построение блок-схем вам не раз пригодится в будущем. Когда вы изучите весь базис, можно переходить к практике и самообучению на С++, подойдут любые простейшие проекты или заготовленные в интернете задачи. На этом этапе вашей целью станет понять основные парадигмы и научиться их использовать, а также изучить возможности языка, чтобы вы чётко знали, что он может, и могли здраво оценить реализуемость ваших проектов.
Программирование микроконтроллеров
Само программирование Ардуино делится на три этапа:
- Создание или скачивание готовой библиотеки функций.
- Загрузка этих библиотек в постоянную память чипа. Это ещё называют прошивкой.
- Ввод этих функций в командную строку, например, АТ, чтобы плата выполнила те или иные действия.
Если вы делаете что-то простое, и вам хватает базовой прошивки, можете пропустить первые два пункта.
Самые простые проекты с использованием Arduino
Примеров простых проектов с Ардуино множество, например, вы можете:
- Создать датчик освещённости, который будет подстраивать специальные LED лампы под ту яркость, которая необходима в комнате.
- Автоматизация любых вещей в вашем доме. Например, включения-выключения света, открытия дверей и прочее.
- Автоматизация оранжереи.
Хотя это и звучит достаточно страшно, на большую часть этих проектов, благодаря обилию информации по ним в интернете, вы не потратите много времени и сил.
Разбираемся с Arduino IDE | AlexGyver Technologies
Работа с Arduino IDE
Рассмотрим основную программу, с которой будем работать – Arduino IDE. IDE расшифровывается как интегрированная среда разработки, и в нашем случае представляет собой блокнот, в котором мы пишем код, препроцессор и компилятор, которые проверяют и компилируют код, и инструменты для загрузки, которые загружают код выбранным способом. IDE написана на java, поэтому не удивляйтесь её долгому запуску, большому объему занимаемой оперативки и медленной работе. Несмотря на огромный опыт работы с ардуино я до сих пор продолжаю писать код в Arduino IDE, потому что я к ней привык. Помимо перечисленных проблем стандартная IDE выделяется на фоне “взрослых” сред разработки отсутствием дерева/файловой структуры проекта (что не нужно для простых проектов), отсутствием рефакторинга, отсутствием автоматического дополнения кода (хотя его обещают вот-вот добавить и уже есть beta) и очень медленной компиляцией кода. Этих недостатков лишены аналоги Arduino IDE, о них поговорим в конце урока. Помимо отсутствия озвученных недостатков там есть некоторые полезные фишки, например все define-ы файла с кодом отображаются в отдельном блоке и с ними очень удобно работать.
Интерфейс
Сначала рассмотрим общий вид программы, т.е. как она выглядит после запуска. В самом центре – блокнот, то самое место, где пишется код. По умолчанию уже написаны два стандартных блока, setup и loop. К ним вернёмся в разделе уроков программирования. Всё остальное можно увидеть на скриншоте ниже.
- Проверить – компиляция (сборка, проверка на ошибки…) кода без его загрузки в плату. То есть код можно написать и проверить на ошибки даже не подключая плату к компьютеру
- Загрузить – компиляция и загрузка прошивки в плату
- Создать/открыть/сохранить – тут всё понятно
- Монитор порта – кнопка открывает монитор последовательного пора для общения с платой
- Меню вкладок – работа с вкладками, о них поговорим ниже
- Текущее состояние – тут выводится краткая информация о последнем действии: загрузка завершена, ошибка загрузки, автоформатирование завершено и т.д.
- Лог работы – тут выводится лог компиляции и вообще все системные сообщения, отчёты об ошибках и размере скомпилированного кода
- Конфигурация оборудования – выводится название выбранной платы, версии микроконтроллера и номер выбранного COM порта
Пробежимся по пунктам меню, которые я считаю первостепенно важными, с остальными можно познакомиться самостоятельно по ходу работы с программой. Версия моей IDE – 1.8.8, в новых что-то может отличаться
Вкладка “Файл”
- Новый
- Открыть
- Открыть недавние
- Папка со скетчами – список скетчей, которые сохранены туда, куда программа предлагает их сохранять по умолчанию (Документы/Arduino)
- Примеры – список установленных библиотек с подсписком примеров к каждой. Весьма полезная штука
- Закрыть
- Сохранить
- Сохранить как…
- Настройки страницы (для печати)
- Печать
- Настройки
- Выход
Далее сразу рассмотрим окно настроек:
Окно настроек
Настройки Arduino IDE
Куча интересных настроек на свой вкус. Из них отмечу
- Размещение папки скетчей – куда по умолчанию сохраняются скетчи
- Показать подробный вывод – показывает подробный лог при компиляции и загрузке, нужно при поиске багов и непонятных глюков/ошибок
- Использовать внешний редактор – запрещает редактирование кода из Arduino IDE, чтобы редактировать его в других редакторах, например Notepad++. Редактируем там, а загружаем через IDE. Зачем это? Писать код в том же Notepad++ гораздо удобнее и приятнее, чем в Arduino IDE. К сожалению.
- Дополнительные ссылки для менеджера плат – сюда вставляются ссылки на пакеты для работы с другими платами, например такими основанными на ESP8266 или ATtiny85.
Вкладка “Правка”
Во вкладке Правка ничего такого особенного нет, всё как в других программах
Вкладка “Скетч”
Вкладка “Скетч”
- Проверить/компилировать – то же, что кнопка галочка
- Загрузка – то же, что кнопка загрузка
- Загрузить через программатор – загрузить скетч напрямую в МК, минуя загрузчик
- Экспорт бинарного файла – сохраняет скомпилированный файл, который и загружается в МК. Бинарный файл хорош тем, что содержащийся в нём код практически невозможно не то что отредактировать, но даже прочитать как вменяемый код. Именно в таком виде обычно поставляются прошивки для цифровой техники, чтобы никто не видел исходник =)
- Показать папку скетча
- Подключить библиотеку – подключает в код библиотеку, с директивой include, всё как нужно
- Управлять библиотеками… – открывает менеджер библиотек, из которого можно установить библиотеки из официального списка
- Добавить .zip библиотеку – не рекомендую так делать, потом не найдёте, куда она установилась
- Добавить файл… – подключает в код внешний файл
Вкладка “Инструменты”
Вкладка “Инструменты”
- АвтоФорматирование – выравнивает код по табуляции. Крайне важная фишка, используйте её и комбинацию Ctrl+T как можно чаще
- Архивировать скетч – сохраняет скетч как .zip архив
- Исправить кодировку и перезагрузить – полезная штука, когда скачал чей-то код из интернета, а там поехала кодировка
- Управлять библиотеками… – открывает менеджер библиотек, из которого можно установить библиотеки из официального списка
- Монитор порта
- Плоттер по последовательному соединению – встроенный построитель графиков по идущим в порт данным
- Плата – выбор платы, куда хотим загрузить прошивку
- Процессор – выбор процессора, который стоит на плате. Обычно он один на выбор, но иногда есть варианты
- Порт – COM порт, к которому подключена плата. Это всегда порт, отличный от COM1 (системный порт)
- Программатор – выбор программатора для загрузки кода через программатор
- Записать загрузчик – прошивает загрузчик, соответствующий выбранной плате и процессору в микроконтроллер при помощи программатора (который ISP)
Меню вкладок
Меню вкладок
Система вкладок в Arduino IDE работает крайне необычным образом и очень отличается от понятия вкладок в других программах:
- Вкладки относятся к одному и тому же проекту, к файлам, находящимся с ним в одной папке
- Вкладки просто разбивают общий код на части, то есть в одной вкладке фигурная скобка { может открыться, а в следующей – закрыться }. При компиляции все вкладки просто объединяются в один текст по порядку слева направо (с левой вкладки до правой). Также это означает, что вкладки должны содержать код, относящийся только к этому проекту, и сделать в одной вкладке void loop() и в другой – нельзя, так как loop() может быть только один
- Вкладки автоматически располагаются в алфавитном порядке, поэтому создаваемая вкладка может оказаться между другими уже существующими. Это означает, что разбивать блоки кода по разным вкладкам (как во втором пункте, { на одной вкладке, } на другой вкладке) – крайне не рекомендуется.
- Также не забываем, что переменная должна быть объявлена до своего вызова, то есть вкладка с объявлением переменной должна быть левее вкладки, где переменная вызывается. Создавая новую вкладку нужно сразу думать, где она появится с таким именем и не будет ли из за этого проблем. Также название вкладок можно начинать с цифр и таким образом точно контролировать их порядок. Во избежание проблем с переменными, все глобальные переменные лучше объявлять в самой первой вкладке.
- Вкладки сохраняются в папке с проектом и имеют расширение .ino, при запуске любой вкладки откроется весь проект со всеми вкладками.
- Помимо “родных” .ino файлов Arduino IDE автоматически подцепляет файлы с расширениями .h (заголовочный файл), .cpp (файл реализации) и .pde (старый формат файлов Arduino IDE). Эти файлы точно так же появляются в виде вкладок, но например заголовочный файл .h не участвует в компиляци до тех пор, пока не будет вручную подключен к проекту при помощи команды include. То есть он висит как вкладка, его можно редактировать, но без подключения он так и останется просто отдельным текстом. В таких файлах обычно содержатся классы или просто отдельные массивы данных.
Аналоги Arduino IDE
Всем нетерпимо относящимся к кривой официальной IDE могу посоветовать следующие аналоги, работа в которых чем-то лучше, а чем-то хуже официальной IDE:
- Notepad++ + Arduino IDE – вполне работоспособная связка – прогерский блокнот “на максималках”, в котором ОЧЕНЬ удобно писать код, и Arduino IDE, в которой удобно выбирать железо и загружать прошивку
- PlatformIO – очень мощная взрослая среда разработки, подробнее можно почитать даже в статье у меня на сайте. Автор – не я. Лично мне платформио не понравилась. Да, есть автодополнение кода и всякие удобные фишки, но конфигурировать проект приходится вручную (в 2019 году не сделать пару кнопок для того же выбора порта – разработчики – АУ!!!), также есть проблемы с библиотеками.
- Programino IDE – вот эта среда мне довольно таки понравилась, есть автодополнение и другие удобные фичи. Единственный минус – она платная, но на всё платное можно нагуглить кряк =) Подробнее на официальном сайте
- MariaMole – интересная среда, которая вроде как больше не развивается. Количество “плюшек” примерно равно количеству “багов” и недоделок, по крайней мере так было в 2017 году. Подробнее
- B4R – среда, позволяющая программировать Арудино на языке Basic. Кому интересно – вот официальный сайт
- Visual Studio Micro – очень мощный и взрослый инструмент, являющийся плагином к Microsoft Visual Studio. Подробнее читать здесь
- XOD – очень интересная среда разработки, в которой программа составляется из нод (node) – блоков. Полностью другая концепция программирования, посмотрите обязательно. Официальный сайт
- Atmel Studio – официальная среда для программирования микроконтроллеров AVR. Никаких детских ардуиновских функций – только работа напрямую с МК, только хардкор! Подробнее можно почитать на сайте амперки
Важные страницы
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макро, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
alexgyver.ru
Как начать программировать с Arduino
aaveЭксперт + Разработчик, Инженер
2921
78 подписчиков
Спросить
Хотите научиться создавать электронные гаджеты своими руками, но не знаете, с чего начать? Намерены изучить основы электроники? Тогда платы Arduino – лучший выбор для начинающего. В частности, хороша для этих целей плата Arduino UNO.
Статьи по теме:
Вам понадобится
- – плата Arduino UNO,
- – кабель USB (USB A – USB B),
- – персональный компьютер,
- – светодиод,
- – резистор 220 Ом,
- – пара проводов 5-10 см,
- – при наличии – макетная плата (breadboard).
Инструкция
Подключите плату Arduino с помощью USB кабеля к компьютеру. Должен загореться зелёный светодиод ON на плате. Загрузите среду разработки Arduino для своей операционной системы (поддерживаются ОС Windows, Mac OS X, Linux) на странице http://arduino.cc/en/Main/Software, можно установщик, можно архив. Скачанный файл содержит также и драйверы для плат Arduino.Установите драйвер. Рассмотрим вариант для ОС Windows. Для этого дождитесь, когда операционная система предложит установить драйвер. Откажитесь. Нажмите Win + Pause, запустите Диспетчер устройств. Найдите раздел “Порты (COM & LPT)”. Увидите там порт с названием “Arduino UNO (COMxx)”. Кликните правой кнопкой мыши на нём и выберите “Обновить драйвер”. Далее выбираете расположение драйвера, который вы только что скачали.
Среда разработки уже содержит в себе множество примеров для изучения работы платы. Откройте пример “Blink”: Файл > Примеры > 01.Basics > Blink.
Укажите среде разработки свою плату. Для этого в меню Сервис > Плата выберите “Arduino UNO”.
Выберите порт, которому назначена плата Arduino. Чтобы узнать, к какому порту подключена плата, запустите диспетчер устройств и найдите раздел Порты (COM & LPT). В скобках после названия платы будет указан номер порта. Если платы нет в списке, попробуйте отключить её от компьютера и, выждав несколько секунд, подключить снова.Отключите плату от компьютера. Соберите схему, как показано на рисунке. Обратите внимание, что короткая ножка светодиода должна быть соединена с выводом GND, длинная через резистор с цифровым пином 13 платы Arduino. Удобнее пользоваться макетной платой, но при её отсутствии можно соединить провода скруткой.
Важное примечание! Цифровой пин 13 уже имеет свой резистор на плате. Поэтому при подключении светодиода к плате внешний резистор использовать не обязательно. При подключении светодиода к любым другим выводам Ардуино использование токоограничивающего резистора обязательно!
Теперь можно загрузить программу в память платы. Подключите плату к компьютеру, подождите несколько секунд, пока происходит инициализация платы. Нажмите кнопку “Загрузить”, и Ваш скетч запишется в память платы Arduino. Программирование под Arduino весьма интуитивно и совсем не сложно. Посмотрите на изображение – в комментариях к программе есть небольшие пояснения. Этого достаточно чтобы разобраться с вашим первым экспериментом.
Светодиод должен начать весело подмигивать вам с периодичностью 2 секунды (1 секунду горит, 1 выключен). Ваш первый скетч готов!
Видео по теме
Обратите внимание
Будьте внимательны при работе с платой Arduino – это электронное изделие, которое требует бережного отношения. Снизу платы есть оголённые проводники, и если Вы положите плату на токопроводящую поверхность, есть вероятность сжечь плату. Также не трогайте плату влажными или мокрыми руками и избегайте при работе сырых помещений.
Полезный совет
В сети есть множество сайтов, посвящённых Arduino. Читайте, осваивайте, не бойтесь экспериментировать и познавать новое!
Источники:
- Мигаем светодиодом
Совет полезен?
Статьи по теме:
www.kakprosto.ru
Структура программы на языке C++ для Arduino [Амперка / Вики]
Рассмотрим пример минимально возможной программы на C++ для Arduino, которая ничего не делает:
void setup() { } void loop() { }
Разберёмся что здесь написано и почему это обязательно: почему нельзя обойтись просто пустым файлом.
Из чего состоит программа
Для начала стоит понять, что программу нельзя читать и писать как книгу:
от корки до корки, сверху вниз, строку за строкой. Любая программа состоит
из отдельных блоков. Начало блока кода в C/C++ обозначается левой фигурной
скобкой {
, его конец — правой фигурной скобкой }
.
Блоки бывают разных видов и какой из них когда будет исполняться зависит от внешних условий. В примере минимальной программы вы можете видеть 2 блока. В этом примере блоки называются определением функции. Функция — это просто блок кода с заданным именем, которым кто-то затем может пользоваться из-вне.
В данном случае у нас 2 функции с именами setup
и loop
. Их присутствие обязательно
в любой программе на C++ для Arduino. Они могут ничего и не делать, как в нашем случае,
но должны быть написаны. Иначе на стадии компиляции вы получите ошибку.
Классика жанра: мигающий светодиод
Давайте теперь дополним нашу программу так, чтобы происходило хоть что-то. На Arduino, к 13-му пину подключён светодиод. Им можно управлять, чем мы и займёмся.
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(900); }
Скомпилируйте, загрузите программу. Вы увидите, что каждую секунду светодиод на плате помигивает. Разберёмся почему этот код приводит к ежесекундному миганию.
В наши ранее пустые функции мы добавили несколько выражений. Они были размещены между
фигурными скобками функций setup
и loop
. В setup
появилось одно выражение, а в loop
сразу 4.
Каждое выражение — это приказ процессору сделать нечто. Выражения в рамках одного блока исполняются одно за другим, строго по порядку без всяких пауз и переключений. То есть, если мы говорим об одном конкретном блоке кода, его можно читать сверху вниз, чтобы понять что делается.
Теперь давайте поймём в каком порядке исполняются сами блоки, т.е. функции setup
и loop
.
Не задумывайтесь пока что значат конкретные выражения, просто понаблюдайте за порядком.
Как только Arduino включается, перепрошивается или нажимается кнопка
RESET
, «нечто» вызывает функциюsetup
. То есть заставляет исполняться выражения в ней.Как только работа
setup
завершается, сразу же «нечто» вызывает функциюloop
.Как только работа
loop
завершается, сразу же «нечто» вызывает функциюloop
ещё раз и так до бесконечности.
Если пронумеровать выражения по порядку, как они исполняются, получится:
void setup() { pinMode(13, OUTPUT); ❶ } void loop() { digitalWrite(13, HIGH); ❷ ❻ ❿ delay(100); ❸ ❼ … digitalWrite(13, LOW); ❹ ❽ delay(900); ❺ ❾ }
Ещё раз напомним, что не стоит пытаться воспринимать всю программу, читая сверху вниз.
Сверху вниз читается только содержимое блоков. Мы вообще можем поменять порядок объявлений setup
и loop
.
void loop() { digitalWrite(13, HIGH); ❷ ❻ ❿ delay(100); ❸ ❼ … digitalWrite(13, LOW); ❹ ❽ delay(900); ❺ ❾ } void setup() { pinMode(13, OUTPUT); ❶ }
Результат от этого не изменится ни на йоту: после компиляции вы получите абсолютно эквивалентный бинарный файл.
Что делают выражения
Теперь давайте попробуем понять почему написанная программа приводит в итоге к миганию светодиода.
Как известно, пины Arduino могут работать и как выходы и как входы. Когда мы хотим чем-то управлять, то есть выдавать сигнал, нам нужно перевести управляющий пин в состояние работы на выход. В нашем примере мы управляем светодиодом на 13-м пине, поэтому 13-й пин перед использованием нужно сделать выходом.
Это делается выражением в функции setup
:
pinMode(13, OUTPUT);
Выражения бывают разными: арифметическими, декларациями, определениями, условными и т.д. В данном
случае мы в выражении осуществляем вызов функции. Помните? У нас есть свои функции setup
и loop
, которые вызываются чем-то, что мы назвали «нечто». Так вот теперь мы вызываем функции,
которые уже написаны где-то.
Конкретно в нашем setup
мы вызываем функцию с именем pinMode
. Она устанавливает заданный по номеру пин
в заданный режим: вход или выход. О каком пине и о каком режиме идёт речь указывается нами в круглых
скобках, через запятую, сразу после имени функции. В нашем случае мы хотим, чтобы 13-й пин работал
как выход. OUTPUT
означает выход, INPUT
— вход.
Уточняющие значения, такие как 13
и OUTPUT
называются аргументами функции. Совершенно не обязательно,
что у всех функций должно быть по 2 аргумента. Сколько у функции аргументов зависит от сути функции,
от того как её написал автор. Могут быть функции с одним аргументом, тремя, двадцатью; функции могут
быть без аргументов вовсе. Тогда для их вызова круглые скобка открывается и тут же закрывается:
noInterrupts();
На самом деле, вы могли заметить, наши функции setup
и loop
также не принимают никакие аргументы.
И загадочное «нечто» точно так же вызывает их с пустыми скобками в нужный момент.
Вернёмся к нашему коду. Итак, поскольку мы планируем вечно мигать светодиодом, управляющий пин должен
один раз быть сделан выходом и затем мы не хотим вспоминать об этом. Для этого идеологически и
предназначена функция setup
: настроить плату как нужно, чтобы затем с ней работать.
Перейдём к функции loop
:
void loop() { digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(900); }
Она, как говорилось, вызывается сразу после setup
. И вызывается снова и снова как только сама заканчивается.
Функция loop
называется основным циклом программы и идеологически предназначена для выполнения полезной
работы. В нашем случае полезная работа — мигание светодиодом.
Пройдёмся по выражениям по порядку. Итак, первое выражение — это вызов встроенной функции digitalWrite
.
Она предназначена для подачи на заданный пин логического нуля (LOW
, 0 вольт) или логической единицы (HIGH
, 5 вольт)
В функцию digitalWrite
передаётся 2 аргумента: номер пина и логическое значение. В итоге, первым делом
мы зажигаем светодиод на 13-м пине, подавая на него 5 вольт.
Как только это сделано процессор моментально приступает к следующему выражению. У нас это вызов функции delay
.
Функция delay
— это, опять же, встроенная функция, которая заставляет процессор уснуть на определённое время.
Она принимает всего один аргумент: время в миллисекундах, которое следует спать. В нашем случае это 100 мс.
Пока мы спим всё остаётся как есть, т.е. светодиод продолжает гореть. Как только 100 мс истекают, процессор
просыпается и тут же переходит к следующему выражению. В нашем примере это снова вызов знакомой нам встроенной
функции digitalWrite
. Правда на этот раз вторым аргументом мы передаём значение LOW
. То есть устанавливаем
на 13-м пине логический ноль, то есть подаём 0 вольт, то есть гасим светодиод.
После того, как светодиод погашен мы приступаем к следующему выражению. И снова это вызов функции delay
.
На этот раз мы засыпаем на 900 мс.
Как только сон окончен, функция loop
завершается. По факту завершения «нечто» тут же вызывает её ещё раз
и всё происходит снова: светодиод поджигается, горит, гаснет, ждёт и т.д.
Если перевести написанное на русский, получится следующий алгоритм:
Поджигаем светодиод
Спим 100 миллисекунд
Гасим светодиод
Спим 900 миллисекунд
Переходим к пункту 1
Таким образом мы получили Arduino с маячком, мигающим каждые 100 + 900 мс = 1000 мс = 1 сек.
Что можно изменить
Давайте пользуясь только полученными знаниями сделаем несколько вариаций программы, чтобы лучше понять принцип.
Вы можете подключить внешний светодиод или другое устройство, которым нужно «мигать» на другой пин. Например, на 5-й. Как в этом случае должна измениться программа? Мы должны всюду, где обращались к 13-му пину заменить номер на 5-й:
void setup() { pinMode(5, OUTPUT); } void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); }
Компилируйте, загружайте, проверяйте.
Что нужно сделать, чтобы светодиод мигал 2 раза в секунду? Уменьшить время сна так, чтобы в сумме получилось 500 мс:
void setup() { pinMode(5, OUTPUT); } void loop() { digitalWrite(5, HIGH); delay(50); digitalWrite(5, LOW); delay(450); }
Как сделать так, чтобы светодиод при каждом «подмигивании» мерцал дважды? Нужно поджигать его дважды с небольшой паузой между включениями:
void setup() { pinMode(5, OUTPUT); } void loop() { digitalWrite(5, HIGH); delay(50); digitalWrite(5, LOW); delay(50); digitalWrite(5, HIGH); delay(50); digitalWrite(5, LOW); delay(350); }
Как сделать так, чтобы в устройстве были 2 светодиода, которые мигали бы каждую секунду поочерёдно? Нужно
общаться с двумя пинами и работать в loop
то с одним, то с другим:
void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); } void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); digitalWrite(6, HIGH); delay(100); digitalWrite(6, LOW); delay(900); }
Как сделать так, чтобы в устройстве были 2 светодиода, которые переключались бы на манер железнодорожного светофора: горел бы то один то другой? Нужно просто не выключать горящий светодиод тут же, а дожидаться момента переключения:
void setup() { pinMode(5, OUTPUT); pinMode(6, OUTPUT); } void loop() { digitalWrite(5, HIGH); digitalWrite(6, LOW); delay(1000); digitalWrite(5, LOW); digitalWrite(6, HIGH); delay(1000); }
Можете проверить другие идеи самостоятельно. Как видите, всё просто!
О пустом месте и красивом коде
В языке C++ пробелы, переносы строк, символы табуляции не имеют большого значения для компилятора. Там где стоит пробел, может быть перенос строки и наоборот. На самом деле 10 пробелов подряд, 2 переноса строки и ещё 5 пробелов — это всё эквивалент одного пробела.
Пустое пространство — это инструмент программиста, с помощью которого можно или сделать программу понятной и наглядной, или изуродовать до неузнаваемости. Например, вспомним программу для мигания светодиодом:
void setup() { pinMode(5, OUTPUT); } void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); }
Мы можем изменить её так:
void setup( ) { pinMode(5, OUTPUT); } void loop () { digitalWrite(5,HIGH); delay(100 ) ; digitalWrite(5,LOW); delay(900); }
Всё, что мы сделали — немного «поработали» с пустым пространством. Теперь можно наглядно видеть разницу между стройным кодом и нечитаемым.
Чтобы следовать негласному закону оформления программ, который уважается на форумах, при чтении другими людьми, легко воспринимается вами же, следуйте нескольким простым правилам:
1. Всегда, при начале нового блока между {
и }
увеличивайте отступ. Обычно используют 2 или 4
пробела. Выберите одно из значений и придерживайтесь его всюду.
Плохо:
void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); }
Хорошо:
void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); }
2. Как и в естественном языке: ставьте пробел после запятых и не ставьте до.
Плохо:
digitalWrite(5,HIGH); digitalWrite(5 , HIGH); digitalWrite(5 ,HIGH);
Хорошо:
digitalWrite(5, HIGH);
3. Размещайте символ начала блока {
на новой строке на текущем уровне отступа или в конце предыдущей.
А символ конца блока }
на отдельной строке на текущем уровне отступа:
Плохо:
void setup() { pinMode(5, OUTPUT); } void setup() { pinMode(5, OUTPUT); } void setup() { pinMode(5, OUTPUT); }
Хорошо:
void setup() { pinMode(5, OUTPUT); } void setup() { pinMode(5, OUTPUT); }
4. Используйте пустые строки для разделения смысловых блоков:
Хорошо:
void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); digitalWrite(6, HIGH); delay(100); digitalWrite(6, LOW); delay(900); }
Ещё лучше:
void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); digitalWrite(6, HIGH); delay(100); digitalWrite(6, LOW); delay(900); }
О точках с запятыми
Вы могли заинтересоваться: зачем в конце каждого выражения ставится точка с запятой? Таковы правила C++.
Подобные правила называются синтаксисом языка. По символу ;
компилятор понимает где заканчивается
выражение.
Как уже говорилось, переносы строк для него — пустой звук, поэтому ориентируется он на этот знак препинания. Это позволяет записывать сразу несколько выражений в одной строке:
void loop() { digitalWrite(5, HIGH); delay(100); digitalWrite(5, LOW); delay(900); }
Программа корректна и эквивалентна тому, что мы уже видели. Однако писать так — это дурной тон. Код гораздо сложнее читается. Поэтому если у вас нет 100% веских причин писать в одной строке несколько выражений, не делайте этого.
О комментариях
Одно из правил качественного программирования: «пишите код так, чтобы он был настолько понятным, что не нуждался бы в пояснениях». Это возможно, но не всегда. Для того, чтобы пояснить какие-то не очевидные моменты в коде его читателям: вашим коллегам или вам самому через месяц, существуют так называемые комментарии.
Это конструкции в программном коде, которые полностью игнорируются компилятором и имеют значение только для читателя. Комментарии могут быть многострочными или однострочными:
/* Функция setup вызывается самой первой, при подаче питания на Arduino А это многострочный комментарий */ void setup() { // устанавливаем 13-й пин в режим вывода pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); delay(100); // спим 100 мс digitalWrite(13, LOW); delay(900); }
Как видите, между символами /*
и */
можно писать сколько угодно строк комментариев.
А после последовательности /
/
комментарием считается всё, что следует до конца строки.
Итак, надеемся самые основные принципы составления написания программ стали понятны. Полученные знания позволяют программно управлять подачей питания на пины Arduino по определённым временны́м схемам. Это не так уж много, но всё же достаточно для первых экспериментов.
wiki.amperka.ru
Программирование Arduino урок 1 — первый шаг
Первое, с чего следует начать работу по освоению Arduino – это приобрести отладочную плату (хорошо бы сразу приобрести монтажную плату и т.п.). Уже описывал, какие виды плат Arduino представлены на рынке. Кто еще не читал статью Введение в курс «Программирование микроконтроллеров» советую ознакомиться. Для изучения основ выбираем стандартную плату Arduino Uno (оригинал или хорошую китайскую копию — решать вам). При первом подключении оригинальной платы проблем возникнуть не должно, а вот с «китайцем» нужно будет немного поковыряться (не переживайте – всё покажу и расскажу).
Подключаем Arduino к компьютеру USB кабелем. На плате должен засветиться светодиод «ON«. В диспетчере устройств появится новое устройство «Неизвестное устройство«. Необходимо установить драйвер. Тут внесу небольшую неясность (кот отвлек – я не запомнил, какой из драйверов решил «проблему неизвестного устройства».
Предварительно скачал и распаковал программную средy Arduino (arduino-1.6.6-windows). Затем скачал этот архив. Он самораспаковывающейся. Запустил файл Ch441SER.EXE. Выбрал установку (INSTALL). После установки появилось сообщение, нажал «Ок» (прочитать не успел).
После перешёл в свойства все еще «неизвестного устройства» и выбрал кнопку «Update Driver». Выбрал вариант «Установка из указанного места» – указал папку с разархивированной программной средой Arduino. И о чудо – всё удачно заработало…
Запускаем программу Arduino (в моём случае 1.6.6) и разрешаем доступ.
Все проекты (программы) для Arduino состоят из двух частей: void setup и void loop. void setup выполняется всего один раз, а void loop выполняется снова и снова.
Прежде чем продолжим, необходимо выполнить две обязательные операции:
— указать в программной среде Arduino, какую плату вы используете. Tool->board-> Arduino Uno. Если отметка уже стоит на нужной вам плате – это хорошо, если нет – ставим отметку.
— указать в программной среде какой последовательный порт вы используете для связи с платой. Tool->port-> COM3. Если отметка уже стоит на порте – это хорошо, если нет – ставим отметку. Если у вас в разделе порты представлен больше, чем один порт, как же узнать, какой именно используется для соединения с платой? Берём плату и отсоединяем от неё провод. Снова заходим в порты и смотрим, какой из них исчез. В моём случае вкладка «порты» вообще стала не активной.
Снова подключаем провод USB.
Для первой программы никаких дополнительных модулей не нужно. Будем включать светодиод, который уже смонтирован на плате (на 13 выводе микроконтроллера).
Для начала сконфигурим 13 вывод (на вход или на выход).
Для этого вводим в блок «void setup» команду pinMode, в скобках указываем параметры (13, OUTPUT) (Какой вывод задействован, Режим работы). Программная среда выделяет слова/команды соответствующим цветом шрифта.
Переходим в блок «void loop» и вводим команду digitalWrite с параметрами (13, HIGH).
Первая программа готова, теперь осталось загрузить её в микроконтроллер. Нажимаем кнопку UPLOAD.
Светодиод засветился. Но не стоит так скептически относиться к простоте первой программы. Вы только, что освоили первую управляющую команду. Вместо светодиода ведь можно подключить любую нагрузку (будь-то освещение в комнате или сервопривод, перекрывающий подачу воды), но об этом всём поговорим позже…
Светодиод мы включили, он немного посветил, пора его выключать. Для этого видоизменим написанную нами программу. Вместо «HIGH» напишем «LOW».
Нажимаем кнопку UPLOAD. Светодиод погас.
Мы уже познакомились с понятием «переменные», пора им воспользоваться. Дальнейшие программы будут становится все объёмнее и сложнее, а работы по их изменению будут занимать все больше и больше времени, если мы оставим подобный стиль написания кода.
Смотрим на программу (снова включим светодиод). Зададим номер вывода микроконтроллера не числом 13, а переменной, которой будет присвоено значение соответствующего вывода (в нашем случае 13). В дальнейшем будет очень удобно изменять значения переменных в начале программы, вместо того, чтобы шарится по коду в поисках тех мест, где необходимо произвести замены значений.
Создаём глобальную переменную int LED_pin = 13; (тип переменной, имя переменной, присваиваемое ей значение).
Нажимаем кнопку UPLOAD. Светодиод светится. Все работает отлично.
В этом уроке, кроме включения/выключения светодиода, мы еще научимся мигать им.
Для этого вводим вторую команду «digitalWrite» с параметрами (LED_pin, LOW).
Нажимаем кнопку UPLOAD. И что мы видим? Светодиод светится «в пол наказа». Причина кроется в том, что время переключения двух состояний (HIGH и LOW) ничтожно мало и человеческий глаз не может уловить эти переключения. Необходимо увеличить время нахождения светодиода в одном из состояний. Для этого пишем команду delay с параметром (1000). Задержка в миллисекундах: 1000 миллисекунд – 1 секунда. Алгоритм программы следующий: включили светодиод – ждём 1 секунду, выключили светодиод – ждём 1 секунду и т.д.
Нажимаем кнопку UPLOAD. Светодиод начал мерцать. Все работает.
Доработаем программу создав переменную, которой будет присваиваться значение, отвечающее за длительность задержки.
Нажимаем кнопку UPLOAD. Светодиод мерцает, как и мерцал.
Доработаем написанную нами программу. Задачи следующие:
- Светодиод включен 0,2 секунды и выключен 0,8 секунды;
- Светодиод включен 0,7 секунды и выключен 0,3 секунды.
В программе созданы 2 переменные, что отвечают за временные задержки. Одна определяет время работы включенного светодиода, а вторая – время работы выключенного светодиода.
Выводы по уроку:
- подключили плату Arduino;
- написали первую программу;
- модернизировали её (применили теорию на практике).
Примеры написанных программ:
Спасибо за внимание. До скорой встречи!
Картотека программирования
ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ!
About alexlevchenko
Ценю в людях честность и открытость. Люблю мастерить разные самоделки. Нравится переводить статьи, ведь кроме того, что узнаешь что-то новое – ещё и даришь другим возможность окунуться в мир самоделок.mozgochiny.ru