Как можно писать программы для платы Arduino?
Arduino изначально поддерживает язык, который мы называем языком программирования Arduino или языком Arduino.
Этот язык основан наПроводкаплатформа разработки, которая, в свою очередь, основана наОбработка, что, если вы не знакомы, вот чтоp5.jsоснован на. Это долгая история проектов, основанных на других проектах с очень открытым исходным кодом. IDE Arduino основана на среде Processing IDE и Wiring IDE, которая строится поверх нее.
Когда мы работаем с Arduino, мы обычно используем Arduino IDE (интегрированную среду разработки), программное обеспечение, доступное для всех основных настольных платформ (macOS, Linux, Windows), которое дает нам 2 вещи: редактор программирования с поддержкой интегрированных библиотек и способ легко скомпилировать и загрузить наши программы Arduino на плату, подключенную к компьютеру.
Язык программирования Arduino — это, по сути, фреймворк, построенный на основе C ++. Вы можете возразить, что это не настоящий язык программирования в традиционном понимании, но я думаю, что это помогает избежать путаницы для новичков.
Программа, написанная на языке программирования Arduino, называетсянабросок. Эскиз обычно сохраняется с.inoрасширение (от Arduino).
Главное отличие от «нормального»или C ++ заключается в том, что вы объединяете весь свой код в две основные функции. Разумеется, у вас может быть больше двух, но любая программа Arduino должна обеспечивать как минимум эти 2.
Один называетсяsetup(), другой называетсяloop(). Первый вызывается один раз при запуске программы, второй повторно вызывается во время работы вашей программы.
У нас нетmain()функция, как вы привыкли в C / C ++, в качестве точки входа для программы. После того, как вы скомпилируете свой скетч, IDE убедится, что конечным результатом является правильная программа на C ++, и в основном добавит недостающий клей путем его предварительной обработки.
Все остальное — это обычный код C ++, а поскольку C ++ является надмножеством C, любой допустимый C также является допустимым кодом Arduino.
Одно отличие, которое может вызвать у вас проблемы, заключается в том, что, хотя вы можете создавать свою программу в нескольких файлах, все эти файлы должны находиться в одной папке. Если ваша программа вырастет до очень больших размеров, это может быть ограничением, нарушающим сделку, но в этот момент будет легко перейти на нативную настройку C ++, что возможно.
Частью языка программирования Arduino являются встроенные библиотеки, которые позволяют легко интегрироваться с функциями, предоставляемыми платой Arduino.
Ваша первая программа на Arduino наверняка будет включать в себя включение светодиода, а затем его выключение. Для этого вы будете использоватьpinMode(),delay()иdigitalWrite()функции, а также некоторые константы, такие какHIGH,LOW,OUTPUT.
Вот так, канонический первый проект Arduino («Hello, World!»):
#define LED_PIN 13 void setup() { // Configure pin 13 to be a digital output pinMode(LED_PIN, OUTPUT); } void loop() { // Turn on the LED digitalWrite(LED_PIN, HIGH); // Wait 1 second (1000 milliseconds) delay(1000); // Turn off the LED digitalWrite(LED_PIN, LOW); // Wait 1 second delay(1000); }
Все это часть языка программирования Arduino, или лучше называть егосюитаили жебиблиотека.
Встроенные константы языка программирования Arduino
Arduino устанавливает две константы, которые мы можем использовать для
HIGHсоответствует высокому уровню напряжения, которое может различаться в зависимости от оборудования (> 2 В на платах 3.3 В, таких как Arduino Nano,> 3 В на платах 5 В, таких как Arduino Uno)LOWприравнивается к низкому уровню напряжения. Опять же, точное значение зависит от используемой платы.
Затем у нас есть 3 константы, которые мы можем использовать в сочетании сpinMode()функция:
- INPUTустанавливает контакт как входной контакт
- OUTPUTустанавливает контакт как выходной контакт
- INPUT_PULLUPустанавливает вывод как внутренний подтягивающий резистор
Другая постоянная, которая у нас есть, этоLED_BUILTIN, который указывает на номер бортового штифта, который обычно приравнивается к номеру13.
В дополнение к этому у нас есть константы C / C ++trueиfalse.
Начало использования Arduino
Если вы никогда ранее не программировали, и это ваш первый опыт, то программирование микроконтроллеров Arduino пойдёт куда проще, если вы начнёте с основ.
Конечно, когда в планах у вас нет никаких сложных проектов, можете работать на готовых библиотеках и параллельно разбирать, из чего состоят их функции. Это один из хороших способов обучения, но тогда стоит искать наборы функций, которые писались профессионалами, чтобы быть уверенным в их правильности.
Иначе вы можете увидеть неправильное решение задачи и, в результате, применять те в своих проектах.
Но куда лучше начать с основ и посвятить хотя бы неделю освоению алгоритмизации и научиться разбивать свои проекты на блоки, а те – уже на конкретные шаги. Подобное построение блок-схем вам не раз пригодится в будущем.
Когда вы изучите весь базис, можно переходить к практике и самообучению на С++, подойдут любые простейшие проекты или заготовленные в интернете задачи.
На этом этапе вашей целью станет понять основные парадигмы и научиться их использовать, а также изучить возможности языка, чтобы вы чётко знали, что он может, и могли здраво оценить реализуемость ваших проектов.
Встроенные функции языка программирования Arduino
В этом разделе я собираюсь сделать ссылку на встроенные функции, предоставляемые языком программирования Arduino.
Жизненный цикл программы
- setup()эта функция вызывается один раз при запуске программы, а также при выключении и перезапуске Arduino.
- loop()эта функция многократно вызывается во время работы программы Arduino.
Обработка ввода / вывода
Следующие функции помогают обрабатывать ввод и вывод с вашего устройства Arduino.
Цифровой ввод / вывод
- digitalRead()считывает значение с цифрового вывода. Принимает номер контакта в качестве параметра и возвращаетHIGHили жеLOWпостоянный.
- digitalWrite()пишетHIGHили жеLOWзначение на цифровой выходной контакт. Вы передаете пин-код иHIGHили жеLOWкак параметры.
- pinMode()устанавливает контакт как вход или выход. Вы передаете пин-код иINPUTили жеOUTPUTзначение как параметры.
- pulseIn()считывает цифровой импульс сLOWкHIGHа затем вLOWснова или изHIGHкLOWи чтобыHIGHснова на булавке. Программа будет заблокирована до тех пор, пока не будет обнаружен пульс. Вы указываете номер контакта и тип импульса, который хотите обнаружить (LHL или HLH). Вы можете указать необязательный тайм-аут, чтобы перестать ждать этого импульса.
- pulseInLong()такой же какpulseIn(), за исключением того, что он реализован иначе и не может использоваться, если прерывания отключены. Обычно прерывания отключаются, чтобы получить более точный результат.
- shiftIn()читает байт данных по одному биту с вывода.
- shiftOut()записывает байт данных по одному биту на вывод.
- tone()посылает прямоугольную волну на штырь, используемую для зуммеров / динамиков для воспроизведения тонов. Вы можете указать контакт и частоту. Он работает как с цифровыми, так и с аналоговыми выводами.
- noTone()останавливаетtone()генерируемая волна на булавке.
Аналоговый ввод / вывод
- analogRead()считывает значение с аналогового вывода.
- analogReference()настраивает значение, используемое для верхнего диапазона входного аналогового входа, по умолчанию 5 В на платах 5 В и 3,3 В на платах 3,3 В.
- analogWrite()записывает аналоговое значение на вывод
- analogReadResolution()позволяет изменить разрешение аналоговых битов по умолчанию дляanalogRead(), по умолчанию 10 бит. Работает только на определенных устройствах (Arduino Due, Zero и MKR)
- analogWriteResolution()позволяет изменить разрешение аналоговых битов по умолчанию дляanalogWrite(), по умолчанию 10 бит. Работает только на определенных устройствах (Arduino Due, Zero и MKR)
Модели Ардуино
Вот мы и добрались до самих плат Ардуино, которых на данный момент появилось великое множество благодаря открытости платформы: все схемы и исходные коды находятся в открытом доступе, и вы можете сделать свою версию платы и продавать её, чем активно занимаются китайцы. Единственный пункт: слово Arduino – зарегистрированная торговая марка, и свою плату вам придется назвать как-то по-другому, отсюда и появились всякие Искры, Бузины и прочие так называемые Arduino совместимые платы. Разновидностей плат очень много, но используют они одни и те же модели микроконтроллеров. От модели микроконтроллера зависит объем памяти и количество ног, ну и есть некоторые специальные фишки. На большинстве моделей Arduino стоят 8-битные МК от AVR с кварцевым генератором на 16 МГц (либо ниже), то есть по производительности платы на ATmega не отличаются, отличаются только объемом памяти, количеством ног и интерфейсов/таймеров. Модели Ардуино с МК от производителя ARM, например Arduino DUE, в разы мощнее своих собратьев за счёт 32-битного процессора, но это совсем другая история.
Параметр | ATtiny85 | ATmega328 | ATmega32u4 | ATmega2560 |
Кол-во ног | 8 | 32 | 44 | 100 |
Из них доступны | 5 | 23 | 24 | 86 |
Flash память | 8 Kb | 32 Kb | 32 Kb | 256 Kb |
EEPROM память | 512 bytes | 1 Kb | 1 Kb | 4 Kb |
SRAM память | 512 bytes | 2 Kb | 2.5 kB | 8 Kb |
Каналов АЦП | 3 (4 с rst) | 6 (8 в SMD корпусе) | 12 | 16 |
Каналов PWM | 3 | 6 | 7 | 15 |
Таймеры | 2х 8bit | 2х 8bit | 2х 8bit | 2х 8bit |
1х 16bit | 2х 16bit | 4х 16bit | ||
Аппаратный Serial | Нет | х1 | х1 | х4 |
Внешние прерывания | 1 (+6 PCINT) | 2 (+23 PCINT) | 5 (+44 PCINT) | 8 (+32 PCINT) |
Платы на его основе | Digispark, LilyTiny | Uno, Nano, Pro Mini, Lilypad, Strong | Leonardo, Micro, Pro Micro, BS Micro | Mega, Mega Pro |
Таким образом вы должны сразу понять, что, например, Ардуино Уно=Нано=Про Мини=Лилипад по своим возможностям и взаимозаменяемости. Или Леонардо=Про Микро. Ссылки на недорогие китайские Ардуины вы можете найти у меня на сайте. Точно там же вы найдёте ссылки на кучу датчиков, модулей и другого железа, которое можно подключить к Arduino. О возможностях ардуино по работе с другими железками поговорим в одном из следующих уроках.
Математические функции
- abs()абсолютное значение числа
- constrain()ограничивает число в пределах диапазона,см. использование
- map()переназначает число из одного диапазона в другой,см. использование
- max()максимум два числа
- min()минимум двух чисел
- pow()значение числа в степени
- sq()квадрат числа
- sqrt()квадратный корень из числа
- cos()косинус угла
- sin()синус угла
- tan()тангенс угла
Примечание: есть больше встроенных математических функций, если они вам нужны,задокументировано здесь.
Работа с буквенно-цифровыми символами
- isAlpha()проверяет, является ли символ альфа (буквой)
- isAlphaNumeric()проверяет, является ли символ буквенно-цифровым (буква или цифра)
- isAscii()проверяет, является ли char символом ASCII
- isControl()проверяет, является ли символуправляющий персонаж
- isDigit()проверяет, является ли символ числом
- isGraph()проверяет, является ли char печатаемым символом ASCII и содержит ли он содержимое (например, это не пробел)
- isHexadecimalDigit()проверяет, является ли символ шестнадцатеричной цифрой (AF 0-9)
- isLowerCase()проверяет, является ли char буквой в нижнем регистре
- isPrintable()проверяет, является ли char печатаемым символом ASCII
- isPunct()проверяет, является ли символ пунктуацией (запятая, точка с запятой, восклицательный знак и т. д.)
- isSpace()проверяет, является ли символ пробелом, фид формы\f, новая линия\n, возврат каретки\r, горизонтальная табуляция\t, или вертикальная табуляция\v.
- isUpperCase()проверяет, является ли char буквой в верхнем регистре
- isWhitespace()проверяет, является ли символ пробелом или горизонтальной табуляцией\t
Загрузка скетча в плату Ардуино
Давайте сначала разберемся с тем, что происходит внутри ардуино, когда мы решаем изменить внутреннюю программу, управляющую им.
Что происходит, когда мы жмем кнопку «Загрузить»
Плата Ардуино – это микроконтроллер AVR (Atmega8/168/328 или Atmega1280/2560), который прошивается загрузчиком. В микроконтроллер записывается программа, называемая прошивкой, которая позволяет получать сигналы с датчиков, обрабатывать нажатия кнопок, общаться с различными устройствами через интерфейсы, управлять исполнительными процессами.
Обычно прошивка записывается в кристалл микроконтроллера при помощи специальных устройств, называемых программаторами. Для разных микроконтроллеров существуют различные программаторы – от специализированных до универсальных. Важным отличием Ардуино от других контроллеров является возможность залить прошивку через обычный USB кабель. Это достигается при помощи специальной программы – загрузчика (Bootloader). Для прошивки не требуются лишние провода, не нужно подключать дополнительные устройства или нажимать что-то на плате. Также при работе через загрузчик нельзя добраться до опасных настроек, которые выведут из строя Ардуино.
При подключении платы Ардуино к источнику питания, внутри него начинается активная деятельность микропрограмм. При запуске микроконтроллера управление получает загрузчик. Первые 2 секунды он проверяет, поступил ли новый код от пользователя. Кроме того загрузчик подает импульсы на пин, к которому подключен светодиод, и он начинает мигать. Это означает, что загрузчик установлен и работает исправно. Когда подается скетч, загрузчик записывает его во флеш-память микроконтроллера. Затем эта программа подается на выполнение. Если данные не поступили, загрузчик запускает предыдущую программу. Во время выполнения программы внутри Ардуино выполняется ряд операций по инициализации и настройке среды окружения, и только после этого начинается выполнение кода.
Вызов setup и loop при загрузке
В самом коде имеются несколько основных функций, на их примере можно рассмотреть работу микроконтроллера.
Команда void setup() – в ней записываются данные, которые микроконтроллер выполняет в момент загрузки, а после может про них забыть. В этой функции указываются номера пинов, к которым подключается устройство, подключаются и инициализируются библиотеки, устанавливается скорость работы с последовательным портом.
Функция void loop – в нее помещаются команды, которые должны выполняться, пока включена плата. Микроконтроллер начнет выполнять программы, начиная с первой, и когда дойдет до конца, сразу вернется в начало, чтобы повторить эту же последовательность бесконечное число раз.
Загрузка скетча в Arduino IDE
В Ардуино IDE компиляция скетча начинается при нажатии кнопки Verify, после этого скетч может быть загружен в память Ардуино через USB с помощью кнопки Upload. Перед загрузкой кода программы нужно установить все параметры в меню Tools. В этом меню выбираются порт, к которому подключена плата, и платформу. В окне Arduino IDE внизу будет отображен ход компиляции скетча. При успешной выгрузке скетча будет получено сообщение «Done uploading». Запуск скетча начинается сразу после окончания загрузки. Для расширения возможностей можно подключать дополнительные внешние библиотеки, разработанные командой Ардуино или сторонними авторами.
Обзор возможных вариантов загрузки скетча
Кратко весь алгоритм можно записать следующим образом: Написание кода >> компиляция >> загрузка в микроконтроллер. При загрузке скетча используется Bootloader (Загрузчик). Он представляет собой небольшую программу, которая загружается в микроконтроллер на Ардуино. С помощью этой программы можно загружать скетч, не используя дополнительные аппаратные средства. При работе загрузчика на плате будет мигать светодиод.
1. Загрузка в Arduino IDE. Самый простой и удобный вариант загрузки кода. Все, что нужно сделать – это написать или найти нужный скетч и загрузить его.
- Ускоренная загрузка скетча в Arduino IDE. С помощью этого метода можно увеличить скорость загрузки в микроконтроллер в два раза. Для этого нужно лишь зайти в Настройки и снять галочку с пункта Проверка кода. Пропуская шаг проверки, будет уменьшено количество байтов, которые передаются во время загрузки. При этом все равно некоторые из видов проверок будут осуществлены, но они не занимают долгого времени. Отключать проверку кода не рекомендуется, если Ардуино помещается в какой-либо ответственный проект (например, в спутник). Также можно провести проверку, если подключение производится через очень длинный USB кабель (порядка 10 метров).
Уменьшение времени загрузки при помощи отключения проверки работает с любой платой Ардуино, которая использует USB соединение. Все эти микроконтроллеры используют загрузчик avrdude. Платы, которые используют загрузчик Catarina, не нуждаются в отключении проверки кода, так как этот загрузчик работает быстрее.
- Загрузка скетча в Ардуино через Bluetooth. Этот способ используется, когда нужно обойтись без физического соединения Ардуино и компьютера – например, в силовых цепях или радиочастотных цепях. Для реализации загрузки потребуется Bluetooth-модуль, который оснащен платой-адаптером для Ардуино. Этот модуль нужно подключить к компьютеру через переходник USB-UART-TTL. Работа с модулем осуществляется с помощью AT-команд.
- Загрузка при помощи Андроид-устройства. Для осуществления такого типа загрузки кода понадобятся провода USB-A – USB-B и USB-Host (OTG-кабель), Ардуино и устройство на базе Андроид с поддержкой режима host. На Андроид-устройство нужно установить программу ArduinoDroid или ArduinoCommander из Google Play. Все устройства нужно соединить при помощи кабелей, после этого можно включать Ардуино и загружать на него код. Нужно запустить установленную программу. При включении начнется обновление IDE, на что понадобится некоторое время.
Сначала работа будет рассмотрена на примере программы ArduinoCommander. После ее запуска нужно нажать USB-Device. Затем нужно наддать Autodetect, чтобы Андроид-устройство выполнило поиск Ардуино и отобразило его на экране. Как только Ардуино появится на экране, нужно на него нажать. Чтобы перейти в меню, нужно щелкнуть в нижнем правом углу. В этом меню можно загрузить скетч с SD-карты.
ArduinoDroid представляет собой среду разработки, компилятор и загрузчик одновременно. Начать компиляцию скетча нужно нажав на кнопку Lightning-Button. После завершения компиляции нужно нажать на кнопку загрузки. Загрузка занимает несколько секунд. По окончании загрузки ардуино запустит на выполнение новый код.
- Программирование при помощи Raspberry Pi. Можно загружать скетчи двумя способами – при помощи Arduino IDE и при помощи пакета arduino-mk. Пакет позволяет собирать и загружать скетчи Ардуино из командной строки.
Работа с битами и байтами
- bit()вычисляет значение бита (0 = 1, 1 = 2, 2 = 4, 3 = 8…)
- bitClear()очистить (устанавливает в 0) бит числовой переменной. Принимает число и номер бита, начиная с правого.
- bitRead()прочтите немного числа. Принимает число и номер бита, начиная с правого.
- bitSet()устанавливает в 1 бит числа. Принимает число и номер бита, начиная с правого.
- bitWrite()записать 1 или 0 в определенный бит числа Принимает число, номер бита, начиная с правого, и значение для записи (0 или 1)
- highByte()получить старший (крайний левый) байт словарной переменной (имеющей 2 байта)
- lowByte()получить младший (крайний правый) байт словарной переменной (имеющей 2 байта)
Подведение итогов
Как видно из приведенного нами краткого обзора, сегодня можно найти достаточно широкий ассортимент сделанных в России готовых наборов Arduino для электронного конструирования. Преимуществом российских наборов является лучшее, чем у недорогих китайских конструкторов качество исполнения компонентов и наличие инструкции на русском языке. Основной минус – достаточно высокая по сравнению с теми же аналогами в Китае стоимость. Очень часто, открыв российский набор, можно найти просто переупакованные китайские запчасти с иероглифами на модулях и датчиках. Только некоторые производители предлагают уникальные конструкторы собственной разработки. Будем надеяться, что рынок образовательной ардуино робототехники будет только расти и у нас впереди еще будет много открытий.
Дополнительные уроки по электронике:
- Arduino против Raspberry Pi
- Введение в Arduino
- Плата Arduino Uno rev 3
- Плата Arduino Uno WiFi rev 2
- Введение в язык программирования Arduino
- Милли Микро Нано Пико
- The Arduino MKR WiFi 1010
- Введение в электронику
- Основы электроники: аналоговые и цифровые
- Основы электроники: ток
- Основы электроники: напряжение
- Основы электроники: Vcc, земля, …
- Основы электроники: сопротивление
- Основы электроники: короткое замыкание
- Основы электроники: ваша первая схема
- Основы электроники: прототипирование с использованием макетов
- Основы электроники: использование мультиметра
- Измерение напряжения, тока и сопротивления с помощью мультиметра
- Что купить, чтобы начать работу с Arduino и электроникой
- Проект Arduino: мигает светодиодом
- Встроенный светодиод Arduino
- Модуль питания макетной платы
- Платформа Arduino Create
- Как подключиться к сети Wi-Fi с помощью Arduino
- Как запустить веб-сервер на Arduino
Первый проект на Arduino
Давайте соберем первое устройство на базе Ардуино. Мы просто подключим тактовую кнопку и светодиод к ардуинке. Схема проекта выглядит так:
Управление яркостью светодиода
Обратите внимание на дополнительные резисторы в схеме. Один из них ограничивает ток для светодиода, а второй притягивает контакт кнопки к земле. Как это работает и зачем это нужно я объяснял в этом уроке.
Для того что бы все работало, нам надо написать скетч. Давайте сделаем так, что бы светодиод загорался после нажатия на кнопку, а после следующего нажатия гас. Вот наш первый скетч:
// переменные с пинами подключенных устройств int switchPin = 8; int ledPin = 11; // переменные для хранения состояния кнопки и светодиода boolean lastButton = LOW; boolean currentButton = LOW; boolean ledOn = false; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); } // функция для подавления дребезга boolean debounse(boolean last) { boolean current = digitalRead(switchPin); if(last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() { currentButton = debounse(lastButton); if(lastButton == LOW && currentButton == HIGH) { ledOn = !ledOn; } lastButton = currentButton; digitalWrite(ledPin, ledOn); }
В этом скетче я создал дополнительную функцию debounse для подавления дребезга контактов. О дребезге контактов есть целый урок на моем сайте. Обязательно ознакомьтесь с этим материалом.