Керування з кнопки

Вступ

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

Кнопки



Кнопки уже досить довгий час являються основним способом взаємодії людини з електронікою, зокрема і комп’ютерами чи побутовими приладами. Натискаючи кнопки на мікрохвильовці, ми можемо задати час і температуру підігріву їжі. Натискаючи кнопки на клавіатурі ноутбука ми вводимо слова в текстовому документі. Коли приходимо вгості до друга – натискаємо кнопку дверного дзвінка. Лише відносно недавно з’явились сенсорні екрани, де ми натискаємо вже віртуальні кнопки, але принцип залишився той самий. Тому коли ви проєктуєте свій пристрій, яким буде користуватись людина, обов’язково треба придумати спосіб, через який вона буде керувати ним. І таким способом найчастіше є кнопки.
Наш Дрон має 4 кнопки, лише 2 з яких ми можемо використовувати в своїх програмах – кнопка А (підключена до піна PA4) та кнопка B (пін PC15). Ми можемо зчитувати стани (натиснуті чи ні) цих кнопок з нашої програми і реагувати як нам хочеться: наприклад керувати світлодіодами, запускати музику на зумері, вмикати пропелер і т.д.

Принцип дії кнопки наступний: кнопка підключена в розімкнуте електричне коло і коли на кнопку натискають, то цим самим кнопка замикає коло і по ньому починає протікати струм. А як відомо з уроків фізики, електричний струм може протікати лише в замкнутому колі. В цей же час електронний пристрій (в нашому випадку – Дрон) вміє виявляти протікання струму в електричному колі з кнопкою. Таким чином ми і дізнаємось, що кнопка була натиснута. Насправді, всі побутові прилади теж так роблять, щоб дізнатися коли користувач натискає кнопки.

Написання програми

Давайте напишемо програму, яка буде вмикати перший світлодіод (пін PA5) при натисканні на кнопку A (пін PA4). Для цього пригадаємо вже відомі з попередніх уроків функції, які допоможуть нам в цьому:
digitalWrite – вмикаємо (1) чи вимикаємо (0) пін
pinMode – переводимо пін в режим роботи на вхід (INPUT) чи на вихід (OUTPUT). Цього разу, оскільки нам потрібно буде зчитувати стан кнопки, то нам треба перевести режим роботи піна, до якого підключена кнопка в режим роботи саме на вхід
Нова функція, яку ми вивчимо на цьому уроці це:
digitalRead – зчитує стан кнопки на певному піні, повертає 0 якщо кнопка натиснута, 1 – не натиснута. Тобто таким чином Дрон у вигляді числа каже нам чи кнопка була натиснута чи ні

 1void setup() {
 2  pinMode(PA5, OUTPUT);
 3  pinMode(PA4, INPUT);
 4}
 5
 6int pressed;
 7
 8void loop() {
 9  pressed = digitalRead(PA4);
10  if (pressed == 0) {
11    digitalWrite(PA5, 1);
12  }
13  if (pressed == 1) {
14    digitalWrite(PA5, 0);
15  }
16}
 1void setup() {           //Функція 'setup' виконується першою при запуску Дрона і лише раз
 2  pinMode(PA5, OUTPUT);  //Переводимо пін 1-го світлоідоду в режим роботи на вихід
 3  pinMode(PA4, INPUT);   //Переводимо пін кнопки А в режим роботи на вхід
 4}
 5
 6int pressed;              //Створення змінної 'pressed', в якій будемо зберігати чи нажата кнопка
 7
 8void loop() {             //Функція 'loop' виконується циклічно і безкінечно одразу після 'setup'
 9  pressed = digitalRead(PA4);//Зчитуємо стан кнопки у вигляді цифри: 1 - не натиснута, 0 - так
10  if (pressed == 0) {     //Перевіряємо чи функція 'digitalRead' записала в змінну 'pressed' нуль
11    digitalWrite(PA5, 1); //якщо так - значить вмикаємо світлодіода
12  }
13  if (pressed == 1) {     //Перевіряємо чи функція 'digitalRead' записала в змінну 'pressed' одиницю:
14    digitalWrite(PA5, 0); //якщо так - вимикаємо сітлодіод
15  }
16}

Скопіюйте програму в Ардуїно, переведіть Дрон в режим програмування та завантажте нашу нову програму на Дрон. Якщо забули як це робиться, можна звернутися до 1-го уроку.

flowchart LR
   k("Налаштування\n(setup)"):::step --> l
   a(Зчитуємо стан кнопки A) --> b(Перевіряємо чи\nА нажата)
   b --> c(Так? Тоді вмикаємо світлодіод)
   b --> d(Далі перевіряємо\nчи А відпущена)
   d --> e(Так? Тоді вимикаємо)
   d --> a
   l:::loop
    subgraph l["Виконуємо циклічно (loop)"]
    direction TB
    a:::step
    b:::step
    c:::step
    d:::step
    e:::step

