Робимо просту RC-аероладку

Чому аероладка?

  1. просто;
  2. Дешево;
  3. Вона може рухатися у природних умовах;
  4. Можна налаштовувати різні варіанти управління, включаючи ПІД-регулятор.

Літаючі апарати – це здорово, але складно. У повітрі не можна просто вимкнути гвинти, якщо щось піде не так. Та й питома тяга потрібна дуже пристойна навіть для літаків, не кажучи вже про мультикоптери.

Платформи на кшталт цієї

обертання
(тут є більш докладний опис). вміють рухатися тільки по, як правило, штучної рівної поверхні, та й управління у них сильно відрізняється.

А ось на воді ми можемо плисти будь-куди, що надалі може дати нам можливість зробити автопілот з використанням GPS. Класична конструкція з гребним гвинтом для мене складна вузлом виходу валу з корпусу — не уявляю, як його загерметизувати. Ще переваги повітряного рушія:

  1. Його можна ставити на різні платформи: човен, сани, шматок пінопласту.
  2. Він не зачепиться за дно чи водорості.

Потрібно щоб апарат міг повертати. Є 3 варіанти:

  1. Один гвинт + кермо для поворотів;
  2. Один гвинт + система, що його повертає;
  3. Два жорстко закріплені гвинти. Повертати міняючи їхню тягу — найпростіший спосіб. Його й використав.

Пульт дистанційного керування

Принцип дії

1 джойстик + кілька перемикачів. Завдання пульта – кілька разів на секунду надсилати в ефір дані про положення ручки джойстика та перемикачів.

З чого робити

По-перше, потрібний радіопередавач. Найдешевший варіант - це NRF24L01+, коштує $0.85 По-друге, потрібен джойстик. Ще $1. Кілька перемикачів - $0.12. Ну і все це закріпитина шматку текстоліту за $0.13. Вже нарахували $2.1, а потрібен ще МК та харчування. Тут все не так однозначно. Забігаючи вперед, скажу, що цілком достатньо ATmega8 або STM8S103F3P6, але так як починав цей проект я давно і досвіду було мало, вліпив у пульт управління Arduino Pro Mini, а в човен Arduino Nano (скрізь ATmega32P).

