You are on page 1of 36

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ

КАФЕДРА ТЕЛЕКОМУНІКАЦІЙНИХ СИСТЕМ

В.О. Гнатюк

МЕТОДИЧНІ РЕКОМЕНДАЦІЇ
для виконання лабораторних робіт з дисципліни «Основи
програмування в телекомунікаціях та радіотехніці»

Галузь знань: 17 «Електроніка та телекомунікації»


Спеціальність 172 «Телекомунікації та радіотехніка»
Спеціалізація «Телекомунікаційні системи та мережі»

КИЇВ-2018
УДК 004.3
ББК 32.973.23-018.2
Б78
Рецензенти: Гнатюк Сергій Олександрович, д.т.н., доцент
(Національний авіаційний університет)
Климчук Володимир Павлович, к.т.н., проф.
(Національний авіаційний університет)

Затверджено Науково-методичною радою Навчально-наукового


інституту аеронавігації, електроніки та телекомунікацій Національного
авіаційного університету (протокол № 11 від 23 травня 2018 року).
Рекомендовано Вченою радою Навчально-наукового інституту
аеронавігації, електроніки та телекомунікацій Національного авіаційного
університету (протокол № 4 від 29 травня 2018 року).

Гнатюк В.О. Основи програмування в телекомунікаціях та радіотехніці


[Текст]: методичні рекомендації для виконання лабораторних робіт / В.О.
Гнатюк – К. :НАУ, 2018. – 38 с.

У методичних рекомендаціях представлені лабораторні роботи, в ході


виконання яких студенти здійснюють підключення та програмування
мікроконтролерів Ардуіно, збирають схеми на макетній платі.
Ознайомлюються з синтаксисом Ардуіно. Вивчають класи, функції,
процедури, змінні, типи даних, цикли, логічні оператори, масиви Ардуіно,
процес широтно-імпульсної модуляції, світлодіодну шкалу, кнопкові
перемикачі, семи сегментні індикатори, bluetooth модуль HC-05 та інші
радіодеталі (резистори, мікросхеми, транзистори, конденсатори і багато
іншого), принципи їх функціонування. Кожна лабораторна робота містить в
собі практичне завдання відповідно до тематики.
Видання призначене для студентів вищих навчальних закладів,
докторантів, викладачів та слухачів курсів післядипломної освіти.

© В.О. Гнатюк, 2018


© НАУ

2
ЗМІСТ

4
Вступ
…………………………………………………………………………………………….
. Лабораторна робота №1. Початок роботи з Ардуіно на Windows.

Синтаксис Ардуіно...…………………………….…..………………………………… 5

Лабораторна робота №2. Дослідження роботи світлодіода. Функції та


процедури Ардуіно ……………………………………...……………………………… 10

Лабораторна робота №3. Дослідження процесу широтно-імпульсної


модуляції. Дослідження функції analogWrite …………………………………..... 14

Лабораторна робота №4. Дослідження світлодіодної шкали. Змінні, типи


даних, цикли Ардуіно …………………………………………………………… 18

Лабораторна робота №5. Дослідження кнопкового перемикача. Дослідження


логічних операторів Ардуіно ………………………………………. 22

Лабораторна робота №6. Дослідження семисегментного індикатора.


Дослідження масивів Ардуіно, функції millis та булевих типів даних ……… 26

Лабораторна робота №7. Дослідження bluetooth модулю HC-05, підключення


до Arduino. Управління пристроями з телефону. Дослідження класів і методів
Ардуіно …………………………………………………...…………. 30

Список використаних джерел ……………………………………………..……… 38

3
ВСТУП

Дисципліна «Основи програмування в телекомунікаціях та


радіотехніці» є теоретичною та практичною основою сукупності знань та
вмінь, що формують профіль фахівця в галузі телекомунікацій та радіотехніки.
Метою викладання дисципліни є прищеплення уміння використання сучасних
інформаційних технологій на основі методів обробки інформації; вивчення
мікроконтролерів Ардуіно, радіодеталей та їх програмування; формування у
студента алгоритмічного мислення та розуміння логіки процесів; навичок
розв’язання типових задач обчислювальної математики за допомогою
написання програм мовою C/С++, що є фундаментальною основою для
фахівця в галузі телекомунікацій та радіотехніки.
У методичних рекомендаціях представлені лабораторні роботи, в ході
виконання яких студенти здійснюють підключення та програмування
мікроконтролерів Ардуіно, збирають схеми на макетній платі.
Ознайомлюються з синтаксисом Ардуіно. Вивчають класи, функції,
процедури, змінні, типи даних, цикли, логічні оператори, масиви Ардуіно,
процес широтно-імпульсної модуляції, світлодіодну шкалу, кнопкові
перемикачі, семи сегментні індикатори, bluetooth модуль HC-05 та інші
радіодеталі (резистори, мікросхеми, транзистори, конденсатори і багато
іншого), принципи їх функціонування. Кожна лабораторна робота містить в
собі практичне завдання відповідно до тематики.
Видання призначене для студентів вищих навчальних закладів,
докторантів, викладачів та слухачів курсів післядипломної освіти.