classDef step fill:#f96,color:black,stroke:#f96;
classDef loop fill:#5490ff,color:black;
linkStyle default fill:none,stroke-width:2px,stroke:white,text-color:red

end

На попередньому уроці ми познайомились з поняттям функції, тепер розглянемо що таке змінна. Змінна – це комірка пам’яті Дрона (чи комп’ютера), в яку ми можемо записувати числа, текст, щоб використати в майбутньому. Наприклад, в програмі вище ми використали функцію digitalRead, і записали те, що вона повернула в змінну pressed. Якби ми цього не зробили, то результат роботи функції digitalRead нікуди не зберігся б і ми його втратили і тоді не було б сенсу викликати ту функцію. Це все-рівно що попросити працівника створити красиву презентацію на комп’ютері, але закрити програму і забути зберегти результат роботи. Щоб створити змінну треба спочатку вказати її тип і через пробіл її назву.
Ось приклади типів і створення змінних:

 1//Цілочисельний тип даних int
 2int apples;    //створили змінну 'apples', в яку можна записати скільки в нас яблук числом
 3int days = 364;//створили змінну 'days', в яку можна записати наприклад скільки днів залишилось до Нового Року
 4apples = 3;    //раніше змінна 'apples' вже була створена тому тут записуємо в неї число
 5
 6//Тип даних з крапокою double
 7double cost = 12999.99; //створили і записали в змінну 'cost' (ціна) вартість електрогенератора з точністю до копійок
 8int cost = 12999; //створили і записали в змінну 'cost' (ціна) вартість електрогенератора без точності
 9//Як бачите з прикладу вище різниця між типами даних 'int' та 'double' в тому, що в змінну типу 'double' можна записати цифри після коми
10
11//Символьний тип дани char
12char first; //створили змінну, в яку можна записувати символи, наприклад першу літеру англійського алфавіту 'A'
13char second = 'B'; //створили і одразу записали в змінну 'second' другу літеру англійського алфавіту
14first = 'A'; //змінна 'first' була раніше уже створена, тому тут ми лише задали їй значення
15
16//Логічний тип даних bool
17bool tvOn = true;     //так, телевізор увімкнений
18bool radioOn = false; //ні, радіо не увімкнене
19//Тип данних bool дозволяє записати в змінну всього 2 можливі значення: true або false
Завдання

Погляньте на нашу програму з кнопкою і спробуйте знайти змінну, яку ми там створили. Який її тип? Чому саме такий тип обрали?

Тепер спробуйте нашу програму в ділі. Понатискайте на кнопку і поспостерігайте за поведінкою Дрона. Як бачите, тепер Дрон реагує на натискання кнопки і повністю виконує Ваші команди, які ми описали в програмі. Це відрізняється від 1-го уроку, де Дрон міг миготіти світлодіодом лише з заданим інтервалом.

Самостійна робота №1

Світлодіод, яким ми керували з кнопки, підключений до піна PA5 і знаходиться одразу на основній частині Дрона. Тепер давайте підключимо зовнішній модуль до Дрона і спробуємо керувати ним. Для цього виконайте наступне:

  1. Підключіть пропелер до піна PA6 (зверху зліва)
  2. Модифікуйте попередню програму в Ардуїно таким чином, щоб замість піна PA5 можна було керувати піном PA6
  3. Завантажте Вашу нову програму на Дрон

Тепер спробуєте самостійно керувати іншим світлодіодом.

  1. Модифікуйте основну програму таким чином, щоб замість світлодіоду PA5, можна було керувати будь-яким іншим світлодіодом, наприклад PA7 чи PA12
  2. Завантажте Вашу нову програму на Дрон



Самостійна робота №2
  1. Модифікуйте основну програму таким чином, щоб в додачу до світлодіоду PA5 вмикався ще й світлодіод PA7 або будь-який інший.
  2. Завантажте Вашу нову програму на Дрон
  1. Модифікуйте основну програму таким чином, щоб вмикались всі світлодіоди, які має Дрон: PA5, PA7, PB0, PA12, PB3.
  2. Завантажте Вашу нову програму на Дрон
  • apple (епл) – яблуко
  • day (дей) – день
  • cost (кост) – ціна
  • pressed (пресд) – натиснутий
  • write (райт) – писати, записувати
  • read (рід) – читати, зчитувати
  • first (фьорст) – перший
  • second (секонд) – другий
  • tv (тіві) – телевізор
  • on (он) – увімкнений
  • radio (редіо) – радіо
  • light (лайт) – світло