У пульт ще знадобилися:

  1. Перетворювач живлення 0.9 - 5 В -> 5 В для живлення Arduino за $0.35 (роз'єм USB, разом із шматком плати, можна відламати для компактності);
  2. Стабілізатор 3.3 В AMS1117-3.3 для живлення радіомодуля, вони стоять по $0.03 у перерахунку на штуку;
  3. Батарейний відсік для пальчикового акумулятора за $0.15;

Усього плюс $0.53. Крім контролера, пари конденсаторів і проводів, ціна компонентів пульта виходить $2,63.

Начинка радіокерованої моделі

Компоненти

Тут все йде від двигунів. Які двигуни купите, такої потужності електроніку і доведеться ставити, і база (судно, сани) знадобиться відповідної вантажопідйомності. Та й ідеологічно, решта потрібно лише для того, щоб обертати гвинти з потрібною швидкістю. Я купив такі моторчики з пропелерами

просту
по $2.88 за пару. В якості драйвера моторів взяв L293D ще $0.35.

Живлення. Нам знадобиться аж три напруги живлення:

  1. 5 для всієї електроніки крім радіомодуля;
  2. 3.3 для радіомодуля;
  3. для моторчиків скільки їм потрібно (моїм 4.2).

1 та 2 отримаємо також як у пульті управління, а для моторчиків поставимо MT3608 за $0.86.

Тепер найцікавіше: гіроскоп. Модуль MPU-6050 коштує $1.53. Було бажання використовувати ще й акселерометр, щоб під час руху ручки джойстика убік судно розверталося дома. Але вВ результаті від цієї ідеї відмовився: невеликий нахил по тангажу, і система починає думати, що вона прискорюється вперед або назад. Простіше виявилося розвертати судно на місці, просто компенсуючи джойстиком рух вперед/назад.

Додамо до цього $0.4 за батарейний відсік на 2 елементи AA та отримаємо компонентів на $6.4 без контролера та проводів.

І знову підемо від двигунів. Кожен із двох двигунів керований L293D може копати, а може не копати:

  1. Крутити вперед;
  2. Крутити назад;
  3. Чи не крутити.

Щоб код легше читався, напишемо

Тепер ми хочемо керувати швидкістю обертання гвинтів. Звичайно, робитимемо це за допомогою ШІМ. Не знаю, чи можна таку ШІМ зробити апаратно… я зробив програмно на перериваннях. Оголосимо пару глобальних змінних

Нехай значення цих змінних 0 вперед, а якщо вони рівні 0, то крутити не треба.

Тепер, щоб змінити швидкість обертання пропелера, нам треба зробити дві дії:

  1. Записати позитивне, негативне чи нульове значення у motLeft/motRight (модуль не важливий);
  2. Записати "швидкість обертання" в OCR2A/OCR2В.

потрібні щоб човен не витрачав енергію на спробу крутити гвинти записуючи в OCR2x значення менше 5 (вони при цьому все одно не крутяться).

І можна управляти моторчикам просто викликаючи функції setMotLeft(int8_t v) та setMotRight(int8_t v). Але ж ми хочемо керувати човном не так! Ми хочемо давати команди типу «вперед/назад» та «вправо/вліво»! І нехай вона сама розбирається, які пропелери їй для цього куди доведеться крутити. Більше того, хочеться, щоб човен сам компенсував дію вітру, течії і… криво поставлених пропелерів! Підемо тепер з іншого боку. З боку ПДК. У найпростішому випадкуалгоритм його роботи наступний:

  1. При включенні живлення запам'ятати початкове положення джойстика;
  2. У циклі зчитувати положення джойстика, віднімати з нього нульове положення та відправляти дані на човен.

Наш радіомодуль підтримує пакети до 32 байт. Щоб не запам'ятовувати усунення, будемо використовувати запис

На стороні приймача оголосимо такий самий запис і

У функціях setMotRot та setMotForward

І перейдемо до найцікавішого. До того, як перетворити «повертати ліворуч зі швидкістю 5 градусів за секунду і трохи рухатися вперед!» у «лівий двигун 10% тому, правий 20% вперед!». Про те, що таке ПІД регулятори написано досить багато. Я використовував для обертання лише дві складові:

А для руху вперед-назад регулятор не використав. Розберемо на прикладі:

Код спростив, щоб зосередити увагу на важливих частинах, в архіві буде повна версія. 8 Що ж ми тут робимо?

  1. Обчислюємо різницю між реальною швидкістю обертання човна (rot) та бажаною (motRot*rotMaxSpeed);
  2. Обчислюємо бажані швидкості обертання гвинтів motRight та motLeft;
  3. Якщо бажані швидкості обертання перевищують максимально можливі, зменшуємо їх, зберігаючи співвідношення між ними;
  4. Викликаємо вже знайомі нам setMotRight/setMotLeft.

Всі! Це весь алгоритм управління човном! Складно? Мені здається ні. Проте в ході випробувань і налаштувань виникала ціла купа проблем, яка призвела б до численних катастроф, якби це був літальний апарат.

В описаній функції є 4 коефіцієнти:

  1. forwardMult - чутливість до руху джойстика вперед/назад;
  2. rotMaxSpeed ​​- бажана швидкість повороту при нахилі джойстикадо упору вправо/ліворуч;
  3. rotMult - коефіцієнт пропорційної складової (наскільки відхилення поточної швидкості обертання від бажаної впливає на поворот);
  4. iDeltaRotMult - коефіцієнт інтегральної складової (наскільки відхилення поточного кута розвороту від бажаного впливає на поворот).

Ці коефіцієнти налаштовуємо експериментально, і від них залежатиме реакція човна на джойстик і зовнішні впливи, що розгортають.

Індикація стану

При налагодженні/налаштуванні виникатимуть незрозумілі серії «чому човен реагує на джойстик не так, як мені цього хочеться?». Деякі моменти можна налагодити, виводячи налагоджувальну інформацію на ПК, але було б зручніше прямо на місці розуміти, що відбувається. Спочатку я розглядав 2 варіанти:

робимо

Недоліки і того, і іншого зрозумілі: ноутбук великий і його незручно тягати, а дисплей Nokia 5110 не дозволить наочно відобразити одночасно велику кількість параметрів стану човна.

Я взяв щось середнє між ними: Nextion Enhanced NX4827K043 - Generic 4.3'' HMI Touch Display. Завдяки сенсорному дисплею, можна прямо на ходу швидко та зручно налаштовувати параметри човна. Це своєрідний комп'ютер, що складається з:

  1. Мікроконтролера GD32F103R8T6;
  2. SDRAM Winbond W9864G6KH-6 (8 МБ);
  3. Флеш пам'яті Winbond W25Q256FVFG (32 МБ, 100 000 циклів перезапису, що дуже тішить);
  4. ПЛІС Altera MAX II EPM570T144C5N.

Все в зборі виглядає так (клікабельно):

вперед

Цей комп'ютер/дисплей є чорним ящиком і заточений на взаємодію з людиною. Навіть наявний GPIO заточений для підключення кнопок та індикаторів. Їхня ж Expansion Board це підтверджує. Так що використовувати вбудований контролер як пультуправління човном (зчитувати показання джойстика, обмінюватися даними з радіомодулем NRF24L01+) не вийде. Для взаємодії з мікроконтролером є UART та… і все.

Про те, як і що можна робити за допомогою цього дисплея, можна робити написано купа + є ролики на Youtube. Подивіться, наприклад, ось це – там усе зрозуміло показано. Але оскільки цей дисплей коштує дорожче, ніж решта компонентів човна і пульта разом узяті, опишу докладніше свої враження від роботи з ним. Можливо, це комусь допоможе зрозуміти чи підходить йому цей варіант або ноутбук/дисплей Nokia 5110 будуть кращими. Переваги Nextion Enhanced NX4827K043:

  1. Ціна. $50 все-таки дуже багато для 4.3'' дисплея.
  2. Існуючих компонентів мало, налаштувань компонентів мало, як створювати свої незрозуміло. Частково це компенсується функціями малювання примітивів (лінії, прямокутники, кола, .).
  3. Стандартний компонент Gauge мерехтить під час оновлення.
  4. Ні (принаймні я не знайшов) прозорості.
  5. Вимоги до джерела живлення: 4.75-7 В та середній струм 250 мА. При просіданні напруги, дисплей починає блимати.
  6. Тільки UART. Могли б зробити спілкування з ним ще за SPI та I²C.
  7. Виведення GPIO тільки під шлейф (немає гребінки 2,54 мм), немає АЦП.

Загалом, дисплей створює враження дуже якісного виробу, з яким легко та приємно працювати.

Дисплей може виконати відразу дві задачі:

  1. Індикація стану. Мене насамперед цікавлять:
  2. "Швидкості обертання" гвинтів;
  3. Значення змінної iDeltaRot - наскільки бажаний кут розвороту відрізняється від бажаного;
  4. Швидкість обертання човна;
  5. Кут повороту човна;
  6. Частота одержання пакетів від пульта;
  7. Частотавикликів функції motTick.

  • Налаштування параметрів, а саме описаних вище forwardMult, rotMaxSpeed, rotMult, iDeltaRotMult.
  • Зробив 2 сторінки (клікабельні для оцінки якості):

    1. Індикації:
      робимо
    2. Налаштування параметрів:
      просту
      Перші 4 колонки зліва направо: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.

    Відео тесту човна на підлозі:

    Реакція човна на зовнішній вплив, що розвертає, при різних iDeltaRotMult (інтегральних коефіцієнтах):