Керування Дроном

Вступ

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

Послідовний інтерфейс (Serial)

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

Щоб почати спілкуватися через послідовний інтерфейс, треба спочатку встановити з’єднання. Для цього потрібно виконати 2 кроки:

  1. З’єднати кабелем комп’ютер з Дроном
  2. Відкрити канал комунікації і домовитись про швидкість спілкування

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

Давайте напишемо програму для Дрона, яка буде зчитувати показники з кнопки і відправляти на комп’ютер чи натиснута кнопка чи ні

 1void setup() {
 2  Serial.begin(115200);
 3  delay(1000);
 4
 5  pinMode(PA4, INPUT);
 6}
 7
 8void loop() {
 9  int button = digitalRead(PA4);
10  Serial.println(button);
11  delay(100);
12}
 1void setup() {         //Функція 'setup' виконується першою при запуску Дрона і лише раз
 2  Serial.begin(115200);//починаємо комунікацію зі швидкістю 115200 бітів (14 кілобайт) на секунду
 3  delay(1000);         //відкриття каналу комунікації потребує трохи часу, тому почекаємо 1 секунду
 4
 5  pinMode(PA4, INPUT); //переводимо пін PA4 кнопки A в режим роботи на вхід, щоб зчитувати кнопку
 6}
 7
 8void loop() {                    //функція 'loop' виконується циклічно і безкінечно
 9  int button = digitalRead(PA4); //зчитуємо чи натиснута кнопка і записуємо в змінну 'button'
10  Serial.println(button);        //відправляємо стан кнопки через серійний (послідовний) інтерфейс
11  delay(100);                    //додаємо 100мс павзи і починаємо все заново
12}

Завантажте програму на Дрон. Тепер потрібно в середовищі розробки Ардуїно відкрити панель, яка називається Монітор порту. Це невеличка панель, яка дозволяє і отримувати повідомлення від Дрона, і відправляти повідомлення на Дрон.

Тепер на Дроні понатискайте кнопку А і поспостерігайте за реакцією на панелі. Які повідомлення приходять від Дрона коли натискаєте і відпускаєте кнопку?

Функція Serial.begin(115200) встановлює з’єднання з комп’ютером на швидкості 115200 біт на секунду, це приблизно 14 кілобайт на секунду. Це було б занадто повільно, якби нам потрібно було переслати фотографію чи фільм, але для обміну текстовими повідомленнями цього більш ніж достатньо. Функція Serial.println("hello") вже власне відправляє текстові повідомлення з Дрона.

Давайте тепер зовсім трохи модифікуємо програму, щоб на комп’ютер приходили повідомлення з командою наприклад jump, тобто – стрибати.

 1void setup() {
 2  Serial.begin(115200);
 3  delay(1000);
 4
 5  pinMode(PA4, INPUT);
 6}
 7
 8void loop() {
 9  int button = digitalRead(PA4);
10  if (button == 0) {
11    Serial.println("jump");
12  }
13  delay(100);
14}
 1void setup() {         //Функція 'setup' виконується першою при запуску Дрона і лише раз
 2  Serial.begin(115200);//починаємо комунікацію зі швидкістю 115200 бітів (14 кілобайт) на секунду
 3  delay(1000);         //відкриття каналу комунікації потребує трохи часу, тому почекаємо 1 секунду
 4
 5  pinMode(PA4, INPUT); //переводимо пін PA4 кнопки A в режим роботи на вхід, щоб зчитувати кнопку
 6}
 7
 8void loop() {                   //функція 'loop' виконується циклічно і безкінечно
 9  int button = digitalRead(PA4);//зчитуємо чи натиснута кнопка і записуємо в змінну 'button'
10  if (button == 0) {            //якщо кнопка натиснута
11    Serial.println("jump");     //значить відправляємо відповідне повідомлення з командою стрибати
12  }
13  delay(100);                   //додаємо 100мс павзи і починаємо заново цикл
14}

Завантажте програму на Дрон, обов’язково натисніть хрестик справа від Монітор порту, щоб закрити вкладку Монітор порту. Тепер нажміть кнопку ‘Приєднати Дрон як геймпад’ нижче, оберіть перший пункт в новому вікні і підтвердьте вибір. Тепер Ваш Дрон під’єднаний до веб-сторінки з уроком як керуючий пристрій, за допомогою якого можна наприклад грати в ігри. Випробуйте його в грі Маріо.