4
Лабораторна робота №1
Тема: «Початок роботи з Ардуіно на Windows. Синтаксис Ардуіно» Мета
роботи: «Підключення Ардуіно до комп’ютера та прошивка першою
програмою. Ознайомлення з синтаксисом Ардуіно».

Початок роботи з Ардуіно на Windows передбачає виконання


наступних кроків:
1. Візьміть Ардуіно і USB-кабель.
2. Скачайте середовище розробки Arduino.
3. Підключіть пристрій.
4. Встановіть драйвери.
5. Запустіть середовище розробки Arduino.
6. Відкрийте код тестової програми.
7. Виберіть в меню свою модель Ардуіно.
8. Виберіть послідовний порт.
9. Прошийте програму.

1. Візьміть Ардуіно і USB-кабель


Дана інструкція розрахована, перш за все, на плати Arduino Uno,
Arduino Duemilanove, Nano, Arduino Mega 2560, або Diecimila. Вам
знадобиться стандартний USB-кабель (з коннекторами типу А і B): такий
кабель зазвичай використовується для підключення принтера. (Для Arduino
Nano потрібен інший кабель - з роз'ємами типу A і Mini-B).

Рис. 1. Плата Ардуіно та USB кабель

5
2. Скачайте середовище розробки Arduino
Останню версію можна знайти на офіційному сайті.
Після завершення закачування, розпакуйте скачаний архів.
Переконайтеся в тому, що структура директорій після розпакування не
порушена. Відкрийте папку - в ній повинно бути кілька файлів і піддиректорій.
3. Підключіть пристрій
При підключенні пристрою до комп'ютера слід мати на увазі наступне.
Arduino Uno, Mega, Duemilanove і Arduino Nano автоматично розпізнають
джерело живлення - будь це USB або зовнішнє джерело живлення. Якщо ж ви
використовуєте Arduino Diecimila, то перед підключенням до комп'ютера
необхідно переконатися, що пристрій налаштовано до живлення від USB.
Джерело живлення на цій платі вибирається джампером (невелика пластмасова
деталь, що дозволяє замкнути між собою тільки два виходи з трьох), що
підключає ланцюг живлення плати або до USB, або до роз'єму живлення.
Перед підключенням Ардуіно до комп'ютера переконайтеся, що джампер
встановлено на двох виходах, які розташовані ближче до USB-роз'єму.
За допомогою USB-кабелю підключіть Ардуіно до комп'ютера. При
цьому повинен загорітися зелений світлодіод живлення (зазначений на платі як
PWR).
4. Встановіть драйвери
Установка драйверів для Arduino Uno або Arduino Mega 2560 під
Windows:

- Підключіть Ардуіно до комп'ютера і дочекайтеся, поки Windows не


почне процес установки драйверів. Незважаючи на всі зусилля системи, через
кілька миттєвостей процес завершитися невдачею.
- Зайдіть в Пуск, відкрийте Панель управління.
- В Панелі керування перейдіть на сторінку Система і безпека. Далі
клацніть по пункту Система і відкрийте Диспетчер пристроїв. - Знайдіть розділ
Порти (COM & LPT). У ньому ви побачите відкритий порт під ім'ям «Arduino
UNO (COMxx)».

6
- Клацніть правою кнопкою по пункту «Arduino UNO (COMxx)» і
виберіть «Оновити драйвер».
- Далі, у вікні, виберіть пункт «Виконати пошук драйверів на цьому
комп'ютері».
- На завершення, виберіть файл драйвера під ім'ям «arduino.inf»,
розташований в папці «Drivers» в директорії завантаженого ПО Ардуіно (а не в
під-директорії «FTDI USB Drivers»). Якщо у вас стара версія IDE (1.0.3 або
старіше) - вибирайте файл під ім'ям «Arduino UNO.inf».
- Windows завершить установку драйвера.
5. Запустіть середовище розробки Arduino
Двічі клацніть по іконці середовища Arduino. (Примітка: якщо мова
інтерфейсу встановлена неправильно - її можна змінити у вікні налаштувань).
6. Відкрийте код тестової програми
Відкрийте тестову програму, яка змушує моргати світлодіод: File>
Examples> 1.Basics> Blink.

Рис. 2. Програмний лістинг Blink

7
7. Виберіть в меню свою модель Ардуіно
Тепер в меню Tools> Board необхідно вибрати пункт меню,
відповідний до вашої моделі Ардуіно.
Рис. 3. Вибір необхідної моделі Ардуіно

Вибір Arduino Uno


Для моделей Duemilanove з контролером ATmega328 (модель
мікроконтролера написана зверху на мікросхемі) вибирайте пункт «Arduino
Duemilanove» або «Nano w / ATmega328». У перших моделях Arduino
використовувався контролер ATmega168; для таких моделей необхідно
вибрати пункт «Arduino Diecimila, Duemilanove or Nano w / ATmega168».
(Детальніше про пункти меню і виборі моделей читайте на офіційній веб
сторінці).
8. Виберіть послідовний порт
У меню Tools> Serial Port виберіть послідовний порт, до якого
підключений ваш Ардуіно. Як правило, це COM-порт з номером 3 (COM3) або
вище (COM1 і COM2 зазвичай асоційовані з апаратними портами). Щоб
дізнатися потрібний порт, можна тимчасово від'єднати Ардуіно і ще раз
відкрити меню; зниклий порт і буде тим портом, з яким асоційований ваш
8
Ардуіно. Назад підключіть пристрій до комп'ютера і виберіть з меню
необхідний порт.
9. Прошийте програму
Після всіх виконаних дій просто натисніть кнопку «Upload» в
середовищі програмування Ардуіно. Зачекайте кілька секунд - ви побачите
мерехтіння світлодіодів RX і TX на платі. Якщо процес прошивки пройшов
успішно - в рядку стану з'явиться повідомлення «Done uploading».
(Примітка: для прошивки Arduino Mini, NG або іншої плати, за мить до
натискання кнопки «Upload» необхідно натиснути кнопку скидання на платі).

Рис. 4. Прошивка плати

Якщо через пару секунд після прошивки на платі почав блимати


помаранчевий світлодіод (підключений до виходу 13) - вітаємо! Ви успішно
налаштували і запустили Ардуіно.

Контрольні питання
1. Що таке Ардуіно?
2. Які плати Ардуіно Ви знаєте і в чому полягає різниця між ними?
3. Що таке середовище розробки Ардуіно та які налаштування там
здійснюються?
4. Що таке послідовний порт та як його визначити для Ардуіно?
5. Яким чином здійснюється прошивка плати Ардуіно?
6. Синтаксис Ардуіно.

9
Лабораторна робота №2
Тема: «Дослідження роботи світлодіода. Функції та процедури Ардуіно»
Мета роботи: «Підключення Ардуіно до комп’ютера, зібрати першу схему.
Дослідження функцій та процедур Ардуіно».

Список деталей для експерименту


- 1 плата Arduino Uno
- 1 макетна плата
- 1 світлодіод
- 1 резистор номіналом 220 Ом
- 2 дроти «тато-тато»

Принципова схема

Схема на макетній платі

10
Зверніть увагу
- Не забудьте, як з'єднані рейки в макетній платі. Якщо на вашій
макетній платі червона і синя лінії вздовж довгих рейок перериваються в
середині, значить провідник всередині макетної плати теж переривається!
- Катод ( «мінус») світлодіода - коротка ніжка, саме її потрібно
з'єднувати з землею (GND).
- Не нехтуйте резистором, інакше світлодіод вийде з ладу.
- Вибрати резистор потрібного номіналу можна за допомогою таблиці
маркування або за допомогою мультиметра в режимі вимірювання опору. -
Плата Arduino має три Піна GND, використовуйте будь-який з них.
Скетч

void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(900);
}

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

11
Наприклад:

void setup()
{
}

- Запам'ятайте, що кожній відкриваючій фігурній дужці «{» завжди


відповідає закриваюча «}». Вони позначають межі якогось логічно
завершеного фрагмента коду. Слідкуйте за вкладеністю фігурних дужок. Для
цього зручно після кожної відкриваючої дужки збільшувати відступ на кожний
новий рядок на один символ табуляції (клавіша Tab).
- Звертайте увагу на «;» в кінці рядків. Не можна видалятипрати їх
там, де вони є, і не додавайте зайвих. Незабаром ви будете розуміти, де вони
потрібні, а де ні.
- Функція digitalWrite (pin, value) не повертає ніякого значення і
приймає два параметри: pin - номер цифрового порту, на який ми відправляємо
сигнал; value - значення, яке ми відправляємо на порт. Для цифрових портів
значенням може бути HIGH (високе, 1) або LOW (низьке, 0).
- Якщо в якості другого параметра ви передасте функції digitalWrite
значення, відмінне від HIGH, LOW, 1 або 0, компілятор може не видати
помилку, але вважати, що передано HIGH. Будьте уважні.
- Зверніть увагу, що використані нами константи: INPUT, OUTPUT,
LOW, HIGH, пишуться великими літерами, інакше компілятор їх не розпізнає і
видасть помилку. Коли ключове слово розпізнано, воно підсвічується синім
кольором в Arduino IDE

Контрольні питання
1. Що буде, якщо підключити до землі анод світлодіода замість
катода?
2. Що буде, якщо підключити світлодіод з резистором великого
номіналу (наприклад, 10 кОм)?
3. Що буде, якщо підключити світлодіод без резистора?
4. Навіщо потрібна вбудована функція pinMode? Які параметри вона
приймає?
12
5. Навіщо потрібна вбудована функція digitalWrite? Які параметри
вона приймає?
6. За допомогою якої вбудованої функції можна змусити
мікроконтролер нічого не робити?
7. В яких одиницях задається тривалість паузи для цієї функції?

Завдання для самостійного вирішення


1. Зробіть так, щоб маячок світився півсекунди, а пауза між спалахами
дорівнювала одній секунді
2. Змініть код прикладу так, щоб маячок включався на три секунди
після запуску пристрою, а потім блимав в стандартному режимі.
13
Лабораторна робота №3
Тема: «Дослідження процесу широтно-імпульсної модуляції. Дослідження
функції analogWrite»
Мета роботи: «Дослідити ШІМ та функції analogWrite».

Список деталей для експерименту

- 1 плата Arduino Uno


- 1 макетна плата
- 1 світлодіод
- 1 резистор номіналом 220 Ом
- 2 дроти «тато-тато» Для додаткового завдання
- ще 1 світлодіод
- ще 1 резистор номіналом 220 Ом
- ще 2 дроти

Принципова схема

Схема на макетній платі

14
Зверніть увагу

Не будь-який порт Arduino підтримує широтно-імпульсну модуляцію,


якщо ви хочете регулювати напругу, вам підійдуть Піни, помічені символом
тильда "~". Для Arduino Uno це Піни 3, 5, 6, 9, 10, 11

Скетч

#define LED_PIN 9
void setup()
{
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
analogWrite(LED_PIN, 85);
delay(250);
analogWrite(LED_PIN, 170);
delay(250);
analogWrite(LED_PIN, 255);
delay(250);
}

Пояснення до коду
- Ідентифікатори змінних, констант, функцій (в цьому прикладі
ідентифікатор LED_PIN) є одним словом (тобто не можна створити
ідентифікатор LED PIN).
- Ідентифікатори можуть містити лише латинські літери, цифри та
символи підкреслення _. При цьому ідентифікатор не може починатися з
цифри.
- Регістр букв в ідентифікатор має значення. Тобто LED_PIN, LED_pin і
led_pin з точки зору компілятора - різні ідентифікатори.
- Ідентифікатори, створювані користувачем, не повинні збігатися з
зумовленими ідентифікаторами і стандартними конструкціями мови; якщо
середовище розробки підсвітила введений ідентифікатор будь-яким кольором,
замініть його на інший.

15
- Директива #define просто говорить компілятору замінити всі
входження заданого ідентифікатора на значення, задане після пробілу (тут 9),
ці директиви поміщають в початок коду. В кінці даної директиви крапка з
комою; не припустима.
- Назви ідентифікаторів завжди потрібно робити осмисленими, щоб при
поверненні до раніше написаного коду вам було ясно, навіщо потрібен кожен з
них.
- Також корисно наповнювати код програми коментарями: в прикладах
ми бачимо однорядкові коментарі, які починаються з двох прямих Слеш // і
багаторядкові, ув'язнені між / * * / коментарі ігноруються компілятором, зате
корисні людям при читанні давно написаного, а особливо чужого, коду.
- Функція analogWrite (pin, value) не повертає ніякого значення і
приймає два параметри: pin - номер порту, на який ми відправляємо сигнал;
value - значення шпаруватості ШІМ, яке ми відправляємо на порт. Він може
приймати цілочисельне значення від 0 до 255, де 0 - це 0%, а 255 - це 100%.

Контрольні питання
1. Які з наступних ідентифікаторів коректні і не викличуть помилку?
- 13pin
- MOTOR_1
- контакт_світлодіода
- sensor value
- leftServo
- my-var
- distance_eval2
2. Що станеться, якщо створити директиву #define HIGH LOW? 3. Чому
ми не зможемо регулювати яскравість світлодіода, підключеного до порту 7?
4. Яку усереднену напругу ми отримаємо на піні 6, якщо викличемо
функцію analogWrite (6, 153)?
5. Яке значення параметра value потрібно передати функції analogWrite,
щоб отримати усереднену напругу 2 В?

16
Завдання для самостійного вирішення
1. Відключіть живлення, вимкніть світлодіод від 9-го порту і
підключіть до 11-го. Змініть програму так, щоб схема знову запрацювала. 2.
Змініть код програми так, щоб протягом секунди на світлодіод послідовно
подавалося усереднена напруга 0, 1, 2, 3, 4, 5 В.
3. Візьміть ще один світлодіод, резистор на 220 Ом і зберіть аналогічну
схему на цій же макетній платі, підключивши світлодіод до піну номер 3 і
іншого входу GND, змініть програму так, щоб світлодіоди блимали в
протифазу: перший вимкнений, другий горить максимально яскраво і до
протилежного стану.

17
Лабораторна робота №4
Тема: «Дослідження світлодіодної шкали. Змінні, типи даних, цикли Ардуіно»
Мета роботи: «Дослідження світлодіодної шкали, та принципу її
функціонування. Вивчити змінні, типи даних, цикли Ардуіно».

Список деталей для експерименту

- 1 плата Arduino Uno


- 1 макетна плата
- 1 світлодіодна шкала
- 10 резисторів номіналом 220 Ом
- 11 проводів «тато-тато»

Принципова схема

Схема на макетній платі

18
Зверніть увагу
Ми підключаємо світлодіоди до цифрових портів, починаючи з порту 2.
Ми можемо використовувати порти 0 і 1, але вони є каналами передачі даних
послідовного порту і для кожної перепрошивки плати доведеться відключати
пристрої, підключені до них.
Скетч

#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop()
{
unsigned int ms = millis();
int pin = FIRST_LED_PIN + (ms / 120) % 10;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}

Пояснення до коду
- За допомогою виразу for ми організуємо цикл з лічильником. В
даному випадку для налаштування портів на вихід. Щоб зробити такий цикл,
потрібно:
∙ Ініціалізувати змінну-лічильник, присвоївши їй початкове значення. У
нашому випадку: int pin = FIRST_LED_PIN
∙ Вказати умову, до досягнення якого буде повторюватися цикл. У
нашому випадку:
pin <= LAST_LED_PIN
∙ Визначити правило, за яким буде змінюватися лічильник. У нашому
випадку ++ pin (див. Нижче про оператор ++).
- Наприклад, можна зробити цикл for (int i = 10; i> 0; i = i - 1). В цьому
випадку:
∙ Перемінній i присвоюється значення 10
19
∙ Це значення задовольняє умові i> 0
∙ Тому блок коду, поміщений в цикл, виконується перший раз ∙
Значення i зменшується на одиницю, згідно заданому правилу, і приймає
значення 9
∙ Блок коду виконується вдруге
∙ Все повторюється знову і знову аж до значення i рівного 0 ∙ Коли i
стане дорівнює 0, умова i> 0 не виконається, і виконання циклу закінчиться
∙ Контролер перейде до коду, наступного за циклом for
- Поміщайте код, з яким потрібно зробити цикл, між парою фігурних
дужок {}, якщо в ньому більше однієї інструкції.
- Змінна-лічильник, оголошується в операторі for, може
використовуватися всередині циклу. Наприклад, в даному експерименті pin
послідовно приймає значення від 2 до 11 і, будучи переданою в pinMode,
дозволяє налаштувати 10 портів одним рядком, вміщений в цикл.
- Змінні-лічильники видно тільки всередині циклу. Тобто якщо
звернутися до pin до або після циклу, компілятор видасть помилку про
неоголошену змінну.
- Конструкція i = i - 1 в поясненні вище не є рівнянням! Ми
використовуємо оператор присвоювання = для того, щоб в змінну i помістити
значення, рівне до поточного значення i, зменшеного на 1.
- Вираз ++ pin - це т.зв. оператор інкремента, застосований до змінної
pin. Ця інструкція дасть той же результат, що pin = pin + 1
- Аналогічно Інкремент працює оператор декремента -, що зменшує
значення на одиницю. Детальніше про це в статті про арифметичні операції. -
Тип даних unsigned int використовують для зберігання цілих чисел без знака,
тобто тільки невід'ємних. За рахунок зайвого біта, який тепер не
використовується для зберігання знака, ми можемо зберігати в змінної такого
типу значення до 65 535.
- Функція millis повертає кількість мілісекунд, що пройшли з моменту
включення або перезавантаження мікроконтролера. Тут ми використовуємо її
для відліку часу між перемиканнями світлодіодів.

20
- За допомогою виразу (ms / 120)% 10 ми визначаємо, який з 10
світлодіодів повинен горіти зараз. Перефразовуючи, ми визначаємо який
відрізок довжиною в 120 мс йде зараз і який його номер всередині поточного
десятка. Ми додаємо порядковий номер відрізка до номера того порту, який в
поточному наборі виступає першим.
- Те, що ми гасимо світлодіод за допомогою digitalWrite (pin, LOW)
всього через 10 мс після включення не помітно оку, тому що дуже скоро буде
знову обчислено, який з світлодіодів включати, і він буде включений - тільки
що погашений або наступний.

Контрольні питання
1. Чому в даному експерименті ми підключаємо світлодіодну шкалу, не
використовуючи транзистор?
2. Якби ми включали світлодіоди тільки на портах 5, 6, 7, 8, 9, що
потрібно було б змінити в програмі?
3. За допомогою якої іншої інструкції можна виконати дію,
еквівалентну ++ pin?
4. В чому різниця між змінними типів int і unsigned int?
5. Що повертає функція millis ()?
6. Як в даному експерименті ми обчислюємо номер порту, на якому
потрібно включити світлодіод?
7. Поясніть змінні, типи даних, цикли Ардуіно.

Завдання для самостійного вирішення


1. Змініть код так, щоб світлодіоди переключалися раз в секунду. 2.
Не вимикаючи порти, зробіть так, щоб вогник рухався тільки по середнім
чотирьом розподілам шкали.
3. Переробіть програму так, щоб замість int pin = FIRST_LED_PIN +
(ms / 120)% 10 перемещенням вогника керував цикл for.
4. Не змінюючи місцями проводи, змініть програму так, щоб вогник
рухався в зворотному напрямку.

21
Лабораторна робота №5
Тема: «Дослідження кнопкового перемикача. Дослідження логічних
операторів Ардуіно»
Мета роботи: «Дослідження електромеханічного пристрою, кнопкового
перемикача та принципу його функціонування. Дослідити логічні оператори
Ардуіно».

Список деталей для експерименту


- 1 плата Arduino Uno
- 1 макетна плата
- 2 тактові кнопки
- 1 резистор номіналом 220 Ом
- 1 світлодіод
- 7 проводів «тато-тато»

Принципова схема

Схема на макетній платі

22
Зверніть увагу

- Ми могли б один з контактів кнопки з'єднати проводом безпосередньо


з одним із входів GND, але ми спочатку «роздали» «землю» на довгу рейку
макетки. Якщо ми працюємо з макетної платою, так поступати зручніше, тому
що в схемі можуть з'являтися нові ділянки, які теж потрібно буде з'єднати з
«землею».
- Також корисно керуватися міркуваннями акуратності виробу, тому
катод світлодіода ми з'єднуємо з іншим входом GND окремим проводом, який
не заважає нам працювати в середині макетки.
Скетч

#define BUTTON_PIN 3
#define LED_PIN 13
boolean buttonWasUp = true;
boolean ledEnabled = false;
void setup()
{
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop()
{
boolean buttonIsUp = digitalRead(BUTTON_PIN);
if (buttonWasUp && !buttonIsUp)
{
delay(10);
buttonIsUp = digitalRead(BUTTON_PIN);
if (!buttonIsUp)
{
ledEnabled = !ledEnabled;
digitalWrite(LED_PIN, ledEnabled);
}
}
buttonWasUp = buttonIsUp;
}

23
Пояснення до коду

- Оскільки ми с конфігурували вхід кнопки як INPUT_PULLUP, при


натисканні на кнопку на даному вході ми будемо отримувати 0. Тому ми
отримаємо значення true («істина») в булеву змінну buttonIsUp («кнопка
відпущена»), коли кнопка відпущена.
- Логічний оператор && ( «і») Повертає значення «істина» лише в разі
істинності обох його операндів. Погляньмо на так званні таблиці істинності
для виразу buttonWasUp &&! buttonIsUp ( «кнопка була відпущена і лампочка
кнопки не відпущена»):
- Тут розглянуті всі можливі поєднання попереднього і поточного
станів кнопки і ми бачимо, що наш умовний оператор if спрацює тільки в разі,
коли кнопка натиснута тільки що: попередній стан 1 ( «була відпущена»), а
поточний 0 ( «не відпущена»).
- Через 10 мілісекунд ми перевіряємо ще раз, чи натиснута кнопка: цей
інтервал більше, ніж тривалість «коливання», але менше, ніж час, за яке
людина встигла б двічі натиснути на кнопку. Якщо кнопка все ще натиснута,
значить, це був не брязкіт.
- Ми передаємо в digitalWrite не конкретне значення HIGH або LOW, а
просто булеву змінну ledEnabled. Залежно від того, яке значення було для неї
обчислено, світлодіод буде запалюватися або гаситися.

24
- Остання інструкція в buttonWasUp = buttonIsUp зберігає поточний
стан кнопки в змінну попереднього стану, адже на наступній ітерації loop
поточний стан вже стане історією.

Контрольні питання
1. В якому випадку оператор && повертає значення
«істина»? 2. Що таке «брязкіт»?
3. Як ми з ним боремося в програмі?
4. Як можна уникнути явної вказівки значення рівня напруги при
виклику digitalWrite?

Завдання для самостійного вирішення


1. Змініть код так, щоб світлодіод переключався тільки після
відпускання кнопки.
2. Додайте в схему ще одну кнопку і доопрацюйте код, щоб світлодіод
запалювався тільки при натисканні обох кнопок.

25
Лабораторна робота №6
Тема: «Дослідження семисегментного індикатора. Дослідження масивів
Ардуіно, функції millis та булевих типів даних»
Мета роботи: «Дослідження семисегментного індикатора та принципу його
функціонування. Вивчити масиви Ардуіно, функції millis та булеві типи
даних».

Список деталей для експерименту

- 1 плата Arduino Uno


- 1 макетна плата
- 1 семисегментний індикатор
- 7 резисторів номіналом 220 Ом
- 9 проводів «тато-тато»

Принципова схема

26
Схема на макетній платі

Зверніть увагу
- Виходи 3 і 8 семисегментного індикатора є катодами, до землі можете
підключати будь-який з них.
- Уважно розгляньте схему, зіставте сегменти індикатора з номерами
його ніжок, а ті, в свою чергу, з пінами Arduino, до яких ми їх підключаємо. -
Вихід 5 індикатора - це крапка. Ми не використовуємо її в цьому
експерименті.
- Сегменти індикатора - просто світлодіоди, тому ми використовуємо
резистор з кожним з них.

Скетч

#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
byte numberSegments[10] = {
0b00111111, 0b00001010, 0b01011101, 0b01011110, 0b01101010,
0b01110110, 0b01110111, 0b00011010, 0b01111111, 0b01111110,
};
27
void setup()
{
for (int i = 0; i < SEGMENT_COUNT; ++i)
pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);
}
void loop()
{
int number = (millis() / 1000) % 10;
int mask = numberSegments[number];
for (int i = 0; i < SEGMENT_COUNT; ++i) {
boolean enableSegment = bitRead(mask, i);
digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);
}
}

Пояснення до коду

- Ми створили масив типу byte: кожен його елемент це 1 байт, 8 біт,


може приймати значення від 0 до 255.
- Символи арабських цифр закодовані станом пінів, які з'єднані з
виходами відповідних сегментів: 0, якщо сегмент повинен бути вимкнений, і 1,
якщо включений.
- У змінну mask ми поміщаємо той елемент масиву numberSegments,
який відповідає поточній секунді, обчисленої з попередньої інструкції. - У
циклі for ми пробігаємо по всіх сегментах, витягуючи з допомогою вбудованої
функції bitRead потрібний стан для поточного піна, в який його і приводимо за
допомогою digitalWrite і змінної enableSegment - bitRead (x, n) повертає boolean
значення: n-ний біт праворуч в байті x

Контрольні питання
1. До якої ніжки нашого семисегментного індикатора потрібно
підключати землю?
2. Як ми зберігаємо закодовані символи цифр?
3. Яким чином ми виводимо символ на індикатор?
4. Охарактеризуйте масиви Ардуіно, яким чином створити та
ініціалізувати?
5. Охарактеризуйте булеві типи даних. Функція millis, її призначення.

28
Завдання для самостійного вирішення
1. Змініть код, щоб індикатор відраховував десяті секунди.
2. Поміняйте програму так, щоб замість символу «0» відображався
символ «А».
3. Доповніть схему і програму таким чином, щоб сегмент-крапка
включався при проходженні парних чисел і вимикався на непарних.
29
Лабораторна робота №7
Тема: «Дослідження bluetooth модулю HC-05, підключення до Arduino.
Управління пристроями з телефону. Дослідження класів і методів Ардуіно»
Мета роботи: «Дослідження bluetooth модулю HC-05 та принципу його
функціонування. Управління пристроями з телефону. Дослідити класи і
методи Ардуіно».

Список деталей для експерименту

- 1 плата Arduino Uno


- 4 дроти «тато-мама»
- модуль Bluetooth

Схема підключення

Характе
ристики Bluetooth модуля HC-05:
- Протокол зв'язку Bluetooth Specification v2.0 + EDR
- Частота GFSK (Gaussian Frequency Shift Keying)
30
- Потужність відправки ≤4dBm, Class 2
- Потужність прийому ≤-84dBm at 0.1% BER
- Швидкість асинхронна 2.1Mbps (Max) / 160 kbps, синхронна 1Mbps / 1Mbps
- Безпека Authentication and encryption
- Профіль Bluetooth serial port
- Живлення + 5VDC 50mA
- Робочі температури -20 ~ +75 C
- Розміри 26.9мм х 13 мм х 2,2 мм

Під час завантаження скетчу необхідно що б Bluetooth модуль був


відключений від мікроконтролера arduino. В іншому випадку скетч НЕ
запишеться, тому що зв'язок з Bluetooth модулем відбувається по одному і
тому ж порту RX і TX, що і USB.

Скетч

int val;
int LED = 13;
void setup()
{
Serial.begin(9600);
pinMode(LED, OUTPUT);
digitalWrite(LED, HIGH);
}
void loop()
{
if (Serial.available())
{
val = Serial.read();
if (val == '1')
{
digitalWrite(LED, HIGH);
}
if ( val == '0')
{
digitalWrite(LED, LOW);
}
}
}

31
Serial

Клас Serial використовується для зв'язку плати Ардуіно з комп'ютером


або іншими пристроями. Всі плати Arduino мають, принаймні, один
послідовний порт (також відомий як UART або USART): Serial. Він пов'язаний
з цифровими виходами 0 (RX) і 1 (TX), а також використовується для зв'язку з
комп'ютером через USB. Таким чином, під час використання послідовного
порту, виходи 0 і 1 не можуть використовуватися в якості цифрових входів або
виходів.
Для зв'язку з Arduino можна використовувати спеціальну програму
моніторингу послідовного порту, вбудовану в програмне забезпечення
Ардуіно. Для виклику програми натисніть відповідну кнопку на панелі
інструментів і встановіть ту ж швидкість передачі, що вказується в вашій
програмі при виклику методу begin ().

begin ()

Задає швидкість передачі даних по послідовному інтерфейсу в бітах в


секунду (бодах). Для взаємодії з комп'ютером слід використовувати одну з
попередньо встановлених швидкостей обміну: 300, 600, 1200, 2400, 4800, 9600,
14400, 19200, 28800, 38400, 57600 або 115200. Проте, можна ставити й інші
швидкості - наприклад, для взаємодії з будь-яким специфічним компонентом
за допомогою виходів 0 і 1.
Необов'язковий другий аргумент цієї функції дозволяє налаштувати
кількість біт даних, перевірку парності і степових біти. За замовчуванням,
посилка складається з 8 біт даних, без перевірки парності, з одним стоповим
бітом.

available ()
Повертає кількість байт (символів) доступних для зчитування з буфера
послідовного порту. Під символами розуміються дані, які вже прийняті і
зберігаються в послідовному приймальному буфері (який може зберігати

32
максимум 64 байта). Функція available () є спадкоємцем допоміжного класу
Stream.
read ()
Зчитує дані, що надходять по послідовному інтерфейсу. Функція read ()
є спадкоємцем допоміжного класу Stream.

оператор If

if (умова) і ==,! =, <,> (оператори порівняння)


if, використовується в поєднанні з операторами порівняння, перевіряє,
чи досягнута істинність умови, наприклад, перевищує вхідне значення задане
число.
Формат оператора if наступний:

if (someVariable> 50)
{
// виконувати дії
}

Програма перевіряє, значення someVariable більше ніж 50 чи ні. Якщо


так, то виконуються певні дії. Інакше кажучи, якщо вираз в круглих дужках
істинний, виконуються оператори всередині фігурних дужок. Якщо немає,
програма пропускає цей код.
Дужки після оператора if можуть бути опущені. Якщо так зроблено,
тільки такий рядок (позначена крапкою з комою) стає оператором,
виконуваних в операторі if.

if (x> 120) digitalWrite (LEDpin, HIGH);

if (x> 120)
digitalWrite (LEDpin, HIGH);

33
if (x> 120) {digitalWrite (LEDpin, HIGH); }

if (x> 120) {
digitalWrite (LEDpin1, HIGH);
digitalWrite (LEDpin2, HIGH);
} // все правильно

Вирази, які обчислюються всередині круглих дужок, можуть


складатися з одного або декількох операторів.

Оператори порівняння
x == y (x рівно y)
x! = y (x не дорівнює y)
x <y (x менше ніж y)
x> y (x більше ніж y)
x <= y (x менше ніж або дорівнює y)
x> = y (x більше ніж або дорівнює y)

Увага!
Слідкуйте, щоб випадково не використовувати знак простої рівності
(наприклад, if (x = 10)). Знак простої рівності - це оператор присвоювання, і
встановлює значення х дорівнює 10 (заносить значення 10 в змінну х). Замість
цього використовуйте знак подвійної рівності (наприклад, if (x == 10)), який є
оператором порівняння і перевіряє, х дорівнює 10 чи ні. Останнє з двох виразів
це слово, тільки якщо х дорівнює 10, але попередній вираз завжди вірний.
Це пов'язано з тим, що С обчислює вираз if (x = 10) у такий спосіб:
значення 10 присвоюється х (пам'ятаємо, що простий знак рівності - це
оператор присвоювання), таким чином, х тепер дорівнює 10. Потім умовний if
обчислює 10, яке вже рівно ІСТИНА, так як будь-яке число, нерівне 0, так само
ІСТИНА. Тому if (x = 10) буде завжди мати логічне значення ІСТИНА,

34
яке не є бажаним результатом, коли використовується оператор if. До того ж,
змінної х буде присвоєно значення 10, що також не є бажаною дією. If також
може бути частиною розгалуженої керуючої конструкції з використанням if ...
else.
Підключення Bluetooth до телефону
1. Включаємо Bluetooth на телефоні і шукаємо нові
пристрої. 2. Знаходимо в списку «HC-05 і підключаємося до
нього.
3. Телефон запитає пін-код, необхідно ввести «1234» або «0000».
4. Пристрій підключено.
Тепер потрібно завантажити bluetooth terminal на ваш телефон. Ми
розглянемо на прикладі платформи Android.

Рис.5. Вікно завантаження терміналу

35
Рис.6. Вікно підключення до модулю Bluetooth

Ви можете встановити різні bluetooth термінали, як правило вони


відрізняються тільки різними дизайнами, функціонал від цього не змінюється.
Так само можна знайти і термінал для продуктів IOS.
Після того як ми встановили термінал, запускаємо його вибираємо наш
bluetooth модуль HC-05 і підключаємося до нього.
Прийшов час спробувати проект в справі. Пишемо в терміналі цифру
«0» і відправляємо. Світлодіод L який знаходиться на платі arduino поруч з pin
13, повинен згаснути. Тепер відправимо через термінал цифру «1» і світлодіод
L повинен засвітитися.

Контрольні питання
1. Охарактеризуйте клас Serial та його призначення.
2. Охарактеризуйте метод begin ()та його призначення.
3. Охарактеризуйте метод available () та його призначення.
4. Охарактеризуйте метод read ()та його призначення.
5. Поясніть принцип роботи та взаємодію bluetooth модулю HC-05 з
девайсами.

36
Завдання для самостійного вирішення
1. Змінити скетч так, що б світлодіод запалювався і згасав за
допомогою однієї і тієї ж команди.
2. Дописати скетч і навчити його перетворювати текстові дані, що
приходять через bluetooth в цифрові і реалізувати димер, запалювати
світлодіод за допомогою ШІМ, на задану яскравість від 0 до 254, що приходять
через bluetooth.
3. Виконати завдання вказане викладачем.

37
Список використаних джерел
1. "Arduino - Introduction". arduino.cc.
2. David Kushner (2011-10-26). "The Making of Arduino". IEEE Spectrum.
3. Justin Lahart (27 November 2009). "Taking an Open-Source Approach to
Hardware". The Wall Street Journal. Retrieved 2014-09-07.
4. Hernando Barragán (2016-01-01). "The Untold History of Arduino".
arduinohistory.github.io. Retrieved 2016-03-06.
5. "Rhizome - Interview with Casey Reas and Ben Fry". 2009-09-23.
Retrieved 2014-08-23.
6. "How many Arduinos are "in the wild?" About 300,000". Adafruit
Industries. May 15, 2011. Retrieved 2013-05-26.
7. "Arduino FAQ – With David Cuartielles". Malmö University. April 5,
2013. Retrieved 2014-03-24.
8. "Arduino's New CEO, Federico Musto, May Have Fabricated His
Academic Record". WIRED. Retrieved 2017-12-22.
9. "Free Arduino | Make:". Make: DIY Projects and Ideas for Makers. 2017-
06-09. Retrieved 2017-12-22.
10. "The Arduino Foundation: What's Up?". Hackaday. 2017-06-19.
Retrieved 2017-12-22.
11. Biggs, John. "CEO controversy mars Arduino's open future".
TechCrunch. Retrieved 2017-12-22.
12. "Arduino reborn partners with ARM". Electronics Weekly. 2017-10-06.
Retrieved 2017-11-03.
13. Петин В.А. Проекты с использованием контроллера Arduino. —
БХВ-Петербург, 2014. — 400 с.

38

You might also like