Глава 1: Начните обучение с платой Arduino UNO
Добро пожаловать в первую главу моего самоучителя по Arduino для начинающих. В этой главе вы узнаете самые основы платформы Arduino, чтобы начать программировать. Я научу вас, как настроить компьютер и написать свою первую программу для платы Arduino Uno.
Что может быть лучше для начала знакомства с платформой Arduino, чем плата Arduino Uno. Для программистов ПЛК знание микроконтроллеров часто может быть преимуществом. Они очень похожи во многих аспектах, и знание микроконтроллеров может помочь вам понять, как работает ПЛК.
Если вы живете в Европе, Arduino недавно сменила название на Genuino.
Плата Arduino Uno или Genuino Uno – это простая платформа для создания прототипов электроники с открытым исходным кодом. Она оснащена микроконтроллером Atmel ATmega328P, что делает ее идеальной для изучения встраиваемого программирования и микроконтроллеров.
Есть несколько причин, по которым Arduino Uno идеально подходит для начинающих:
- Простое подключение к компьютеру. Плата Arduino Uno имеет USB-порт, поэтому ее можно легко подключить к компьютеру. Все драйверы даже включены в Arduino IDE, так что это единственное, что вам придется установить.
- Простая проводка. Все контакты микроконтроллера ATmega328P подключены к разъемам сбоку. Таким образом, вы можете подключить его к макетной плате без особых проблем.
- Упрощенный язык программирования. При программировании Arduino Uno вы будете использовать упрощенный язык программирования. Фактически, это упрощенный язык программирования C.
- Обширная поддержка. Платформа Arduino очень популярна и насчитывает миллионы пользователей. Это означает, что при возникновении проблем можно получить много помощи. Вы сможете набрать в Google множество проблем и найти множество решений.
Раз уж он так хорош для начинающих, почему бы нам не начать обучение Arduino Uno с настройки компьютера?
Программное обеспечение для Arduino Uno
Прежде всего, вам нужно установить программное обеспечение для Arduino Uno.
Существует несколько IDE (интегрированных редакторов разработки) для программирования плат Arduino. В этом уроке мы будем использовать Arduino IDE, которая является бесплатной IDE с открытым исходным кодом от Arduino.
Arduino IDE – это очень простое программное обеспечение для программирования плат Arduino. Процесс загрузки и установки очень прост.
Скачать Arduino IDE можно здесь.
После того как вы скачали IDE, вам нужно установить ее. Установка очень проста, и вам не придется делать ничего особенного, кроме как принять условия и выбрать компоненты, которые вы хотите установить.
Вот несколько инструкций по установке Arduino IDE на различные платформы:
После установки вы можете запустить Arduino IDE.
Большая часть IDE будет представлять собой поле, на котором будет размещаться ваш код, меню в верхней части и терминал в нижней.
Следующим шагом будет подключение Arduino Uno к компьютеру.
Подключение Arduino Uno
Перед первым подключением Arduino Uno необходимо закрыть Arduino IDE.
Для подключения платы к компьютеру вам понадобится кабель USB 2.0 A/B.
На боковой стороне Arduino Uno есть разъем USB типа B. Подключите кабель к нему, а другой конец – к одному из портов USB на компьютере. Плата автоматически включится через USB, и вы увидите, как светодиод ON загорится зеленым.
Если вы используете Windows, то при первом подключении Arduino вам придется найти драйверы. Во всплывающем окне вы должны выбрать поиск драйверов на вашем компьютере. Когда вы нажмете кнопку browse, перейдите в папку, в которую вы установили Arduino, и выберите папку Drivers.
После этого можно запускать Arduino IDE.
Давайте проверим, работает ли соединение с вашей Arduino Uno.
Перейдите в меню Sketch -> Upload или нажмите Ctrl+U.
Это должно привести к загрузке кода, написанного в белом поле, на ваш Arduino. Этот код ничего не делает и не имеет никаких функций. Он просто проверяет, есть ли у вас соединение с платой.
Если загрузка прошла успешно, вы должны увидеть сообщение “Done uploading.” в синей полоске прямо над черным окном терминала в нижней части IDE.
Вы можете увидеть оранжевую полосу вместо синей с сообщением: “При загрузке скетча произошла ошибка”.
Скорее всего, это связано с тем, что вы выбрали неправильный порт.
Перейдите в меню Tools -> Port и выберите COM-порт, в названии которого присутствует (Arduino/Genuino Uno).
Теперь попробуйте снова загрузить код (Sketch -> Upload или Ctrl+U), и все должно получиться.
Поздравляем! Теперь вы готовы приступить к программированию на Arduino Uno!
Ваша первая программа для Arduino Uno
Прежде чем мы продолжим, вам придется выучить одно новое слово. В IDE Arduino код называется не программой, а скетчем.
Поскольку мы используем Arduino IDE, я буду использовать слово “скетч” для нашего кода, потому что так легче ориентироваться в IDE.
Давайте начнем с нашего первого скетча!
Для этого вам понадобятся только плата Arduino Uno и USB-кабель. Плата Arduino Uno имеет встроенный светодиод (светоизлучающий диод), подключенный к одному из цифровых входов/выходов.
Цифровые пины (контакты, выходы) Arduino Uno
Если вы посмотрите на распиновку платы Arduino Uno, то увидите, что все разъемы с заголовками по бокам подключены к микроконтроллеру.
Здесь есть и контакты для питания, и контакты для связи с Arduino, но сейчас нам нужно обратить внимание на цифровые входы/выходы.
В верхней части платы Arduino Uno находятся разъемы от 0 до 13, а затем один под названием GND. Это все цифровые входы или выходы, а последний – это земля. На плате Arduino вы можете увидеть, что все они помечены как “DIGITAL”.
Так что же это за цифровые выводы? И что я имею в виду, когда говорю, что они являются и входами, и выходами?
Цифровые входы и выходы
Все цифровые контакты от 0 до 13 могут быть настроены как входы или выходы. Вы сделаете это в коде.
Мы называем эти контакты цифровыми, потому что они имеют два состояния.
HIGH и LOW.
Эти два состояния – уровень напряжения. Например, если вы установите один из цифровых выводов в качестве выхода (как мы собираемся сделать в ближайшее время), вы можете установить его в коде в состояние HIGH или LOW.
Если выход LOW, то на пине будет 0 вольт. Но если он установлен в HIGH, то уровень напряжения будет 5 вольт.
Это очень полезно для нас. Если вы хоть немного разбираетесь в электронике, то быстро поймете, что мы можем использовать это изменение между 0 и 5 вольтами для управления вещами.
Давайте вернемся к коду и посмотрим, как мы можем настроить цифровые пины.
Минимальный код для Arduino
Когда вы открываете Arduino IDE, вы обычно видите фрагмент кода, который выглядит следующим образом:
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
На самом деле это минимальный код, необходимый вашей плате Arduino Uno.
Setup и loop – это функции на языке C. C – это язык программирования, используемый для Arduinos. По сути, это упрощенная версия C, но синтаксис тот же. Программирование микроконтроллеров на C может быстро стать сложным, потому что вам придется иметь дело с памятью и так далее. Тот факт, что вам не придется этого делать, является одним из самых больших преимуществ платформы Arduino.
Если вы никогда раньше не сталкивались с языком программирования C или хотите улучшить свои навыки программирования на C, я настоятельно рекомендую книгу The C Programming Language (партнерская ссылка) от K&R. Первая глава этого учебника по языку C также очень полезна.
Сначала посмотрите на функцию setup. Внутри нее вы увидите одну строку кода. Это не совсем код, а скорее комментарий. Все, что написано в строке после двух косых черт, является комментарием и будет проигнорировано Arduino.
Функция настройки Arduino
Как сказано в комментарии, эта функция будет запущена только один раз. Это происходит при включении питания Arduino или при нажатии кнопки сброса.
Это может оказаться очень полезным. Вы можете использовать ее как функцию для установки переменных и так далее в вашей программе. Именно поэтому функция называется setup. Arduino просто выполнит этот код один раз, а затем перейдет к основной функции.
Помните, что цифровые контакты на Arduino могут быть настроены как на входы, так и на выходы. Функция setup – идеальное место для определения этого, поскольку вам нужно сделать это только один раз.
Определение выхода с помощью функции pinMode()
Для того чтобы определить, должен ли цифровой пин на вашей плате Arduino Uno быть входом или выходом, вам нужно использовать другую функцию. Это также стандартная функция Arduino. Мы будем использовать функцию pinMode().
В Arduino используется упрощенный язык C с большим количеством встроенных функций. Как уже говорилось, это значительно облегчает настройку и программирование платы. Стандартной функцией для определения цифровых выводов является функция pinMode().
Если вы посмотрите в справочнике на функцию pinMode(), то увидите следующее:
pinMode(pin, mode)
Это синтаксис функции. Видно, что функция принимает 2 параметра: pin и mode.
pin: Номер пина, который вы хотите установить
режим: Для чего вы будете определять пин (например, INPUT или OUTPUT).
Учитывая это, давайте вернемся к нашей первой программе.
На плате Arduino Uno есть встроенный светодиод. Этот светодиод подключен к контакту № 13. Помните, что это светодиод, поэтому мы хотим установить этот вывод на выход. Вот как мы это сделаем:
void setup() {
// put your setup code here, to run once:
pinMode(13, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
}
Вы можете видеть, что функция pinMode() помещена в функцию setup(). Это потому, что нам нужно установить пин только один раз.
Имейте в виду, что состояние цифровых пинов Arduino по умолчанию – вход. Поэтому, если вы хотите использовать их как входы, функция pinMode() вам даже не понадобится.
Встроенный светодиод и константы
Есть и другой способ установить контакт под номером 13. Этот вывод особенный, потому что к нему подключен встроенный светодиод. Поэтому вместо того, чтобы просто использовать число 13 в нашей функции, мы можем использовать нечто, называемое константой.
Как и функции, Arduino также имеет несколько предопределенных констант.
Константа – это предопределенное выражение. Просто взгляните на справочный сайт по константам(сайт открывается через Wayback Machine, т.к. оригинальную ссылку удалили), предоставленный Arduino. Вы увидите некоторые константы, такие как уровни выводов (HIGH и LOW) и режимы выводов (INPUT, OUTPUT и INPUT_PULLUP). Но если вы прокрутите страницу вниз немного дальше, то найдете константу под названием LED_BUILTIN.
Эта константа всегда ссылается на пин, к которому подключен встроенный светодиод. На большинстве плат Arduino он подключен к выводу # 13. Поэтому вместо того, чтобы просто использовать 13 в функции pinMode(), мы можем использовать LED_BUILTIN:
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
}
Таким образом, наш код становится немного более универсальным. Теперь вы можете использовать этот код на любой плате Arduino, а не только на Arduino Uno.
Arduino Loop Function
Следующим шагом будет рассмотрение функции loop(). Поскольку теперь, когда мы установили нужный нам пин, пришло время что-то сделать с этим пином.
После выполнения функции setup() Arduino перейдет к функции loop() и выполнит ее. Но эта функция немного отличается от функции setup(). Функция loop(), как видно из названия, будет выполняться снова и снова. Как в бесконечном цикле.
Цикл – это то место, где происходит настоящее веселье. Именно здесь вы будете писать поведение программы.
Поскольку мы уже определили вывод № 13 (LED_BUILTIN) как выход, давайте начнем с включения этого вывода. Это включит встроенный светодиод на плате Arduino. Потому что мы будем устанавливать состояние выхода на HIGH. Как уже говорилось, состояние HIGH установит уровень напряжения на выводе в 5 В.
Установка выхода с помощью функции digitalWrite()
Как изменить состояние выхода?
Опять же, в Arduino для этого есть предопределенная функция. Как и функция pinMode(), эта функция также принимает параметры. Вот как выглядит синтаксис в официальной справке от Arduino:
digitalWrite(pin, value)
Функция также принимает два параметра: pin и value.
pin: Номер вывода, на который вы хотите записать данные.
значение: Значение, которое вы хотите присвоить этому пину.
Мы будем использовать значения HIGH и LOW. Это предопределенные константы, которые будут задавать уровень напряжения на пине.
Поскольку мы хотим включить светодиод, мы должны использовать HIGH. Потому что, когда мы подадим напряжение 5 вольт, светодиод включится. Функция, которую мы должны написать в цикле, будет выглядеть следующим образом:
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
}
Обратите внимание, что я использую константу LED_BUILTIN, а не просто число 13. Вы можете использовать эту константу каждый раз, когда захотите работать с этим выводом. Это сделает ваш код намного проще для чтения и понимания. Вы всегда будете видеть, что это вывод, к которому подключен встроенный светодиод.
Вы также можете увидеть, что я добавил комментарий после строки кода. Это также сделано для того, чтобы облегчить чтение и понимание кода. Особенно когда вы учитесь, очень важно комментировать свой код.
Теперь пришло время вставить этот код в Arduino и запустить его!
Компиляция и загрузка кода для проверки
Я уже показывал вам, как загрузить скетч (программу) на плату Arduino. Но есть одна вещь, которую всегда нужно делать перед загрузкой. Это проверка вашего кода. Мы написали несколько строк кода и хотим убедиться, что они работают. Потому что все может пойти не так, если вы загрузите на плату Arduino код с ошибками.
Проверка кода Arduino
Когда весь приведенный выше код находится в редакторе, перейдите в Sketch -> Verify/Compile или нажмите Ctrl+R.
Это не загрузит код в Arduino. Он проверит ваш код. Проверьте код на наличие ошибок и убедитесь, что он будет работать на вашей плате.
Если в коде нет ошибок, проверка будет выглядеть следующим образом:
Отличная работа! Вы написали код Arduino, который работает!
Но что произойдет, если в коде Arduino будут ошибки?
Для наглядности давайте специально сделаем синтаксическую ошибку. После каждого выражения ставится точка с запятой, чтобы закончить выражение. Таким образом, компилятор узнает, когда выражение заканчивается и начинается новое. Забыть поставить точку с запятой – одна из самых распространенных ошибок программирования. Даже для опытных программистов. Давайте сделаем эту ошибку и посмотрим, что произойдет.
Измените строку 4 следующим образом:
pinMode(LED_BUILTIN, OUTPUT);
к этому:
pinMode(LED_BUILTIN, OUTPUT)
Теперь перейдите в Sketch -> Verify/Compile или нажмите Crtl+R.
Теперь проверка будет выглядеть немного иначе:
Вы увидите, что строка состояния стала оранжевой. В то же время в строке состояния отображается сообщение об ошибке, а одна строка становится красной. Это очень полезно, так как вы увидите, в чем заключается ошибка и где она находится.
Сообщение об ошибке следующее:
ожидается ‘;’ перед маркером ‘}’.
Это сообщение означает, что компилятор должен увидеть точку с запятой перед скобкой.
Строка 4 – это выражение. Но без точки с запятой выражение никогда не закончится. Компилятор просто продолжит читать код, ожидая, что выражение продолжится или закончится. Когда компилятор встречает знак скобки, он приходит в замешательство. Потому что скобка завершит функцию установки раньше, чем закончится выражение.
Чтобы исправить это, просто верните точку с запятой в строку 4.
Загрузка эскиза в Arduino
Теперь, когда у вас есть код без ошибок, пришло время загрузить его на плату Arduino.
Как было описано ранее, это делается в меню Sketch -> Upload или просто нажатием Ctrl+U.
Если вы получите сообщение: “Done uploading.”, вы успешно скомпилировали и загрузили свой скетч на плату Arduino.
Те из вас, кто обладает хорошим глазомером, могли заметить кое-что перед загрузкой. Перед загрузкой Arduino IDE скомпилирует ваш скетч. Компиляция означает, что ваш код будет переведен в код, который сможет понять Arduino (микроконтроллер AVR). Микроконтроллер не такой умный, как мы. Фактически, единственное, что он может понять, – это 0 и 1. При компиляции весь ваш код будет переведен в 0 и 1.
Теперь, когда код находится в Arduino, посмотрите на плату.
Вы должны увидеть, что светодиод на плате (рядом с выводом 13) под названием L1 теперь горит. Это потому, что мы изменили состояние вывода на HIGH. Теперь напряжение на выводе 13 составляет 5 вольт.
В качестве небольшого эксперимента мы изменим код. Вместо того чтобы установить состояние пина на HIGH, мы установим его на LOW. Это должно установить уровень напряжения на 0 вольт (земля) и выключить светодиод.
Код должен выглядеть следующим образом:
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED_BUILTIN, LOW); // turn the LED off (LOW is the voltage level)
}
Внимательно посмотрите на плату Arduino во время загрузки этого кода.
Вы увидите, что два других светодиода начинают мигать. Они называются “TX” и “RX”. Эти два светодиода являются индикаторами связи. Каждый раз, когда они мигают, происходит обмен данными с платой Arduino Uno. Связь происходит, когда вы загружаете скетч на плату.
Как только процесс загрузки завершится, светодиоды погаснут. Встроенный светодиод также выключится благодаря нашему новому коду.
Работа с циклами – Loop()
Давайте немного углубимся в эту функцию loop(). Опять же, этот цикл запускается снова и снова. Мы можем использовать это, чтобы сделать нашу программу немного веселее.
Сейчас у нас есть только одна строка кода в функции loop(). Эта строка кода будет выполняться снова и снова. Контакт № 13 будет устанавливаться в одно и то же состояние снова и снова. В результате светодиод всегда будет либо включен, либо выключен.
А что, если мы напишем в цикле две строки кода? Одну, которая включает светодиод, и другую, которая его выключает. Теоретически это должно заставить светодиод мигать.
Вот как теперь будет выглядеть наш код:
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(LED_BUILTIN, LOW); // turn the LED off (LOW is the voltage level)
}
Теперь цикл будет выполнять эти две строки кода снова и снова. Сначала включение, затем выключение светодиода, затем включение, затем выключение…
Попробуйте загрузить код и посмотреть, что произойдет на плате Arduino. Произойдет то, чего вы, возможно, не ожидали. Светодиод не включается и не выключается, а светит неярко.
Это потому, что Arduino работает быстро. Очень быстро. Быстрее, чем человеческий глаз. На самом деле, светодиод действительно мигает. Он мигает так быстро, что вы не увидите ни включенного, ни выключенного светодиода. Вы увидите среднее значение. Поскольку светодиод включен 50% времени и выключен 50% времени, вы увидите, что светодиод светит с интенсивностью 50%.
Замедляйте код с помощью функции Delay()
Теперь мы хотим немного замедлить код. Замедлить его так, чтобы мы могли видеть мигание светодиода.
Это делается с помощью задержек. Так, после включения светодиода мы хотим немного подождать. И то же самое после его выключения. Таким образом, у нас будет достаточно времени, чтобы увидеть мигание светодиода.
Здесь нам снова повезло, что мы используем платформу Arduino. Потому что в Arduino есть предопределенная функция для введения задержек в нашу программу. Эта функция называется просто delay() и принимает один параметр. Вот как выглядит синтаксис в справочнике Arduino:
delay(ms)
Параметр в этой функции – ms. Здесь указывается время, на которое вы хотите установить задержку. Задержка задается в миллисекундах. В одной секунде 1000 миллисекунд (мс).
Давайте вставим эти задержки в наш код. Полсекунды должно быть достаточно, чтобы увидеть мигание светодиода. Поэтому в функциях задержки в качестве параметра мы будем ставить 500 мс:
void setup() {
// put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // Wait 500 milliseconds
digitalWrite(LED_BUILTIN, LOW); // turn the LED off (LOW is the voltage level)
delay(500);
}
Обратите внимание, что я поместил функцию delay() как после включения, так и после выключения светодиода. Таким образом, светодиод будет гореть в течение 500 мс, а затем выключаться в течение 500 мс.
Попробуйте загрузить этот код и посмотреть, как теперь будет вести себя светодиод.
Теперь у вас есть мигающий светодиод!
И светодиод продолжает мигать, поскольку цикл выполняется снова и снова.