Тема 6. Основні принципи програмування Arduino

 

Програмування проводиться за допомогою програмної оболонки (IDE), безкоштовно доступної на сайті Ардуіно. У цій оболонці є текстовий редактор, менеджер проектів, препроцесор, компілятор та інструменти для завантаження програми в мікроконтролер. Оболонка написана на Java на основі проекту Processing, працює під Windows, Mac OS X і Linux.

 

Незважаючи на наявність певної подібності з іншими мовами, у Ардуіно є цілий ряд відмінних рис, а саме:

·        нетиповий спосіб додавання бібліотек - вони мають вигляд вихідних текстів на C ++ і додаються з окрему папку робочого каталогу оболонки, при цьому автоматично оновлюється список бібліотек в IDE меню. Розробнику залишається тільки позначити цікавлять бібліотеки, щоб вони потрапили в перелік компіляції;

·        скетчі (програми, зроблені за допомогою Ардуіно програмування) мають формат ino і до компіляції проходять обробку препроцесором;

·        створення обов'язкової функції main() і додавання «чорнових» операцій проводиться автоматично;

·        від програміста потрібно написання мінімум 2 функцій loop () і setup(), перша з яких нескінченно повторюється, а друга активується один раз при старті;

·        ризик виникнення неполадок мінімальний за рахунок того, що оболонка не пропонує ніяких базових параметрів компіляції - це дозволяє навіть чайникам без праці освоювати Ардуіно;

·        мова не потрібна вставки заголовних файлів для стандартних бібліотек, хоча вказувати призначені для користувача бібліотеки все-таки потрібно.

Мова програмування Ардуіно є стандартним C ++ (використовується компілятор AVR-GCC) з деякими особливостями, які полегшують новачкам написання програм.

Найпростіша Ардуіно-програма складається з двох функцій:

Функція setup() запускається один раз, після кожного включення живлення або скидання плати Arduino. У тілі даної функції пишеться код для ініціалізації змінних, установки режиму роботи цифрових портів, і т.д.

Функція loop() в нескінченному циклі послідовно раз по раз виконує команди, які описані в її тілі. Тобто після завершення функції знову відбудеться її виклик.

Наведений нижче код не робить нічого, але його структуру можна використовувати для копіювання і вставки в ваш скетч. Він також навчить вас робити коментарі в коді.

