Arduino первая программа
Дата: 6 Марта 2015. Автор: Алексей
Итак, на чем мы остановились. В прошлой статье мы с вами прошлись по азам установки и наладки программного обеспечения для работы с платами Arduino. Так же их собственноручно установили и настроили. Теперь давайте попробуем написать первую программу. Для этого запустите программу arduino. Для того чтобы постоянно не лазить в папку с программой, я рекомендую вынести ярлык на рабочий стол. И так, программа запущена. Далее в окне редактора сотрите все что там написано. Должно получится так:
Теперь давайте немного поговорим о теории. Сколько я языков программирования не видел, но во всех языках обязательно присутствует такая штука как переменная. Что такое переменная? Любой компьютер, а микроконтроллер это практически компьютер, имеет в своем распоряжении оперативную память. Данная память предназначена для запоминания текущих данных. Оперативная она называется из-за того что она зависит от наличия питания компьютера. То есть данные в ней могут хрониться лишь пока есть питание. Во время работы компьютера, процессор оперирует данными, постоянно их кладет в память, а потом забирает и снова кладет и так далее. Но вот вопрос, а откуда процессор узнает, где именно лежат те данные которые ему нужно обработать? А узнает он по адресу ячейки памяти. То есть наткнувшись на команду сложения двух чисел, он спрашивает: "А где мол лежат данные?" А ему говорят: "В ячейке 0x56FE и 0xD34A". Он: "Понял". Вроде все ясно. Программист написал в программе что данные лежат по этим адресам, если код написан на ассемблере, и все встает на свои места. Но нам-то такое счастье-то не надо. Нам не пристало ковырятся в дедовском коде. Вот для нас и придумали такое понятие как переменная. То есть например переменная с именем val говорит нам о том что мы выделяли ячейку памяти по какому-то адресу в памяти под именем val. Мудрено, да. А сделано это еще не только для нашего удобства. Если код писать на ассемблере, то тут с адресами собственно проблем возникнуть не должно. Это связано с тем, что ассемблер это практически машинный код, но интерпретирован человегопонятными мнемониками. И когда компилятор создает файл для загрузки, он просто берет адрес ячейки и кладет в него данные. А когда код пишется на языках высокго уровня, то тут возникают некоторые проблемы. Представим что мы написали код и в нем написали переменную. Программа компилятор при подготовке файла для загрузки возьмет имя нашей переменной и даст ей наиболее оптимальный адрес в памяти. И нам не нужно теперь забивать голову адресами. Мы просто знаем что есть некая переменная с конкретным именем, а вот где она болтается в памяти нам уже все равно. Но имя переменной это только пол дела. Далее нам нужно объяснить программе компилятору, что за данные мы храним в этой переменной и какой длинны. Это нужно для того, чтобы компилятор выделил в памяти места ровно столько сколько нам нужно и не больше и не меньше. За это отвечает тип переменной. Я приведу несколько типов, которые считаются самые необходимые и часто использующие. Если вам захочется узнать все типы, то можно зайти на сайт учебника arduino и там изучить все варианты.(Правда на английском). И так, типы переменных.
boolean | Переменная с таким типом является логической. Она может принимать всего два значения, либо true(истина), либо false(лож) |
char | Переменная с таким типом является знаковой и длинной в один байт. Может принимать значение от -127 до +127, либо принимать значение символа из таблицы ASCII. Например символ '1' примет значение 48. Более подробное описание символов мы затронем когда будем работать со строками. |
unsigned char | То же самое что и char за одним исключением. Слово unsigned говорит о том, что значение данной переменной может принимать только в положительном диапазоне. То есть от 0 до 255 и никаких отрицательных. |
int | Переменные с таким типом являются знаковыми, но в отличии от char имеют длину в два байта. Значения, которые можно хранить в данной переменной, лежат в диапазоне от -32768 до +32767. |
unsigned int | Этот тип переменной указывает тоже на двубайтовое значение, но как и unsigned char имеет строго положительное значение и лежит в диапазоне от 0 до 65535. |
byte | Данный тип переменной похож на unsigned char и принимает значения в пределах от 0 до 255. |
float | Данный тип переменной дает возможность храить значения с плавающей точкой. Под эту переменную будет выделено 4 байта. Диапазон значений может лежать в пределах от -3.4028235E+38 до 3.4028235E+38. |
Вот мы и разобрались с типами переменных. Далее давайте взглянем на имена самих переменных. Имена можно задавать разнообразными способами. Например R84Hhj7I тоже может быть именем переменной. Но заметьте, такое название просто ужас. Поэтому рекомендую задавать человекопонятные имена, например LEDdiod. Сразу понятно, что в данной переменной лежит значения состояния светодиода, либо ноль, либо единица. Но есть одно ограничение, нельзя начинать имя переменной с цифры. 5LEDdiod будет являться ошибкой. Это правило тянется из языка С, я не пробовал проверять на arduino, но надеюсь что оно и здесь работает. Так же необходимо запомнить что имя LED и led это не одно и тоже. Регистр тоже учитывается.
Так, с именами разобрались. Давайте, опираясь на полученные знания, попробуем написать первую программу. Что она будет делать? А ничего, просто микать светодиодом установленным на плате. На чистом поле текстового редактора пишем следующий код.
Что мы собственно здесь написали. А написали мы следующее, сначала мы объявили функцию setup(), а за ней функцию loop(). Объяснять что такое функция, пока очень рановато, поэтому просто копируем написанное, но на одном моменте я все же подробно остановлюсь. Дело в том что язык программирования для arduino это не С. И даже я больше скажу, что его даже нельзя назвать языком. Больше подходит конфигуратор-разработчик. Сейчас сами все поймете. Дело в том, что для программирования микроконтроллера необходима знание его архитектуры и умение обращаться с регистрами разной периферии, а в arduino это не нужно. Для работы той или иной периферии вам нужно лишь вызвать ту или иную функцию и передать по надобности какие-либо параметры, а уже в зависимости от периферии функция может вернуть какое-то значение. То есть если бы был графический интерфейс, то все программирование свелось бы к выбору разных галочек и подпунктов меню. Отсюда на первых парах вам нужно просто запомнить, что любая программа для arduino должна начинаться именно с объявления этих двух функций. А теперь давайте разберемся для чего эти функции нужны. Первая с названием setup() нужна для начальной конфигурации программы. Данная функция вызывается один раз при первом старте программы и на протяжении всего периода работы основной программы больше не вызывается. Зачем так сделано? Дело в том что чаще всего при первом старте программы, необходимо проинициализировать периферию. Если это делать в основном цикле, то процессор будет выполнять не нужную работу. Поэтому нужно пока запомнить, что код написанный в теле функции setup() выполнится один раз. А вот основная программа, которая будет выполнятся на протяжении всей работы микроконтроллера, записывается в тело функции loop(). Давайте подведем итоги. Для начальной настройки и выполнении разово некого кода заполняем тело функции setup(). Для работы основной программы заполняем тело функции loop(). От слов к делу. Для того чтобы помигать светодиодом, нам необходимо посмотреть где он подключен. На плате arduino UNO что у меня, он подключен к 13 ножке выводов DIGITAL. А теперь смотрите. Сначала в функции setup() мы настроим ножку, а затем в функции loop() будем включат и выключать светодиод. Как это делать. Цифровая ножка микроконтроллера может выполнять всего два действия, либо выводить значение 1 или 0, либо читать значение переданное на ножку тоже 1 или 0. В данный момент, так как нам нужно зажигать светодиод, то вывод должен быть настроен как выход. Пишем в теле функции setup
Что собственно делает эта строчка. Задача функции pinMode() является настройка пина на вход или на выход. Для того чтобы данная функция поняла что ей делать, она принимает два аргумента. Первый аргумент отвечает за номер пина. В нашем случае это 13, а второй аргумент
Что эти строчки делают. Первая digitalWrite(13, HIGH); это функция которая выводит в пин некое значение. Для того чтобы она понимала какое значение и куда ей выводить мы снова передаем два аргумента. Первый это номер пина, а второй HIGH то есть 1. Как только эта функция отработает, на ножке 13 появится логическая единица
Если программа не сохранена, то перед загрузкой вам будет предложено ее сохранить. С учетом того что это первая пробная программа, то ее можно не сохранять и отказаться. Если все же захочется оставить на память, то сохраняйте в любом удобном для вас месте. После сохранения или отказа, программа загрузится в arduino и вы увидите как замигает светодиод. Ниже я для наглядности прикрепил видео работы программы.
Читать предыдущий урок Читать следущий урок
JW Player goes here
Вадим 07.03.15 22:34
А как правильно записать если у нас
несколько пинов настроено на выход,
пробовал через запятую pinMode(1,2,3
OUTPUT) ардуино ругается.
Алексей 07.03.15 23:52
Правильно что ругается. Функция pinMode()
принимает всего два аргумента, а вы ей
четыре пихаете. Выход из положения
проинициализировать в цикле.
Вадим 08.03.15 00:20
Покажите пример.
Алексей 08.03.15 08:16
Урок с циклами будет чуть позже. Нужно все
разбирать по порядку, а то в голове каша
будет.