Система автопілотування для радіокерованого вертольота. Частина 2: Перехоплення управління -3
- 11.06.15 3:50 •
- altanium •
- # 259683 •
- Хабрахабр •
- 25 •
- 6678
- такий же як Forbes, тільки краще.
Це продовження статті по розробки системи автопілотування для радіокерованого вертольота.
Так як у мене в плані немає будівництва повноцінного БПЛА, здебільшого це все таки вертоліт з ручним керуванням, і зовсім прибирати з нього приймач я не буду. Тому треба як небудь реалізувати комунікацію між Arduino, радіоприймачем і контролером двигунів.
Насамперед я вирішив розібратися яким чином приймач спілкується з контролером. Раз сервоприводи під'єднати до цього блоку також як і контролер, значить принцип управління моторами такий же як і сервоприводами, в основі якого лежить ШІМ.
Потім я вирішив спробував підчитують значення з виходів приймача.
Розташування контактів на приймачі і контролері двигунів: 1-GND, 2-VCC, 3-сигнал.
Для цього підключаємо виходи сигналу приймача (їх всього 4, верхні 2 - сервоприводи, наступні 2 - для контролю двигунами) до Arduino pin 5,6,7,8, один з входів VCC до 5v Arduino, а один з входів GND до GND arduino . За допомогою функції pulseIn (), що зчитує довжину сигналу на заданому вході, ми отримуємо значення, що видаються приймачем. Максимально відхиляючи важелі на пульті управління я зафіксував необхідні мені значення. Це значення від 1080 до 1800, при цьому видаються значення, коли ручки знаходяться в нормальному стані для крену, тангажу і курсу - 1450, а для газу - 1080.
Скетч досить простий:
Ну, власне здавалося б все, можна вже передавати управління в руки Arduino? З'єднуємо тепер уже контролер двигунів (Arduino pin 5 і 6) і сервоприводи (Arduino pin 7 і 8) з Arduino і пишемо ще один скетч:
Заливаємо, чекаємо, і ось тут то починаються проблеми. По-перше, довго довелося ламати голову над тим, чому контролер включається, але не може відкалібрувати і почати роботу. Через півгодини я знайшов рішення: проблема була в тому, що включається і моргає він при будь-якій напрузі, а ось працювати починає тільки при використанні акумулятора з мінімальним напругою 7.4 Вольт. Взагалі, це навіть пішло на користь, Arduino дуже навіть добре харчується і працює від акумулятора через контролер, і не доведеться ставити один акумулятор на управління а інший на контролер двигунів (Зазвичай для контролера стоїть потужний акумулятор з великою ємністю і напругою 11.1V, а на управлінні акумулятор невеликої ємності (850 мАг) і напруги 7.4V).
Підключаємо батарею, пробуємо знову. Знову просто блимає. На вирішення цієї проблеми пішло години 3. Виявляється, щоб контролер заробив, йому потрібно якимось чином при включенні повзаімодействовать з приймачем. Як саме, мені поки не вдалося дізнатися, можливо приймач посилає в нього якісь особливі значення. Щоб це вирішити, підключаємо до Arduino ще і приймач (Arduino pin 9,10,11,12), зчитуємо з нього значення надходять з пульта, і передаємо їх контролеру:
Заливаємо, підключаємо, працює!
Тепер приймач підключений до контролера через Arduino, який перехоплює сигнал і відправляє на потрібний канал контролера. Навіть незважаючи на те, що сигнал змінюється (зазвичай значення зменшується на 15-20 одиниць), вертоліт навіть виходить підняти в повітря.
Тепер додаємо до Arduino кнопку, коли вона затиснута включається автоматичне керування.
Щоб передати управління Arduino, необхідно підключити акумулятор, почекати поки індикатор на контролері не почне постійно горіти, а потім можна в принципі навіть відключити приймач, тому що після ініціалізації контролер може вже працювати без приймача.
У цьому прикладі за допомогою циклу (для плавності ходу сервоприводу) змінюється кут нахилу лопатей. Надалі, цим же способом буде здійснюватися управління вертольотом в польоті.
Ви можете допомогти і перевести трохи коштів на розвиток сайту
Прочитав обидві ваші статті про зачатки (вибачте, але поки це так) автопілота. Хочу відразу застерегти, для автопілота ви не обійдетеся одним гіроскопом, поясню чому. Гіроскоп має властивість брехати при інтегруванні його показань. На ру вертольоти дійсно ставлять одновісним head lock гіроскопи (align gp780 наприклад). Вони потрібні для стабілізації тільки за рисканню. На жаль, мої знання по ТАУ і автопілот моделей зокрема говорять, що автопілоту необхідно знати кути нахилу корпусу, що не дає гіроскоп.
Можливо вам допоможе код стабілізації multiwii, там є вертолітний режим, однак він не призначений для соосной 2х роторної схеми вертольота і вам доведеться трохи подумати.
Ще є певна ймовірність, що коду, написаного в такому стилі (з використанням бібліотек arduino) може не вистачити швидкодії для серйозного автопілота. Той же multiwii не використовує, наприклад, функцій pulseIn.
P.S. Я не хочу чіплятися, але хочеться дізнатися, чому мотори називаються правим і нижнім?
Servo rightmot;
Servo nizmot;
P.P.S. Хотілося б так само, що б Ви зробили форматування коду, відступи поставили.
P.P.P.S. Ви молодець і вибрали цікаву тему, але варто викладати на Хабре кроки побільше, ніж скетчі по Дриганов сервами. Такі речі є на arduino.cc
Тут не тільки гіроскоп. Ще GPS з частотою оновлення 1 Гц (зараз я правда угробив антену, але чекаю поки прилетить інший на 5 Гц) і барометр (такий-сякий висотомір). Спочатку мотори були верхній нижній тому на контролері виходи розташовуються один вище іншого :). А потім один був перейменований в правий, тому що це канал відповідає за поворот вправо-вліво, а другий так і залишився нижнім, тому що цей канал - відповідає за підйом вгору-вниз. Спасибі, але це скоріше скетч по рухатися двигунами через контролер швидкості. Як на мене це було найскладніше і найважливіше.
P.S. Вношу пропозицію назвати в майбутньому по тому, що серва / мотор роблять, наприклад rollServo, pitchServo, yawMotor, throttleMotor. Може бути так буде зручніше.
Все, тепер зрозумів.
Так, я про це ж і кажу 1 Гц мало, тому замовив приймач на 5 гЦ.
Ну, власне, ідея в тому, щоб долетіти вручну до якоїсь точки, зафіксувати показання GPS, і в подальшому порівнювати поточний стан з зафіксовані раніше, і вже з цього орієнтуватися як треба діяти далі. Якщо ми лівіше точки, летимо направо (якщо перелетимо, летимо наліво, і так до нескінченності). Для приміщення це не підходить, а ось, наприклад, для великого простору де небудь в поле, в самий раз. Навіть якщо похибка зависання буде до метра, мене це цілком влаштує.
З цим я вже розібрався, до цього я не розбирався взагалі яким чином управляються мотори і сервопривід на ру моделях, тепер розумію, звичайний ШІМ.
Спасибі, хороша ідея назвати каналии за їх призначенням, так і зроблю.
Ви мене вибачте, звичайно, але завдання управління рухомими об'єктами дуже багатогранна і універсального рішення поки немає. Є ПІД, а й у нього є проблеми. Справа в тому, що я займаюся цим завданням у своїй науковій роботі. Якщо ви вирішили таке завдання, то поділіться з науковим співтовариством.
Крім того перед вами постане завдання фільтрації показань ваших датчиків. Не забудьте також про те, що без знання того, як ви повернені відносно горизонту ви не зможете навіть літати по точкам, а горизонт ви не зрозумієте без акселерометра.
Знову ж якщо летіти вліво (беру ваш приклад) то на яке значення відхиляти серв? Максимально вліво - перевернетеся.
Шим найпростіше з усього вашого проекту.
Чи не перевернуся, перевіряв. Чим далі від точки тим більше вліво, у міру наближення до неї зменшуючи кут нахилу сервоприводу. Все це треба буде виводити експериментально. Я не зовсім розумію фразу «повернути щодо горизонту». Це свідчення компаса? Якщо так, то ці свідчення також видаються GPS приймачем (він видає курс і швидкість). Зрештою, поставити акселерометр - не проблема.
я говорю про кути крену і тангажа, які дуже важливі. компас лише допоміжний прилад для визначення вартості рисканья, як акселерометр для визначення крену і тангажа.
Чим далі від точки тим більше вліво, у міру наближення до неї зменшуючи кут нахилу сервоприводу.
А на скільки менше? Це П регулятор? П регулятори не завжди легко налаштувати, особливо на таких рухомих об'єктах, як вертольоти. Знаю, що навіть на роботах, що їздять по лінії воліють часто ставити ПІ регулятор.
Взагалі я можу запропонувати вам почекати продовження, де розповім про це. Але так вже й бути. Якщо ми в потрібній точці то кут нахилу сервоприводу умовно дорівнює 0 (кут 0 це той кут при якому в повній відсутності вітру вертоліт зависає на місці. Він підганяється за допомогою тріммера на пульті). Для сервоприводів цього вертольота це кут десь в районі 90 градусів, значення видається приймачем приблизно дорівнює 1450. Якщо ми відхилилися від цієї точки, то значення кута збільшується або зменшується в залежності від того в яку сторону ми відхилилися. Якщо нам потрібна точність в метр, то максимальний кут відхилення сервоприводу досягається тоді коли ми в метрі від точки. Я можу звичайно помилятися, але якщо модель зносить вітром, вона ж не обов'язково повинна змінювати свій кут нахилу відносно горизонту? І що ж тоді виходить, модель в ідеально рівно положенні зноситься в сторону, а вся система думає що вертоліт досі знаходиться в одній точці? А ось GPS приймач відмінно ці зміни засікає, і з його допомогою легко положення коригувати. Знову ж таки, давайте я про все розповім коли статтю допишу, все таки ви не знаєте як ця система зараз виглядає і працює, а виправляти мене ще до того як побачите результат це марно. Потім лайте скільки хочете, я, власне, не проти.