Будь-яка рядок, яка починається з двох косих рис (//) нічого очікувати читатися компілятором, так що ви можете написати після неї все що завгодно. Коментуючи код можна пояснити собі і іншим що ваша програма робить на кожному кроці.

void setup () {

// Помістіть ваш код установок тут, він запуститься один раз

}

void loop () {

// Додайте основний код тут, щоб запустити його на циклічне повторення

}

Нижче наведено список найбільш часто використовуваних функції при програмуванні Arduino:

·        pinMode - встановлює вивід в режим входу або виходу;

·        analogRead - зчитує аналогову напругу на аналоговому вхідному виводі;

·        analogWrite - записує аналогову напруга в аналоговий вихідний вивід;

·        digitalRead - зчитує значення цифрового вхідного виводу;

·        digitalWrite - задає значення цифрового вихідного виводу в високий або низький рівень;

·        Serial.print - пише дані в послідовний порт у вигляді зручного для читання тексту ASCII.

Давайте подивимося, що ж нам може розповісти найпростіша програма «мигати світлодіодом».

int ledPin = 13;

void setup ()

{

pinMode (ledPin, OUTPUT);

}

void loop ()

{

digitalWrite (ledPin, HIGH);

delay (1000);

digitalWrite (ledPin, LOW);

delay (1000);

}

Спочатку згадаємо, що таке світлодіод. По суті це звичайний діод, у якого, завдяки його конструкції, при протіканні струму в прямому напрямку починає світитися перехід. Тобто, щоб світлодіод світився, потрібно щоб через нього протікав струм, а, значить, до світлодіода слід прикласти напругу. А щоб струм не перевищив допустимого значення, послідовно з світлодіодом слід включити резистор, який називають струмообмежувальним. Напруга до светодіода подає мікроконтролер, що становить основу модуля Arduino. У мікроконтролера, крім процесора, що виконує наші команди, є один або кілька портів введення-виведення. Не вдаючись в розгляд конкретного пристрою порту, скажімо так - коли вивід порту працює на вихід, його можна уявити як вихід цифрової мікросхеми з двома станами, включено і вимкнене (є напруга на виході, немає напруги на виході).

Але цей же вивід порту може працювати і як вхід. В цьому випадку його можна уявити, наприклад, як вхід цифровий мікросхеми - на вхід подається логічний рівень, високий або низький.

Як ми мигаємо світлодіодом:

Включити вихідний вивід порту. Вимкнути вивід порту.

Але процесор працює дуже швидко. Ми не встигнемо помітити миготіння. Щоб помітити це миготіння, нам потрібно додати паузи. Тобто:

Включити вихідний вивід порту. Пауза 1 секунда.

Вимкнути вивід порту.

Пауза 1 секунда.

Це наша програма. Процесор прочитає першу команду і включить висновок, світлодіод загориться. Потім процесор зробить паузу в роботі і вимкнути висновок, світлодіод згасне. Але він тільки один раз мигнув.

Повторення будь-якого процесу або набору команд називається в програмуванні циклом. Використовуються різні види циклів. Є цикл, який виконується задане число раз. Це цикл for. Є цикли, які виконуються до тих пір, поки не буде виконана деяка умова, яке є частиною мовної конструкції циклу. А якщо умова не буде виконана ніколи, то цикл виконується нескінченне число разів. Це нескінченний цикл.

Я не думаю, що мікроконтролери використовуються з програмами того виду, який наведено вище. Тобто, один раз виконано кілька команд і більше контролер не працює. Як правило, він працює постійно, як тільки на нього подається напруга живлення. А, значить, мікроконтролер повинен працювати в нескінченному циклі.

Саме про це говорить функція void loop (), loop - це петля, замкнутий цикл. Умови припинення роботи циклу немає, а, отже, немає умови його завершення.

Крім того, ми повинні повідомити модулю Arduino, який висновок порту і як ми хочемо використовувати, для виходу (OUTPUT) або для входу (INPUT). Цій меті служить функція void setup (), яка для мови Arduino є обов'язковою, навіть якщо вона не використовується, і команда pinMode (), для завдання режиму роботи виведення.

void setup ()

{

pinMode (ledPin, OUTPUT);

}

І ще, мовна конструкція використовує змінні для визначення номера виводу:

int ledPin = 13;

Використання змінних зручно. Вирішивши, що ви будете використовувати не висновок 13, а 12, ви внесете зміни тільки в одному рядку. Особливо сильно це позначається у великих програмах. Ім'я змінної можна вибирати на свій розсуд, але, як правило, воно повинно бути тільки символьних, і часто кількість символів обмежується. Якщо ви невірно поставите ім'я змінної, думаю, компілятор вас поправить.

 

Функція digitalWrite (ledPin, HIGH) встановлює заданий висновок в стан з високим рівнем, тобто включає висновок.

А delay (1000), як ви вже зрозуміли, означає паузу в 1000 мілісекунд або 1 секунду.

Залишилося зрозуміти, що означають такі приставки, як int, void. Будь-які значення, будь-які змінні розміщуються в пам'яті, як і команди програми. В осередку пам'яті записуються числа найчастіше з 8 бітів. Це байт. Але байт - це числа від 0 до 255. Для запису великих чисел потрібно два байта або більше, тобто, дві або більше елементів пам'яті. Щоб процесору було ясно, як відшукати число, різні типи чисел мають різні назви. Так число на ім'я byte, займе одну клітинку, int (integer, ціле) більше. Крім того, функції, використовувані в мовах програмування, теж повертають числа. Щоб визначити, який тип числа повинна повернути функція, перед функцією записують цей тип повертається числа. Але деякі функції можуть не повертати числа, такі функції передують записом void (див. Додаток А, змінні).