Загрузка программы-примера “Мигающий огонь”

Ну вот, Вы теперь готовы к загрузке первой программы Arduino в своего робота.

Выберите в IDE File -> Examples -> Basic -> Blink.

 

Загрузка программы-примера на Arduino

В окне IDE Вы увидите следующий текст.

/*
Blink


Turns on an LED on for one second, then off for one second, repeatedly.

Most Arduinos have an on-board LED you can control. On the Uno and pin the on-board LED is connected to on your Arduino model, check Leonardo, it is attached to digital pin 13. If you're unsure what the documentation at http://arduino.cc

This example code is in the public domain.

modified 8 May 2014
by Scott Fitzgerald
*/

// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin 13 as an output.
pinMode(13, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000);            // wait for a second
digitalWrite(13, LOW);  // turn the LED off by making the voltage LOW
delay(1000);            // wait for a second
}

Текст программы, написанный выше, был создан программистом по имени Scott Fitzgerald 8 Мая 2014 года. Об этом в тексте есть специальное указание.

Программа включена в распространяемый бесплатно Arduino IDE. Полный текст условий использования и распространения Arduino IDE и включённых в него программ можно прочесть на страничке – https://www.arduino.cc/en/Main/Software в разделе Terms of Use.

Программа распространяется бесплатно “как есть” без каких-либо гарантий. Вся ответственность за возможные последствия её применения возлагаются на пользователя.

Для большинства программ Arduino это обычная практика.  В конце мы разместили текст лицензии на программы авторов, используемые в этом курсе. Лицензия – это и есть условия использования.

Что и как там написано, разберёмся чуть позже, а сейчас нажмём кнопку Verify вверху слева с галочкой. Внизу окна IDE появится надпись Compiling sketch и постепенно заполняющаяся полоска. Через некоторое время мы увидим надпись об окончании компиляции Done compiling и о количестве байтов, которое занимает эта программа в памяти микроконтроллера.

Загрузка программы-примера на Arduino

В данном случае мы взяли давно отлаженную программу, встроенную в IDE, поэтому компилятор не нашёл ошибок и сразу выдал нам сообщение об успешной компиляции.

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

Подробно об ошибках мы поговорим чуть позднее, а сейчас просто отметим, что синтаксические ошибки – это ошибки в правилах написания программы (то же самое, что ошибки, которые находит учитель русского языка в Ваших сочинениях). Их найти очень легко, так как их ищет компилятор.

А вот ошибки логические – это ошибки, которые возникают при недостаточно отработанном алгоритме и исходном тексте Вашей программы. Это ошибки можно обнаружить только вдумчивым анализом того, что Вы написали. А избежать их – тщательной проработкой постановки задачи, алгоритма и исходного текста.

Вообще-то в Arduino-мире программу называют скетчем (от английского sketch – набросок).  Но давайте по-взрослому называть это “Исходный код” или “Исходный текст”. А то, что получается в результате компиляции и загружается в микроконтроллер – “Исполняемый код”. Часто профессионалы говорят: “Программа”, подразумевая либо исходный, либо исполняемый код в зависимости от контекста.

Наш исходный код или программа называется “Мигающий огонь”, и пока он ещё не загружен в нашего робота. Для загрузки надо нажать кнопку Upload (рядом справа от кнопки Validate).  

После этого произойдёт компиляция исходного текста, то есть превращение его в исполняемый. А затем загрузка исполняемого кода в микроконтроллер.

При успешной работе загрузчика внизу окна IDE появляются две надписи – сначала Done compiling, затем Done uploading, что говорит об успешной компиляции и затем загрузке.

Если подключения Arduino к компьютеру нет, то, вместо сообщения об успешной загрузке появится сообщение типа Upload canceled или Serial port COMnot found. Это означает, что надо закрыть все активные окна Arduino IDE, выдернуть шнур USB кабеля и опять подключить его. После этого запустить Arduino IDE снова.

Если всё нормально, то сразу после загрузки программы Blink исполняемый код начнёт работать и особый светодиод на платах Arduino UNO и TroykaShield начнёт мигать с периодом 2 секунды – одна секунда горит, одна – нет.

Теперь Вы умеете запускать среду разработки, подключать робота к ней, компилировать готовый исходный текст и загружать в микроконтроллер Ваш (ну пока ещё не Ваш) исходный код и запускать его в работу.

Кстати, программа Blink (Мигающий огонь) в будущем нам может помочь определить исправность платы Arduino UNO и её связи с компьютером. Когда надо определить, что не работает – Ваша программа или плата, надо просто откомпилировать и загрузить программу “Мигающий огонь”. Если светодиод начнёт мигать, плата Arduino UNO исправна и связь с компьютером есть.

Структура программ – setup () { } и loop () { }

Программа “Мигающий огонь” не получает данные от датчиков и не управляет исполнительными устройствами робота. Она нужна нам только для того, чтобы понять некоторые основные правила написания исходного текста программ нашего Arduino-робота.

Этим мы сейчас и займёмся. Итак, исходный код или текст:

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

void loop()
{
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
 delay(1000);
}

