Дрон на пульту

Вступ

На одному з попередніх уроків ми розглядали провідний спосіб комунікації Дрона з зовнішнім світом: через кабель спілкувалися з комп’ютером. На цьому уроці розглянемо односторонню, але безпровідну комунікацію: ІЧ (інфрачервоний) пульт керування. ІЧ пульти керування багато десятиліть були основним способом керування в телевізорах. Лише останні десять років їх поступово замінюють більш сучасні пульти на протоколах Bluetooth чи навіть Wi-Fi. Але ІЧ пульти ще досі використовуються і в інших побутових пристроях, наприклад кондиціонерах, музичних медіацентрах або недорогих телевізорах.

ІЧ приймач

Там, де існує ІЧ передавач (пульт) має бути і приймач – той, хто приймає і реагує на сигнали. Тому існує ІЧ приймач, який можна підключити до нашого Дрона у вигляді модуля. І так само як і у випадку з датчиком вібрації (з 4-го уроку) ми можемо розпізнавати отримані сигнали і реагувати на них як нам захочеться. Тобто можна, натискаючи кнопки на пульту, заставити наш Дрон наприклад увімкнути пропелер чи грати мелодії через пищалку. Для цього нам знадобляться 3 речі:

  1. ІЧ пульт (передавач)
  2. ІЧ приймач для Дрона, підключений до піна PA1
  3. Написати програму для Дрона

Сторонні бібліотеки

На цьому уроці нам вперше доведеться дізнатися, що таке сторонні бібліотеки та як їх підключати до нашої програми. Сторонні бібліотеки – це шматки програми, написані іншими програмістами. Ці бібліотеки уже можуть робити саме те, що нам потрібно і нам не доведеться писати ту саму частину програму, яку вже написав інший програміст. Тобто це перевикористання роботи інших людей. Насправді, в реальному житті програмісти пишуть лише невелику частину програми власноруч, решту підключають як бібліотеку. Ми на цьому уроці теж підключимо бібліотеку для роботи з ІЧ сигналами. Оскільки нам не цікаво обробляти сигнали власноруч, а більше написати функцію, яка вже реагує на прийнятий та оброблений сигнал, то ми підключимо бібліотеку, яка називається IRMP - бібліотека для роботи з ІЧ сигналами. Інший програміст (чи група програмістів) уже помістила в бібліотеку можливість приймати сигнали від пультів таких компаній як Samsung, LG, NEC, Panasonic, Siemens, JVC і багатьох інших. На цьому уроці ми будемо використовувати пульт компанії NEC, але завдяки цій сторонній бібліотеці можна керувати Дроном з будь-якого іншого пульта (наприклад від звичайного телевізора), якщо певним чином модифікувати програму.

Ардуїно дозволяє доволі легко підключати сторонні бібліотеки, використовуючи бокову панель Менеджер Бібліотек. Відкрийте цю панель зліва, введіть в пошуку IRMP і нажміть кнопку Встановити, якщо ще не було раніше встановлено на цьому комп’ютері. Ось так:

Давайте напишемо програму, яка при натисканні 1-ої кнопки на пульту (символ сонця вверх) буде вмикати світлодіод PA5, а 2-ої (символ сонця вниз) – вимикати.

 1#define IRMP_INPUT_PIN PA1
 2#define TIM4 TIM1
 3#define IRMP_SUPPORT_NEC_PROTOCOL 1
 4#define IRMP_USE_COMPLETE_CALLBACK 1
 5#include <irmp.hpp>
 6IRMP_DATA data;
 7
 8void setup() {
 9  pinMode(PA5, OUTPUT);
10  irmp_init();
11  irmp_register_complete_callback_function(&processSignal);
12}
13
14void loop() {
15}
16
17void processSignal() {
18  irmp_get_data(&data);
19
20  if (data.flags == 0) {
21    int button = data.command;
22    if (button == 0) {
23      digitalWrite(PA5, 1);
24    }
25    if (button == 1) {
26      digitalWrite(PA5, 0);
27    }
28  }
29}
 1#define IRMP_INPUT_PIN PA1               //налаштування бібліотеки IRMP
 2#define TIM4 TIM1
 3#define IRMP_SUPPORT_NEC_PROTOCOL 1
 4#define IRMP_USE_COMPLETE_CALLBACK 1
 5#include <irmp.hpp>
 6IRMP_DATA data;
 7
 8void setup() {
 9  pinMode(PA5, OUTPUT);                  //переводимо світлодіод PA5 в режим роботи на ВИХІД
10  irmp_init();                           //запускаємо в роботу бібліотеку IRMP
11  irmp_register_complete_callback_function(&processSignal);//вказуємо яку функцію викликати на прийом сигналу з пульта
12}
13
14void loop() {                    //цикл цього разу пустий, оскільки працювати буде 'processSignal'
15}
16
17void processSignal() {           //функція, яка викликається при прийому сигналу з пульта
18  irmp_get_data(&data);          //запитуємо в IRMP записати в об'єкт data інформацію про отриманий сигнал
19
20  if (data.flags == 0) {         //перевіряємо чи це не випадкове подвійне спрацювання пульта (інколи трапляється)
21    int button = data.command;   //записуємо в змінну button номер кнопки, яка була натиснута на пульті
22    if (button == 0) {           //якщо номер кнопка 0 (тобто 1-ша кнопка -- зверху зліва на пульту)
23      digitalWrite(PA5, 1);      //то вмикаємо світлодіод PA5
24    }
25    if (button == 1) {           //якщо номер кнопки 1 (тобто 2-га кнопка)
26      digitalWrite(PA5, 0);      //то вимикаємо світлодіод PA5
27    }
28  }
29}

Під’єднайте ІЧ модуль до піна PA1 нашого Дрона, завантажте програму на Дрон, понатискайте по черзі дві крайні верхні ліві кнопки на пульту. Чи реагує Дрон на ваші команди, які ми запрограмували в програмі?

Чому в програмі ми порівнювали зчитані кнопки з 0 і 1? Пульт має нумерацію кнопок зверху зліва починаючи з нуля, тобто 1-ша кнопка має код 0, 2-га – 1, 3-тя – 2 і так далі, як на картинці нижче:

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

Модифікуйте програму вище, щоб світлодіод вмикався натисканням на червону кнопку ON, а вимикався – на OFF


Модифікуйте програму вище, щоб при натисканні кнопки STROBE будь-який світлодіод (наприклад PB0) промиготів кілька разів


Модифікуйте програму вище, щоб щоразу при натисканні кнопки Сонце вверх вмикався додатково один світлодіод і так аж поки всі 5 світлодіод не будуть увімкнені. А при натисканні кнопки Сонце вниз вимикались по одному світлодіоду. Тобто 5 натискань 1-ої кнопки мають увімкнути всі світлодіоди, а 5 натискань 2-ої кнопки вимкнуть всі світлодіоди