Dino Chrome Online Game Sprite 1 Dino Chrome Online Game Sprite 2
Самостійна робота №1

Модифікуйте програму вище, щоб можна було стрибати не лише кнопкою А, а також і B. Тобто кнопка B також має відправляти команду jump

Модифікуйте програму вище, щоб кнопкою А можна було так само стрибати, але тепер щоб кнопка B відправляла команду down

Керування Дроном з комп’ютера

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

Для відправки повідомлень (команд) з комп’ютера треба, щоб виконалися додатково 2 речі:

  1. Власне, щоб ми з комп’ютера відправили повідомлення
  2. Щоб Дрон слухав і був готовий прийняти повідомлення

Давайте поглянемо на прикладі наступної програми як це зробити

 1void setup() {
 2  Serial.begin(115200);
 3  delay(1000);
 4  pinMode(PB0, OUTPUT);
 5  Serial.println("Привіт. Я - Дрон, чекаю твоїх команд");
 6}
 7
 8void loop() {
 9  if (Serial.available() > 0) {
10    String command = Serial.readString();
11    command.trim();
12    if (command == "PB0 вкл") {
13      digitalWrite(PB0, 1);
14      Serial.println("Світлодіод увімкнено, господарю");
15    }
16    if (command == "PB0 викл") {
17      digitalWrite(PB0, 0);
18      Serial.println("Світлодіод вимкнено, господарю");
19    }
20  }
21  delay(100);
22}
 1void setup() {            //Функція 'setup' виконується першою при запуску Дрона і лише раз
 2  Serial.begin(115200);                                   //починаємо комунікацію
 3  delay(1000);                                            //чекаємо встановлення з'єднання
 4  pinMode(PB0, OUTPUT);   //переводимо пін PB0 в режим роботи на вихід - щоб керувати світлоідодом
 5  Serial.println("Привіт. Я - Дрон, чекаю твоїх команд"); //Відправляємо привітання на комп'ютер
 6}
 7
 8void loop() {
 9  if (Serial.available() > 0) {           //перевіряємо чи надійшло щось через серійний інтерфейс
10    String command = Serial.readString(); //якщо так, то зчитуємо це і записуємо в стрічку 'command'
11    command.trim();                       //прибираємо непотрібні символи
12    if (command == "PB0 вкл") {           //якщо прийшов текст 'PB0 вкл'
13      digitalWrite(PB0, 1);               //значить вмикаємо світлодіод
14      Serial.println("Світлодіод увімкнено, господарю");//і звітуємо комп'ютеру про виконану задачу
15    }
16    if (command == "PB0 викл") {          //а якщо прийшов текст 'PB0 викл'
17      digitalWrite(PB0, 0);               //значить вимикаємо світлодіод
18      Serial.println("Світлодіод вимкнено, господарю");//і теж звітуємо комп'ютеру про виконання
19    }
20  }
21  delay(100);                             //чекаємо 100мс і все заново
22}

Завантажте програму на Дрон, перейдіть на панель Монітор порту, введіть в поле Повідомлення текст PB0 вкл і натисніть Enter на клавіатурі в полі з текстом

Чи виконав Дрон команду надіслану Вами з комп’ютера?

Кілька нюансів, які варто пояснити. В цій програмі окрім всього іншого ми робимо наступні дії:

  1. Створюємо з’єднання з комп’ютером та надсилаємо привітання як перше повідомлення
  2. В циклі loop постійно перевіряємо чи не прийшло нового повідомлення
  3. Якщо повідомлення прийшло, то функцією trim на самому повідомленні видаляємо невидимі непотрібні символи в тексті, який отримали. Це все тому, що коли в Ардуїно ввести в стрічці команду і натиснути Enter, то Ардуїно автоматично додасть ці непотрібні символи і відправить на Дрон уже змінене повідомлення. Функція trim потрібна саме, щоб обрізати ці символи і таким чином отримати на Дроні саме те повідомлення, яке Ви відправляли
Самостійна робота №2

Модифікуйте програму вище, щоб замість світлодіоду PB0 вмикався і вимикався по команді будь-який інший світлодіод. Також додайте в повідомлення про звіт виконання який саме світлодіод увімкнувся чи вимкнувся

Підключіть пропелер до піна PA6 і модифікуйте програму таким чином, щоб вмикався і вимикався тепер саме пропелер