Четверг, 24.08.2017, 09:48
RC - Мастерская
Главная | Каталог статей | Регистрация | Вход
Меню
Статистика
Главная » Статьи » Обмен опытом » Arduino для школьников

2. Основы языка Arduino
Основы языка Arduino


В предыдущей статье мы создали первую простейшую программу для Arduino и научились загружать ее в микроконтроллер. Теперь я предлагаю разобраться что означают все эти непонятные слова и фигурные скобки.

Начать надо с того, что в основе языка Arduino лежит более древний язык Си. Вообще, если быть точным, то Arduino является потомком языка Processing. Но это не так важно. Не будем разбираться в родственных и наследственных связях языков. Просто примите на веру, что в основе этой цепочки находится Си. А потому тут будут действовать практически все правила, которые существуют в Си. Ну и добавятся некоторые специфические....

Вернемся к нашей программе:

Код
int led = 13;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                  // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                  // wait for a second
}


Любая программа на языке Си состоит из функций. Под функцией понимается блок команд, который выполняет некоторые действия, принимает на вход некоторые параметры и возвращает единственное значение. В нашей программе таких функций две: setup и loop. Перед именем функции всегда указывается тип возвращаемого ею значения. Сразу за именем в круглых скобках указывается набор входных параметров. В нашем случае параметров нет, поэтому в скобках пусто. Но скобки должны быть всегда. Код, составляющий исполняемую часть функции, всегда размещается в фигурных скобках. Эти скобки еще называются "операторными", а сами исполняемые команды - операторами. Надо отметить, что переход к новой строке не воспринимается языком Си как конец оператора. Для этого служит символ ";". Таким образом всю программу можно написать хоть в одну строку. Но для облегчения читаемости есть несколько простых правил:

 

  1. На одной строке размещается один оператор
  2. Код внутри операторных скобок имеет смещение вправо на пару пробелов

 

Таким образом общий вид функции на языке Си будет выглядеть так:

<тип возвращаемого значения> <уникальное имя функции>([<список входных параметров>])

{

  <тело функции>

}

Если функция не возвращает никакого значения, то вместо <типа возвращаемого значения> указывается ключевое слово void - бестиповый. Имя функции служит для того, чтобы мы могли к ней обратиться из любой точки кода. Если имена были бы не уникальны, то микроконтроллер просто бы нас не понял - какой код мы хотим выполнить. Список входных параметров - это перечисление через запятую имен переменных с указанием их типа данных. Тело функции, как уже говорилось выше, представляет собой набор исполняемых операторов.

 

Вернемся к нашей программе и Arduino.

В программе Arduino обязательно необходимо определить две функции: setup() - функция выполняется один раз при включении микроконтроллера. В ней обычно содержится код, выполняющий первоначальную настройку. loop() - эту функцию микроконтроллер выполняет циклически все время, пока он работает.

В нашем случае для того чтобы включать и выключать светодиод мы должны на соответствующий выход микроконтроллера подавать попеременно высокое и низкое напряжение. Но прежде чем это делать, надо указать микроконтроллеру, что используемый нами контакт будет являться выходом. Для этого в языке Arduino существует функция pinMode(). На вход она принимает два значения:

1. int pin - целое число, указывающее на номер контакта

2. const Mode - константа, указывающая на режим работы контакта. Для этого параметра определены два значения: INPUT - вход; OUTPUT - выход.

Эта функция должна выполняться всего один раз при старте программы. Поэтому вызов pinMode(led, OUTPUT); мы поместили в тело функции setup(). Здесь led - переменная, принимающая целочисленные значения (int). Мы ее объявили в самом начале нашей программы и сразу присвоили ей значение нужного нам контакта - 13.

Далее, чтобы обеспечить мигание светодиода, нам необходимо циклически переключать напряжение на этом контакте с низкого уровня на высокий и обратно. Делающий это код разумно поместить в функцию loop(). Поскольку она выполняется микроконтроллером циклически, нам необходимо описать всего один проход (итерацию) этого цикла. Для установки уровня сигнала на выходе мы использовали функцию digitalWrite(). Она так же принимает на вход два значения - номер контакта и константу, указывающую на уровень сигнала( LOW - низкий; HIGH - высокий). Таким образом digitalWrite(led, HIGH) включает светодиод, а digitalWrite(led, LOW) - выключает его. Мы так же использовали функцию delay(). Зачем? Все дело в том, что наш микроконтроллер работает на частоте 16 мегагерц. Т.е. он выполняет 16 миллионов действий в секунду. Несколько утрируя примем, что функция digitalWrite() содержит до 10 действий. Поскольку вызываем мы ее дважды за итерацию примем, что одна итерация нашего цикла будет 20 действий. Далее несложно посчитать, что светодиод будет включаться и выключаться примерно 80000 раз в секунду. Человеческий глаз не в состоянии заметить столь быстрые действия и нам будет казаться, что он просто тускло горит. Функция delay() как раз существует для того, чтобы приостановить дальнейшее выполнение программы на заданное время. Причем это время передается ей в виде единственного параметра и указывается в милисекундах. И в нашей программе мы указываем, что после каждого изменения состояния выхода микроконтроллера мы на секунду приостанавливаем дальнейшее выполнение программы.

 

Вот так еще толком ничего не зная о электричестве, электронике и программировании мы смогли уже управлять светом! Конечно, дальше нам предстоит разобраться детальнее в электрических цепях и изучить язык Си. Продолжение следует!

Категория: Arduino для школьников | Добавил: Mactep (05.12.2013)
Просмотров: 1377 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск