Professional Documents
Culture Documents
Основи Програмування в Телекомунікаціях Та Радіотехніці
Основи Програмування в Телекомунікаціях Та Радіотехніці
В.О. Гнатюк
МЕТОДИЧНІ РЕКОМЕНДАЦІЇ
для виконання лабораторних робіт з дисципліни «Основи
програмування в телекомунікаціях та радіотехніці»
КИЇВ-2018
УДК 004.3
ББК 32.973.23-018.2
Б78
Рецензенти: Гнатюк Сергій Олександрович, д.т.н., доцент
(Національний авіаційний університет)
Климчук Володимир Павлович, к.т.н., проф.
(Національний авіаційний університет)
2
ЗМІСТ
4
Вступ
…………………………………………………………………………………………….
. Лабораторна робота №1. Початок роботи з Ардуіно на Windows.
Синтаксис Ардуіно...…………………………….…..………………………………… 5
3
ВСТУП
4
Лабораторна робота №1
Тема: «Початок роботи з Ардуіно на Windows. Синтаксис Ардуіно» Мета
роботи: «Підключення Ардуіно до комп’ютера та прошивка першою
програмою. Ознайомлення з синтаксисом Ардуіно».
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:
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.
7
7. Виберіть в меню свою модель Ардуіно
Тепер в меню Tools> Board необхідно вибрати пункт меню,
відповідний до вашої моделі Ардуіно.
Рис. 3. Вибір необхідної моделі Ардуіно
Контрольні питання
1. Що таке Ардуіно?
2. Які плати Ардуіно Ви знаєте і в чому полягає різниця між ними?
3. Що таке середовище розробки Ардуіно та які налаштування там
здійснюються?
4. Що таке послідовний порт та як його визначити для Ардуіно?
5. Яким чином здійснюється прошивка плати Ардуіно?
6. Синтаксис Ардуіно.
9
Лабораторна робота №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()
{
}
Контрольні питання
1. Що буде, якщо підключити до землі анод світлодіода замість
катода?
2. Що буде, якщо підключити світлодіод з резистором великого
номіналу (наприклад, 10 кОм)?
3. Що буде, якщо підключити світлодіод без резистора?
4. Навіщо потрібна вбудована функція pinMode? Які параметри вона
приймає?
12
5. Навіщо потрібна вбудована функція digitalWrite? Які параметри
вона приймає?
6. За допомогою якої вбудованої функції можна змусити
мікроконтролер нічого не робити?
7. В яких одиницях задається тривалість паузи для цієї функції?
Принципова схема
14
Зверніть увагу
Скетч
#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
Тема: «Дослідження світлодіодної шкали. Змінні, типи даних, цикли Ардуіно»
Мета роботи: «Дослідження світлодіодної шкали, та принципу її
функціонування. Вивчити змінні, типи даних, цикли Ардуіно».
Принципова схема
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. Поясніть змінні, типи даних, цикли Ардуіно.
21
Лабораторна робота №5
Тема: «Дослідження кнопкового перемикача. Дослідження логічних
операторів Ардуіно»
Мета роботи: «Дослідження електромеханічного пристрою, кнопкового
перемикача та принципу його функціонування. Дослідити логічні оператори
Ардуіно».
Принципова схема
22
Зверніть увагу
#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
Пояснення до коду
24
- Остання інструкція в buttonWasUp = buttonIsUp зберігає поточний
стан кнопки в змінну попереднього стану, адже на наступній ітерації loop
поточний стан вже стане історією.
Контрольні питання
1. В якому випадку оператор && повертає значення
«істина»? 2. Що таке «брязкіт»?
3. Як ми з ним боремося в програмі?
4. Як можна уникнути явної вказівки значення рівня напруги при
виклику digitalWrite?
25
Лабораторна робота №6
Тема: «Дослідження семисегментного індикатора. Дослідження масивів
Ардуіно, функції millis та булевих типів даних»
Мета роботи: «Дослідження семисегментного індикатора та принципу його
функціонування. Вивчити масиви Ардуіно, функції millis та булеві типи
даних».
Принципова схема
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);
}
}
Пояснення до коду
Контрольні питання
1. До якої ніжки нашого семисегментного індикатора потрібно
підключати землю?
2. Як ми зберігаємо закодовані символи цифр?
3. Яким чином ми виводимо символ на індикатор?
4. Охарактеризуйте масиви Ардуіно, яким чином створити та
ініціалізувати?
5. Охарактеризуйте булеві типи даних. Функція millis, її призначення.
28
Завдання для самостійного вирішення
1. Змініть код, щоб індикатор відраховував десяті секунди.
2. Поміняйте програму так, щоб замість символу «0» відображався
символ «А».
3. Доповніть схему і програму таким чином, щоб сегмент-крапка
включався при проходженні парних чисел і вимикався на непарних.
29
Лабораторна робота №7
Тема: «Дослідження bluetooth модулю HC-05, підключення до Arduino.
Управління пристроями з телефону. Дослідження класів і методів Ардуіно»
Мета роботи: «Дослідження bluetooth модулю HC-05 та принципу його
функціонування. Управління пристроями з телефону. Дослідити класи і
методи Ардуіно».
Схема підключення
Характе
ристики 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 мм
Скетч
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
begin ()
available ()
Повертає кількість байт (символів) доступних для зчитування з буфера
послідовного порту. Під символами розуміються дані, які вже прийняті і
зберігаються в послідовному приймальному буфері (який може зберігати
32
максимум 64 байта). Функція available () є спадкоємцем допоміжного класу
Stream.
read ()
Зчитує дані, що надходять по послідовному інтерфейсу. Функція read ()
є спадкоємцем допоміжного класу Stream.
оператор If
if (someVariable> 50)
{
// виконувати дії
}
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.
35
Рис.6. Вікно підключення до модулю Bluetooth
Контрольні питання
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