Детектор падіння

Вступ

Сучасні дрони окрім прямої функції літати мають ще дуже багато допоміжних функцій і захисних систем, які дозволяють робити це ще і безпечно для оточуючих, оператора і навіть для себе. Наприклад, сучасні цивільні дрони мають систему оминання перешкод, яка заставить дрон оминути наприклад гілку дерева, якщо оператор сам випадково її не помітив. Або ж ще дрони мають датчик наближення на “пузі”, який не дозволить врізатися в землю. На цьому уроці ми створимо одну з захисних систем для Дрона, яка вимкне пропелер у разі аварійного падіння.



Дуже часто дрони падають, особливо при навчанні операторів і це нормально. Деякі падіння бувають не критичні (якщо з невеликої висоти) і можна продовжувати польоти. Інші падіння бувають серйознішими. В будь-якому випадку при падінні можна запобігти більшим пошкодженням дрона якщо швидко вимкнути пропелери. Це тому, що часто дрони падають в траву або на бік на землю, а в цей час пропелери продовжують крутитися оскільки оператор не встиг зреагувати і не віддав команду вимкнути пропелери. В цей час пропелери, які крутяться зі швидкістю 30 000 обертів на хвилину можуть завдати шкоди в першу чергу самим собі і зламатися. Тому важливо аби дрон міг сам розпізнати аварійне падіння і вимкнути пропелери за долі секунди. Адже найкращий оператор не може змагатися з комп'ютером у швидкості реакції.

Пропелер

На другому уроці ми вже запускали пропелер з кнопки. Давайте пригадаємо той приклад. Під’єднайте пропелер до піна PA6 і запрограмуйте Дрон наступною програмою:

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

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

Датчик вібрації

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

 1void setup() {
 2  pinMode(PA6, OUTPUT);
 3
 4  pinMode(PA0, INPUT);
 5  attachInterrupt(PA0, reaction, CHANGE);
 6}
 7
 8void loop() {
 9}
10
11void reaction() {
12  tone(PA6, 500, 300);
13}
 1void setup() {          //Функція 'setup' виконується першою при запуску Дрона і лише раз
 2  pinMode(PA6, OUTPUT); //Переводимо пін PA6 пищалки в режим роботи на вихід
 3
 4  pinMode(PA0, INPUT);  //Переводимо пін PA0 детектора вібрації на вхід
 5  attachInterrupt(PA0, reaction, CHANGE); // Нова функція, яку розглянемо нижче
 6}
 7
 8void loop() {          //Функція 'loop' виконується циклічно і безкінечно одразу після 'setup'
 9}
10
11void reaction() {      //Наша власна функція реакції на вібрації, виконується окремо від 'loop'
12  tone(PA6, 500, 300); //На піні PA6 відтворюємо писк на частоті 500Гц впродвож наприклад 300мс
13}

Підключіть пищалку до піна PA6, а датчик вібрації – до піна PA0. Запрограмуйте Дрон програмою вище. Тепер підніміть Дрон над поверхнею стола на кілька сантиметрів і відпустіть, щоб Дрон впав на стіл. Спробуйте ще кілька разів. Якщо не подобається частота пищання чи можливо закоротка тривалість, то змініть ці параметри в програмі вище і запрограмуйте Дрон заново.

Давайте більше детально розглянемо, що робить програма вище. У функції setup проводимо всі попередні налаштування:

  1. Оскільки нам треба керувати пищалкою, значить переводимо пін PA6 в режим роботи на вихід
  2. Оскільки ми хочемо зчитувати показники з датчика вібрації на піні PA0, то переводимо його в режим роботи на вхід
  3. Нова функція Ардуїно, яку ми вивчимо на цьому уроці це attachInterrupt. Це функція, яка дозволяє уникнути постійного виклику digitalRead в циклі loop. Як бачите, цього разу функція loop в нас навіть вийшла пустою. Натомість функція attachInterrupt сама зчитає показники з датчика вібрації і викличе нашу власну функцію reaction на спрацювання датчику. Все, що нам залишається це написати, що саме ми хочемо зробити всередині функції reaction

Функція attachInterrupt приймає 3 параметри:

  1. Номер піна, на якому треба зчитати сигнал
  2. Назва функції, яку потрібно викликати в разі спрацювання сигналу
  3. Тип сигналу, на який треба викликати функцію спрацювання reaction. В даному випадку ми використали тип CHANGE (тобто на будь-яку ЗМІНУ сигналу). Бувають ще такі типи як LOW, HIGH, FALLING, RISING, але їх ми не будемо розглядати на даному уроці
Самостійна робота №1

В програмі вище змініть реакцію Дрона в разі падіння на мигання світлодіоду, наприклад світлодіоду PA7 чи будь-якого іншого або ж всіх одразу.

Падіння Дрона

Тепер ми плавно підійшли до написання нашої системи захисту Дрона від падіння.

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

Нічого нового в цій програмі немає, лише все, що ми вже дізналися на цьому та попередніх уроках. Тому на детальному поясненні зупинятися не будемо. Завантажте нову програму на Дрон. Запустіть пропелер кнопкою A і киньте Дрон з висоти кількох сантиметрів. Яка реакція?

Щоб точно пересвідчитись, що все працює завдяки програмі, спробуйте видалити стрічку номер 6 в програмі. Завантажте нову програму на Дрон. Чи є реакція на падіння тепер?

Ось так не дуже складно ми створили систему захисту Дрона від падіння. Звичайно ця програма не може повністю врятувати Дрон від падіння, але точно знизить можливі наслідки від падіння. Якби дрон впав не на “живіт”, а наприклад перевернувся і при цьому пропелер не вимкнувся, то наслідки були б набагато гіршими: пропелери погнулися б і підлягали б лише заміні на нові – дуже недешеві.

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

Підключіть датчик вібрації не до піна PA0, а до піна PA1 або PA11. Змініть програму вище, щоб вона так само працювала і для датчика вібрації на піні PA1 чи PA11

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

Модифікуйте програму вище, додавши наступні додаткові функції:

  1. Окрім вимкнення пропелера увімкніть мигання будь-якого світлодіоду. Це буде як додатковий сигнал, що сталося аварійне падіння
  2. При натисканні кнопки B потрібно зупиняти це аварійне мигання світлодіоду
  1. Мигання потрібно здійснювати з функції loop
  2. Треба створити змінну, яка буде означати чи потрібно мигати світлодіодом
  3. Задавати значення змінної треба з функції reaction
  4. А в циклі loop перевіряти чи значення змінної каже, що треба мигати
  5. В циклі loop також треба зчитувати чи натиснута кнопка B і якщо так – записувати в змінну, що більше не треба мигати

Ось приклад відео з екскурсії в Чорнобильську зону відчуження з падінням дрона:

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

  • reaction (рєакшн) – реакція
  • button (батн) – кнопка
  • attach (етеч) – під’єднати
  • change (чейндж) – зміна
  • interrupt (інтерапт) – переривання (переривання на спрацювання)
  • pressed (пресд) – натиснутий