Обратите внимание, текст, который мы получили из IDE File -> Examples -> Basic -> Blink, здесь сильно урезан. То, что осталось, и есть та информация, которую компилятор берёт из исходного кода и превращает в исполняемый.  Остальное – информация для человека, чтобы он мог быстро вспомнить, что это за программа и как она работает.

Исходный текст состоит из двух кусков – void setup()  и void loop().

И у каждого есть пара фигурных скобок, между которыми что-то написано. Для начала запомним, что void setup() – это кусок, который исполняется один раз при запуске программы или после нажатия кнопки Reset на плате Arduino UNO или TroykaShield. Кусок void loop()  исполняется бесконечное число раз. Пока не выключится питание, или Вы не нажмёте кнопку Reset.

То есть

  • setup() обеспечивает первоначальную настройку робота и выполнение той части основной программы, которая необходима нам один раз при включении питания или нажатии кнопки Reset.
  • loop() обеспечивает выполнение основной части нашей программы.

Иногда говорят: “Основного цикла”

Собственно setup по-русски это УСТАНОВКА, а loop – ПЕТЛЯ или ЦИКЛ.

Мы сказали – КУСОК, но более грамотно говорить – ФУНКЦИЯ.

Так что продолжим обсуждение функций SETUP и LOOP.

Фигурные скобки { }

Они ограничивают текст, который определяет, что робот делает, исполняя соответствующую функцию. То есть сначала идёт заголовок функции void setup() или void loop(), а затем фигурные скобки, между которыми расположены операторы программы.

Заголовок состоит из двух частей: тип – в данном случае void и имя setup() или loop(). Круглые скобки тоже имеют значение, но об этом чуть позже.

Новое понятие – оператор программы. Это слово или несколько слов, которые имеют смысл какого-либо действия. Если вы знаете английский язык, то смысл действия можно понять или догадаться. Если английский язык для Вас пока вызывает затруднения, то очень советую чаще обращаться словарю и к “Arduino блокноту программиста”, который здесь уже упоминался и который можно скачать из интернета.

Вообще-то “Arduino блокнот программиста” очень полезен каждому, кто занимается Arduino.

В дальнейшем необходимо постоянно изучать этот блокнот и раздел сайта Arduino.cc -> Tutorials -> Reference. Там очень много операторов языка, стандартных функций и готовых библиотек, которыми можно пользоваться.

В исходном тексте программы “Мигающий огонь” используются четыре оператора и одна функция. Их мы сейчас и разберём поподробнее.

Но сначала заметим, что каждый оператор или функция, при их вызове в программе, записываются с новой строки и заканчиваются точкой с запятой. Это очень важно и за этим надо постоянно следить, когда Вы пишете свою программу.

Оператор pinMode

Это команда микропроцессору настроить порт.

В нашем случае написано pinMode(13, OUTPUT);

Это значит, контакт платы Arduino UNO номер 13 настраивается работать как цифровой ВЫХОД.

То есть в дальнейшем микроконтроллер может выводить на этот контакт либо логическую единицу (в терминах языка C/C++ – HIGH), либо логический ноль – LOW.

Если написать, например pinMode(10, INPUT); , то это будет команда настроить контакт номер 10 на ВВОД.

Заметим, что оператор записан внутри функции void setup() (между её фигурными скобками), а значит, выполняется только один раз.

Оператор digitalWrite

Это команда микроконтроллеру записать на выход логический ноль или единицу. В нашем случае:

  • Либо digitalWrite(13, HIGH); – выводим логическую единицу на контакт 13
  • Либо digitalWrite(13, LOW); – выводим логический ноль на контакт 13

Платы Arduino UNO и TroykaShield построены так, что при выводе на контакт 13 логической единицы специальный светодиод на плате горит, а при выводе нуля – гаснет.

То есть выполнение первой команды зажигает светодиод, а выполнение второй – гасит.

Функция delay

Это уже не оператор, а функция, которая в своей работе использует несколько скрытых в ней операторов. Эта функция ничего не делает, она просто ждёт, когда пройдёт определённое время.

В нашем случае delay(1000);

1000 – это количество миллисекунд, пока в нашей программе ничего не происходит. На самом деле микропроцессор всё это время сильно занят. Он загружает специальный счётчик числом из круглых скобок, каждую тысячную долю секунды вычитает из него единицу, сравнивает полученное число с нулём и, если счётчик обнулился, то прекращает выполнение функции и переходит к следующему оператору.

Таким образом, наша программа ничего не делает в течение 1000 миллисекунд (то есть выполняется задержка в одну секунду). Кстати Delay по-русски означает Задержка.

То есть микропроцессор всё это время работает, но для программы ничего не происходит.

Просто ждём. Зачем? – в данном случае для того, чтобы дать возможность светодиоду либо гореть, либо не гореть в течение одной секунды.

Как Вы заметили функция delay(1000); требует, чтобы при её вызове ей сообщили на какое количество миллисекунд необходимо задержать выполнение программы. То есть в круглых скобках записывается ВХОДНОЙ ПАРАМЕТР.

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