Arduino — программирование, которое можно потрогать. Плата позволяет не только поработать с кодом, но и реализовать его в физическом мире. Например, запрограммировать плату помигать светодиодами или сделать из нее музыкальный инструмент. Разбираемся, как начать программировать на Arduino с нуля, какие IDE подходят для работы с платой и приводим примеры кода.
Что такое Arduino
Arduino — аппаратная платформа на базе микроконтроллера, предназначенная для разработки умных устройств и автоматизированных систем. С помощью Arduino можно запрограммировать собственный дверной замок с магнитным ключом, построить робота с распознаванием голосовых команд или собрать автоматическую кормушку для питомца. К основной плате можно подключать дополнительные модули от сторонних производителей. Так систему можно оснастить дисплеем, датчиками, аккумуляторами и беспроводной связью.
Arduino придумали в Италии в начале 2000-х годов. Разрабатывали систему для быстрого и легкого обучения программированию и схемотехнике, поэтому платформу изначально делали гибкой, чтобы ее можно было использовать в любых школах и кружках.
Все разработки Arduino открыты для использования, поэтому, кроме оригинальных плат, можно найти китайские копии. Компания всегда публикует чертежи своих разработок, схемотехнику и программную часть. В результате копии практически ничем не уступают платам из Италии.
На чем программируют Arduino
Код для всех плат семейства Arduino пишется на языке Arduino, созданном на базе C++ и фреймворка Wring. Создатели платформы выбрали C++ из-за скорости работы и высокой эффективности при разработке для устройств с ограниченным количеством памяти. Фреймворк Wring отвечает за управление аппаратной частью Arduino. Код компилируется с помощью avr-gcc.
Некоторые платы поддерживают программирование на языке MicroPython. Для этого нужно самостоятельно установить все необходимое окружение и подготовить аппаратную часть контроллера к обработке такого кода.
Программировать удобнее всего в интегрированных средах разработки. У плат семейства Arduino есть Arduino IDE. Приложение доступно для Windows, Linux и macOS. В нем собрали все инструменты, которые могут пригодиться во время разработки собственных проектов. В Arduino IDE можно писать код, оптимизировать работу платы, получать данные об эффективности кода, устанавливать сторонние библиотеки и разрабатывать свои. Arduino IDE можно скачать с официального сайта компании, код проекта открыт и опубликован на GitHub.
Если нет возможности установить Arduino IDE, то программировать плату можно в браузере, в облачной среде разработки. В ней поддерживается работа с кодом, отправка написанного кода на плату, взаимодействие с библиотеками и мониторинг. Возможности облачной IDE ограничены, и для полного доступа необходимо приобрести подписку Arduino Cloud.
Разрабатывать код для Arduino можно и в редакторе кода Visual Studio Code от Microsoft. Это возможно благодаря стороннему плагину PlatformIO, который упрощает взаимодействие с железом. Плагин бесплатный и предоставляет функции для разработки, отладки и прошивки плат.
Визуальное программирование Arduino
Новичкам может быть сложно сразу начать писать код на Arduino C из-за того, что в основе языка лежит достаточно сложный C++. Далеко не все платы поддерживают MicroPython, поэтому решением может стать визуальное программирование, построенное на перетягивании нужных фрагментов кода друг за другом. Такой способ будет полезен не только начинающим, но и детям на кружках по программированию.
Проект Массачусетского технологического института S4A представляет собой модификацию языка визуального программирования для Arduino. С его помощью можно собирать блоки кода в готовую прошивку для фирменных плат. Проект давно не обновлялся, но все равно стабильно работает. Есть русский язык и подробная документация по установке.
Проект ArduBlock от российских разработчиков активно поддерживается и предлагает актуальные функции для большинства плат Arduino и ESP. Программирование с помощью блоков, а также уроки и инструкции на русском языке доступны в браузере. Вместе с ArduBlock авторы проекта выпускают стартовые наборы для начинающих.
Основы программирования Arduino
Файл с кодом проекта для Arduino в сообществе принято называть скетчем. Скетчи пишут по специальным правилам, обеспечивающим корректную работу с железом и выполнение команд. Базовая структура выглядит следующим образом:
#include "name" void setup() { } void loop() { }
В самом начале скетча в главный файл подключают сторонние библиотеки с помощью директивы #include
и названия библиотеки. Название можно указать с помощью кавычек («») или галочек (<>). В первом случае поиск к файлу библиотеки производится сначала в папке со скетчем, а потом в папке с установленными библиотеками. Если использовать галочки, то система будет искать указанный файл только в папке с установленными библиотеками.
Далее следует функция setup()
, которая выполняется при каждом запуске скетча на Arduino. В этот момент система задает вводам и выводам на плате режим работы, получает значения переменных и подготавливает плату для работы с остальной частью кода.
Функция loop()
выполняется по кругу и управляет Arduino. В этой части разработчики пишут основной код скетча, который реализует логику всего проекта. Выполнение loop()
запускается сразу за setup()
. Эти две функции обязательно должны быть в скетче каждого проекта, даже в тех случаях, когда в функциях нет никаких инструкций. Без них невозможно выполнение кода на Arduino.
Комментарии и разделители
Arduino программируют на языке, спроектированном на базе C++, поэтому он наследует многие его особенности. Так, однострочные комментарии задаются с помощью двойного слэша (//). Весь текст внутри комментария компилятор будет игнорировать, обычно текст в слэшах используют для пояснения работы кода. Комментарии в первую очередь нужны людям, которые пишут код и работают с ним, а не компьютеру.
Для комментирования сразу нескольких строк используется конструкция из слэша и звездочки (/* комментарий */). Такую конструкцию обязательно надо закрывать, иначе компилятор не сможет найти конец комментария.
// Однострочный комментарий // Второй однострочный комментарий /* А это уже Многострочный комментарий */
Все инструкции нужно отделять точкой с запятой (;). Эта особенность тоже пришла в синтаксис Arduino из C++. Если этого не делать, код не соберется и скетч нельзя будет загрузить на плату.
Переменные Arduino
Переменные в Arduino нужны, как и во всех языках программирования, для хранения данных. В программировании Arduino мы должны указывать тип переменной перед ее именем. Существуют следующие типы данных:
Операторы Arduino
Загрузка прошивки на плату
Представим, что мы написали и отладили код, теперь его нужно протестировать на железе. Для этого надо как-то отправить код на плату Arduino. В фирменной среде разработки для этого предусмотрена удобная возможность прошивать платы.
Сначала подключаем плату по USB к компьютеру. В каждом поколении и типе Arduino используется свой стандарт подключения. Это важно учитывать. В запущенной IDE раскрываем список и ищем в нем плату.
Выбираем и нажимаем на кнопку с иконкой стрелочки. Плата начнет моргать светодиодами. Если прошивка прошла успешно, в терминале появится сообщение.
Поморгаем светодиодом
В мире программирования в качестве первой программы принято выводить на дисплей фразу «Hello, World!». В мире Arduino сложилась традиция моргать светодиодом, который выведен на плату. Новички с помощью этого скетча начинают изучать программирование микроконтроллеров, а профессионалы — проверяют платы на наличие дефектов.
Для начала работы над проектом необходимо запустить Arduino IDE. Нужный скетч входит в библиотеку примеров среды разработки. Его можно найти в разделе File → Examples → 01. Basics → Blink. После выбора в окне редактора появится код, первые строчки которого заменяет обширный комментарий с описанием проекта. Его можно сразу удалить, чтобы не мешался. Детально рассмотрим код:
// the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED_BUILTIN, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
В функции setup()
пин LED_BUILTIN настраивается в режим вывода. Это значит, что через него мы не будем ничего принимать и используем только для передачи параметров. Пины LED_BUILTIN и 13 соединены вместе. Если в коде заменить LED_BUILTIN на 13, то ничего не поменяется.
Функция loop()
используется для управления пином, который мы инициализировали выше. Сначала мы подаем на него напряжение в 5 вольт с помощью HIGH, выдерживаем паузу 1000 миллисекунд с помощью delay()
и убираем напряжение. Функция loop()
повторяется по кругу, поэтому все инструкции в коде будут выполняться до тех пор, пока на плате будет питание.
Собираем пианино
Мы уже знаем практически всю теорию для программирования Arduino и даже попробовали написать свой «Hello, World!», поэтому сейчас можно переходить к более сложным проектам. Попробуем собрать простой музыкальный инструмент, похожий на пианино.
Схема
Схема проекта очень простая, а для сборки понадобятся три кнопки, три резистора на 10 кОм, пищалка и охапка соединительных проводов. Схему будем собирать на макетной плате. Так быстрее работать с прототипами и не надо при каждой новой версии схемы все перепаивать.
Все элементы следует подключать в следующей последовательности, соблюдая порядок пинов:
Код
Весь код проекта выглядит следующим образом:
#define BUZZER 13 // пищалка на 13 пине #define KEY_FIRST 7 // первый пин клавиш #define KEY_COUNT 3 // всего клавиш void setup() { pinMode(BUZZER, OUTPUT); } void loop() { for (int i = 0; i < KEY_COUNT; ++i) { int keyPin = i + KEY_FIRST; boolean keyUp = digitalRead(keyPin); if (!keyUp) { int frequency = 3500 + i * 500; tone(BUZZER, frequency, 20); } } }
Его можно сразу перепечатать в среду разработки и попробовать загрузить на плату. Если все прошло успешно, то при нажатии кнопок будет проигрываться звук. Теперь разберем код более детально.
В самом начале мы задаем имена для пинов, которые будем использовать. Делается это с помощью директивы #define
. После указываем имя большими буквами и номер пина на плате Arduino. Все, после этого в коде мы сможем обращаться к пину по его имени, а не номеру. Это особенно удобно в больших проектах, когда сложно запомнить, какой пин за что отвечает.
#define BUZZER 13 // пищалка на 13 пине #define KEY_FIRST 7 // первый пин клавиш #define KEY_COUNT 3 // всего клавиш
После следует привычная функция setup(). В ней производим подготовительные настройки платы. В этом проекте мы устанавливаем пин пищалки в режим выхода, потому что мы не будем через него ничего получать. Нам надо отдавать звук.
void setup() { pinMode(BUZZER, OUTPUT); }
Важно отметить, что по умолчанию все пины работают в режиме входа. Поэтому мы не прописываем для каждого пина то, что он используется в проекте в качестве входного.
Теперь идет самая важная часть кода — функция loop()
, в которой выполняется вся логика. В случае с пианино мы в цикле for проходимся по всем кнопкам, которые у нас есть. Зная номер кнопки, вычисляем ее пин. Потом считываем с нее значение, чтобы узнать, нажата кнопка или нет. Если нажата, то воспроизводим звук. Для считывания значения кнопки используем функцию digitalRead()
, а воспроизводим звук с помощью tone()
.
void loop() { for (int i = 0; i < KEY_COUNT; ++i) { int keyPin = i + KEY_FIRST; boolean keyUp = digitalRead(keyPin); if (!keyUp) { int frequency = 3500 + i * 500; tone(BUZZER, frequency, 20); } } }
Итог
- Программировать Arduino не так сложно, как может показаться. Разработчики платформы постарались сделать все, чтобы можно было просто писать код, а не разбираться с устройством платы.
- Arduino существует уже достаточно много лет и активно поддерживается сообществом, поэтому можно найти библиотеки для решения практически любых задач.
- Платформу поддерживают и сторонние производители, поэтому в магазинах можно найти множество датчиков, сенсоров и модулей, расширяющих возможности Arduino.
- Разработчики развивают не только саму платформу, но и инструменты для работы с ней.