Arduino первая программа
   
				

Arduino первая программа

	
	
	

Дата: 6 Марта 2015. Автор: Алексей

	
	
Итак, на чем мы остановились. В прошлой статье мы с вами прошлись по азам установки и наладки программного обеспечения для работы с платами Arduino. Так же их собственноручно установили и настроили. Теперь давайте попробуем написать первую программу. Для этого запустите программу 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 (тело любой функции обременяется фигурными скобками) следующую строку.
Инициализация пина 13

Что собственно делает эта строчка. Задача функции pinMode() является настройка пина на вход или на выход. Для того чтобы данная функция поняла что ей делать, она принимает два аргумента. Первый аргумент отвечает за номер пина. В нашем случае это 13, а второй аргумент (все аргументы передаваемые функциям пишутся через запятую) это направление. В нашем случае это выход OUTPUT. в конце функции как можно заметить стоит точка с запятой. Данная точка с запятой говорит о том что текущая коменда закончилась. Следует запомнить как таблицу умножения, что каждая команда ОБЯЗТЕЛЬНО должна заканчиваться точкой с запятой. Вот таким образом мы настроили вывод. Теперь переходим к телу функции loop() и напишем четыре строки.

Основное тело программы

Что эти строчки делают. Первая digitalWrite(13, HIGH); это функция которая выводит в пин некое значение. Для того чтобы она понимала какое значение и куда ей выводить мы снова передаем два аргумента. Первый это номер пина, а второй HIGH то есть 1. Как только эта функция отработает, на ножке 13 появится логическая единица (логическая единица всегда равна напряжению питания МК. Чаще всего это 5 вольт или 3,3 вольта). Следующая строка delay(1000); это пауза. Данной функции в качестве аргумента передается значение времени в миллисекундах. В нашем случае это 1000 мс или 1 секунда. Теперь смотрите что происходит. Сначала функция digitalWrite(13, HIGH); выводит на ножку логическую единицу. Затем функция delay(1000); останавливает работу программы на 1 секунду (она не останавливает в прямом смысле, а просто заставляет процессор таптаться на одном месте ничего не делая 1 секунду), а затем выполняется функция digitalWrite(13, LOW);. Как не трудно догадаться она выводит на ножку логический ноль. А затем снова останавливается на 1 секунду. Так как функция loop() является циклической, то после паузы программа возвращается к началу тела функции loop() и все начинается с начала. Вот и все, наша первая программа написана. Давайте ее загрузим в нашу arduino. Для этого нажмите на кнопку "Вгрузить".

Загрузка программы

Если программа не сохранена, то перед загрузкой вам будет предложено ее сохранить. С учетом того что это первая пробная программа, то ее можно не сохранять и отказаться. Если все же захочется оставить на память, то сохраняйте в любом удобном для вас месте. После сохранения или отказа, программа загрузится в 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

Урок с циклами будет чуть позже. Нужно все разбирать по порядку, а то в голове каша будет.




Чтобы вставить ссылку используйте форму вида[url]http://www.адрес.ru[/url][text]текст ссылки[/text]
Чтобы вставить код используйте форму вида[code]код[/code]

Имя:   





  








Вверх


Рейтинг@Mail.ru Яндекс.Метрика