Как можно писать программы для платы 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 IDE:
- загрузка программы;
- проверка на наличие ошибок;
- создание нового скетча;
- сохранение скетча;
- загрузка сохранения;
- открытие окна порта микроконтроллера;
Следующим по важности элементом является вкладка с файлами проекта. Если это простой скетч, то файл будет всего один. Однако сложные скетчи могут состоять из нескольких файлов. В таком случае на панели вкладок можно быстро переключить просмотр с одного файла на другой. Это очень удобно.
Самым большим из блоков является поле редактора наших скетчей. Тут мы можем просмотреть и, при необходимости, отредактировать нужный нам программный код. Отдельно реализовано поле для вывода системных сообщений. С его помощью можно убедиться, что сохранение вашего скетча или его загрузка были проведены успешно, и вы можете приступать к следующим действиям. Также в программе существует окно, отображающее наличие в ходе компиляции вашего скетча.
Компиляция – преобразование исходного кода языка высокого уровня в машинный код или на язык ассемблера.
Встроенные функции языка программирования 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)
Что можно и чего нельзя
Ардуино работает на одноядерном и не шибко шустром процессоре. Его тактовая частота — 16 мегагерц, то есть 16 миллионов процессорных операций в секунду. Это не очень быстро, плюс ядро только одно, и оно исполняет одну команду за другой.
Вот какие ограничения это на нас накладывает.
Нет настоящей многозадачности. Можно симулировать многозадачность с помощью приёма Protothreading, но это скорее костыль. Нельзя, например, сказать: «Когда нажмётся такая-то кнопка — сделай так». Вместо этого придётся в основном цикле писать проверку: «А эта кнопка нажата? Если да, то…»
Нет понятия файлов (без дополнительных примочек, библиотек и железа). На контроллер нельзя ничего сохранить, кроме управляющей им программы. К счастью, есть платы расширения, которые позволяют немножко работать с файлами на SD-карточках.
Как на microSD-карточке помещается 1 терабайт?
Аналогично с сетью: без дополнительных плат и библиотек Ардуино не может ни с чем общаться (кроме как включать-выключать электричество на своих выходах).
Полегче со сложной математикой: если вам нужно что-то сложное типа тригонометрических функций, будьте готовы к тому, что Ардуино будет считать их довольно медленно. Для вас это одна строчка кода, а для Ардуино это тысячи операций под капотом. Пощадите.
Отчёты? Ошибки? Только при компиляции. У Ардуино нет встроенных средств сообщить вам, что ему нехорошо. Если он завис, он не покажет окно ошибки: во-первых, у него нет графического интерфейса, во-вторых — экрана. Если хотите систему ошибок или отчётность, пишите её