Робимо просту RC-аероладку
Чому аероладка?
- просто;
- Дешево;
- Вона може рухатися у природних умовах;
- Можна налаштовувати різні варіанти управління, включаючи ПІД-регулятор.
Літаючі апарати – це здорово, але складно. У повітрі не можна просто вимкнути гвинти, якщо щось піде не так. Та й питома тяга потрібна дуже пристойна навіть для літаків, не кажучи вже про мультикоптери.
Платформи на кшталт цієї

А ось на воді ми можемо плисти будь-куди, що надалі може дати нам можливість зробити автопілот з використанням GPS. Класична конструкція з гребним гвинтом для мене складна вузлом виходу валу з корпусу — не уявляю, як його загерметизувати. Ще переваги повітряного рушія:
- Його можна ставити на різні платформи: човен, сани, шматок пінопласту.
- Він не зачепиться за дно чи водорості.
Потрібно щоб апарат міг повертати. Є 3 варіанти:
- Один гвинт + кермо для поворотів;
- Один гвинт + система, що його повертає;
- Два жорстко закріплені гвинти. Повертати міняючи їхню тягу — найпростіший спосіб. Його й використав.
Пульт дистанційного керування
Принцип дії
1 джойстик + кілька перемикачів. Завдання пульта – кілька разів на секунду надсилати в ефір дані про положення ручки джойстика та перемикачів.
З чого робити
По-перше, потрібний радіопередавач. Найдешевший варіант - це NRF24L01+, коштує $0.85 По-друге, потрібен джойстик. Ще $1. Кілька перемикачів - $0.12. Ну і все це закріпитина шматку текстоліту за $0.13. Вже нарахували $2.1, а потрібен ще МК та харчування. Тут все не так однозначно. Забігаючи вперед, скажу, що цілком достатньо ATmega8 або STM8S103F3P6, але так як починав цей проект я давно і досвіду було мало, вліпив у пульт управління Arduino Pro Mini, а в човен Arduino Nano (скрізь ATmega32P).
У пульт ще знадобилися:
- Перетворювач живлення 0.9 - 5 В -> 5 В для живлення Arduino за $0.35 (роз'єм USB, разом із шматком плати, можна відламати для компактності);
- Стабілізатор 3.3 В AMS1117-3.3 для живлення радіомодуля, вони стоять по $0.03 у перерахунку на штуку;
- Батарейний відсік для пальчикового акумулятора за $0.15;
Усього плюс $0.53. Крім контролера, пари конденсаторів і проводів, ціна компонентів пульта виходить $2,63.
Начинка радіокерованої моделі
Компоненти
Тут все йде від двигунів. Які двигуни купите, такої потужності електроніку і доведеться ставити, і база (судно, сани) знадобиться відповідної вантажопідйомності. Та й ідеологічно, решта потрібно лише для того, щоб обертати гвинти з потрібною швидкістю. Я купив такі моторчики з пропелерами

Живлення. Нам знадобиться аж три напруги живлення:
- 5 для всієї електроніки крім радіомодуля;
- 3.3 для радіомодуля;
- для моторчиків скільки їм потрібно (моїм 4.2).
1 та 2 отримаємо також як у пульті управління, а для моторчиків поставимо MT3608 за $0.86.
Тепер найцікавіше: гіроскоп. Модуль MPU-6050 коштує $1.53. Було бажання використовувати ще й акселерометр, щоб під час руху ручки джойстика убік судно розверталося дома. Але вВ результаті від цієї ідеї відмовився: невеликий нахил по тангажу, і система починає думати, що вона прискорюється вперед або назад. Простіше виявилося розвертати судно на місці, просто компенсуючи джойстиком рух вперед/назад.
Додамо до цього $0.4 за батарейний відсік на 2 елементи AA та отримаємо компонентів на $6.4 без контролера та проводів.
І знову підемо від двигунів. Кожен із двох двигунів керований L293D може копати, а може не копати:
- Крутити вперед;
- Крутити назад;
- Чи не крутити.
Щоб код легше читався, напишемо
Тепер ми хочемо керувати швидкістю обертання гвинтів. Звичайно, робитимемо це за допомогою ШІМ. Не знаю, чи можна таку ШІМ зробити апаратно… я зробив програмно на перериваннях. Оголосимо пару глобальних змінних
Нехай значення цих змінних 0 вперед, а якщо вони рівні 0, то крутити не треба.
Тепер, щоб змінити швидкість обертання пропелера, нам треба зробити дві дії:
- Записати позитивне, негативне чи нульове значення у motLeft/motRight (модуль не важливий);
- Записати "швидкість обертання" в OCR2A/OCR2В.
потрібні щоб човен не витрачав енергію на спробу крутити гвинти записуючи в OCR2x значення менше 5 (вони при цьому все одно не крутяться).
І можна управляти моторчикам просто викликаючи функції setMotLeft(int8_t v) та setMotRight(int8_t v). Але ж ми хочемо керувати човном не так! Ми хочемо давати команди типу «вперед/назад» та «вправо/вліво»! І нехай вона сама розбирається, які пропелери їй для цього куди доведеться крутити. Більше того, хочеться, щоб човен сам компенсував дію вітру, течії і… криво поставлених пропелерів! Підемо тепер з іншого боку. З боку ПДК. У найпростішому випадкуалгоритм його роботи наступний:
- При включенні живлення запам'ятати початкове положення джойстика;
- У циклі зчитувати положення джойстика, віднімати з нього нульове положення та відправляти дані на човен.
Наш радіомодуль підтримує пакети до 32 байт. Щоб не запам'ятовувати усунення, будемо використовувати запис
На стороні приймача оголосимо такий самий запис і
У функціях setMotRot та setMotForward
І перейдемо до найцікавішого. До того, як перетворити «повертати ліворуч зі швидкістю 5 градусів за секунду і трохи рухатися вперед!» у «лівий двигун 10% тому, правий 20% вперед!». Про те, що таке ПІД регулятори написано досить багато. Я використовував для обертання лише дві складові:
А для руху вперед-назад регулятор не використав. Розберемо на прикладі:
Код спростив, щоб зосередити увагу на важливих частинах, в архіві буде повна версія. 8 Що ж ми тут робимо?
- Обчислюємо різницю між реальною швидкістю обертання човна (rot) та бажаною (motRot*rotMaxSpeed);
- Обчислюємо бажані швидкості обертання гвинтів motRight та motLeft;
- Якщо бажані швидкості обертання перевищують максимально можливі, зменшуємо їх, зберігаючи співвідношення між ними;
- Викликаємо вже знайомі нам setMotRight/setMotLeft.
Всі! Це весь алгоритм управління човном! Складно? Мені здається ні. Проте в ході випробувань і налаштувань виникала ціла купа проблем, яка призвела б до численних катастроф, якби це був літальний апарат.
В описаній функції є 4 коефіцієнти:
- forwardMult - чутливість до руху джойстика вперед/назад;
- rotMaxSpeed - бажана швидкість повороту при нахилі джойстикадо упору вправо/ліворуч;
- rotMult - коефіцієнт пропорційної складової (наскільки відхилення поточної швидкості обертання від бажаної впливає на поворот);
- iDeltaRotMult - коефіцієнт інтегральної складової (наскільки відхилення поточного кута розвороту від бажаного впливає на поворот).
Ці коефіцієнти налаштовуємо експериментально, і від них залежатиме реакція човна на джойстик і зовнішні впливи, що розгортають.
Індикація стану
При налагодженні/налаштуванні виникатимуть незрозумілі серії «чому човен реагує на джойстик не так, як мені цього хочеться?». Деякі моменти можна налагодити, виводячи налагоджувальну інформацію на ПК, але було б зручніше прямо на місці розуміти, що відбувається. Спочатку я розглядав 2 варіанти:

Недоліки і того, і іншого зрозумілі: ноутбук великий і його незручно тягати, а дисплей Nokia 5110 не дозволить наочно відобразити одночасно велику кількість параметрів стану човна.
Я взяв щось середнє між ними: Nextion Enhanced NX4827K043 - Generic 4.3'' HMI Touch Display. Завдяки сенсорному дисплею, можна прямо на ходу швидко та зручно налаштовувати параметри човна. Це своєрідний комп'ютер, що складається з:
- Мікроконтролера GD32F103R8T6;
- SDRAM Winbond W9864G6KH-6 (8 МБ);
- Флеш пам'яті Winbond W25Q256FVFG (32 МБ, 100 000 циклів перезапису, що дуже тішить);
- ПЛІС Altera MAX II EPM570T144C5N.
Все в зборі виглядає так (клікабельно):

Цей комп'ютер/дисплей є чорним ящиком і заточений на взаємодію з людиною. Навіть наявний GPIO заточений для підключення кнопок та індикаторів. Їхня ж Expansion Board це підтверджує. Так що використовувати вбудований контролер як пультуправління човном (зчитувати показання джойстика, обмінюватися даними з радіомодулем NRF24L01+) не вийде. Для взаємодії з мікроконтролером є UART та… і все.
Про те, як і що можна робити за допомогою цього дисплея, можна робити написано купа + є ролики на Youtube. Подивіться, наприклад, ось це – там усе зрозуміло показано. Але оскільки цей дисплей коштує дорожче, ніж решта компонентів човна і пульта разом узяті, опишу докладніше свої враження від роботи з ним. Можливо, це комусь допоможе зрозуміти чи підходить йому цей варіант або ноутбук/дисплей Nokia 5110 будуть кращими. Переваги Nextion Enhanced NX4827K043:
- Ціна. $50 все-таки дуже багато для 4.3'' дисплея.
- Існуючих компонентів мало, налаштувань компонентів мало, як створювати свої незрозуміло. Частково це компенсується функціями малювання примітивів (лінії, прямокутники, кола, .).
- Стандартний компонент Gauge мерехтить під час оновлення.
- Ні (принаймні я не знайшов) прозорості.
- Вимоги до джерела живлення: 4.75-7 В та середній струм 250 мА. При просіданні напруги, дисплей починає блимати.
- Тільки UART. Могли б зробити спілкування з ним ще за SPI та I²C.
- Виведення GPIO тільки під шлейф (немає гребінки 2,54 мм), немає АЦП.
Загалом, дисплей створює враження дуже якісного виробу, з яким легко та приємно працювати.
Дисплей може виконати відразу дві задачі:
- Індикація стану. Мене насамперед цікавлять:
- "Швидкості обертання" гвинтів;
- Значення змінної iDeltaRot - наскільки бажаний кут розвороту відрізняється від бажаного;
- Швидкість обертання човна;
- Кут повороту човна;
- Частота одержання пакетів від пульта;
- Частотавикликів функції motTick.
Зробив 2 сторінки (клікабельні для оцінки якості):
- Індикації:

- Налаштування параметрів:Перші 4 колонки зліва направо: forwardMult, rotMult, iDeltaRotMult, rotMaxSpeed.

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