Баннер мобильный (1) Пройти тест

Arduino — как это программировать: основы для новичков

Что такое Arduino и с чего начать его изучение

Инструкция

3 марта 2024

Поделиться

Скопировано
Arduino — как это программировать: основы для новичков

Содержание

    Arduino — программирование, которое можно потрогать. Плата позволяет не только поработать с кодом, но и реализовать его в физическом мире. Например, запрограммировать плату помигать светодиодами или сделать из нее музыкальный инструмент. Разбираемся, как начать программировать на Arduino с нуля, какие IDE подходят для работы с платой и приводим примеры кода. 

    Что такое Arduino

    Arduino — аппаратная платформа на базе микроконтроллера, предназначенная для разработки умных устройств и автоматизированных систем. С помощью 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
    Так выглядит интерфейс Arduino IDE.

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

    Облачный интерфейс Arduino
    Так выглядит облачный IDE для Arduino.

    Разрабатывать код для Arduino можно и в редакторе кода Visual Studio Code от Microsoft. Это возможно благодаря стороннему плагину PlatformIO, который упрощает взаимодействие с железом. Плагин бесплатный и предоставляет функции для разработки, отладки и прошивки плат.

    Визуальное программирование Arduino

    Новичкам может быть сложно сразу начать писать код на Arduino C из-за того, что в основе языка лежит достаточно сложный C++. Далеко не все платы поддерживают MicroPython, поэтому решением может стать визуальное программирование, построенное на перетягивании нужных фрагментов кода друг за другом. Такой способ будет полезен не только начинающим, но и детям на кружках по программированию.

    Проект Массачусетского технологического института S4A представляет собой модификацию языка визуального программирования для Arduino. С его помощью можно собирать блоки кода в готовую прошивку для фирменных плат. Проект давно не обновлялся, но все равно стабильно работает. Есть русский язык и подробная документация по установке.

    Проект ArduBlock от российских разработчиков активно поддерживается и предлагает актуальные функции для большинства плат Arduino и ESP. Программирование с помощью блоков, а также уроки и инструкции на русском языке доступны в браузере. Вместе с ArduBlock авторы проекта выпускают стартовые наборы для начинающих.

    Интерфейс Ardublock
    Так выглядит сервис для визуального программирования на Arduino ArduBlock

    Основы программирования Arduino

    Файл с кодом проекта для Arduino в сообществе принято называть скетчем. Скетчи пишут по специальным правилам, обеспечивающим корректную работу с железом и выполнение команд. Базовая структура выглядит следующим образом:

    #include "name"
    
    void setup() {
    
    }
    
    void loop() {
    
    }

    В самом начале скетча в главный файл подключают сторонние библиотеки с помощью директивы #include и названия библиотеки. Название можно указать с помощью кавычек («») или галочек (<>). В первом случае поиск к файлу библиотеки производится сначала в папке со скетчем, а потом в папке с установленными библиотеками. Если использовать галочки, то система будет искать указанный файл только в папке с установленными библиотеками.

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

    Функция loop() выполняется по кругу и управляет Arduino. В этой части разработчики пишут основной код скетча, который реализует логику всего проекта. Выполнение loop() запускается сразу за setup(). Эти две функции обязательно должны быть в скетче каждого проекта, даже в тех случаях, когда в функциях нет никаких инструкций. Без них невозможно выполнение кода на Arduino.

    Комментарии и разделители

    Arduino программируют на языке, спроектированном на базе C++, поэтому он наследует многие его особенности. Так, однострочные комментарии задаются с помощью двойного слэша (//). Весь текст внутри комментария компилятор будет игнорировать, обычно текст в слэшах используют для пояснения работы кода. Комментарии в первую очередь нужны людям, которые пишут код и работают с ним, а не компьютеру.

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

    // Однострочный комментарий
    // Второй однострочный комментарий
    
    /*
    А это уже
    Многострочный комментарий
    */

    Все инструкции нужно отделять точкой с запятой (;). Эта особенность тоже пришла в синтаксис Arduino из C++. Если этого не делать, код не соберется и скетч нельзя будет загрузить на плату.

    Переменные Arduino

    Переменные в Arduino нужны, как и во всех языках программирования, для хранения данных. В программировании Arduino мы должны указывать тип переменной перед ее именем. Существуют следующие типы данных:

    Тип данных
    Описание
    Пример
    boolean
    Логический тип, содержащий значения true или false
    boolean logic = true
    byte
    Числовой тип данных для малых чисел от 0 до 255
    byte number = 255
    int
    Целые числа от -32768 до 32767
    int number = 32767
    unsigned int
    Как int, но только больший диапазон чисел и без отрицательных значений. От 0 до 65535
    unsigned int number = 65535
    float
    Числа с плавающей точкой
    float number = 22.15

    Операторы Arduino

    Оператор
    Описание
    Пример
    if
    Условный оператор, проверяющий, является ли указанное значение истинным. К примеру, 3 больше 2, поэтому такое условие примет истинное значение
    if (3 > 2) { действие }
    if else
    Условный оператор, выполняющий два разных действия: для истинного и ложного значения
    if (3 > 2) { действие }else { действие }
    for
    Цикл, предназначенный для повторного выполнения действий. К примеру, с его помощью можно пройтись по массиву светодиодов и установить каждому яркость
    for (int i = 0; i < KEY_COUNT; ++i) { действие }
    while
    Цикл, который выполняется до тех пор, пока его условие остается истиной. К примеру, будет выполняться, пока переменная больше или меньше какого-нибудь значения
    while (number > 5) { действие }

    Загрузка прошивки на плату

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

    Сначала подключаем плату по USB к компьютеру. В каждом поколении и типе Arduino используется свой стандарт подключения. Это важно учитывать. В запущенной IDE раскрываем список и ищем в нем плату.

    Интерфейс Arduino IDE, функция записи на плату
    Так работает загрузка кода на плату в 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 кОм, пищалка и охапка соединительных проводов. Схему будем собирать на макетной плате. Так быстрее работать с прототипами и не надо при каждой новой версии схемы все перепаивать.

    Все элементы следует подключать в следующей последовательности, соблюдая порядок пинов:

    Схема подключения Arduino к кнопкам
    Если у вас есть плата под рукой, попробуйте собрать все в точности, как на картинке

    Код

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

    #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.
    • Разработчики развивают не только саму платформу, но и инструменты для работы с ней.

    Инструкция

    Поделиться

    Скопировано
    0 комментариев
    Комментарии