Создание своего летающего робота

в 10:13, , рубрики: Без рубрики

Примерно год назад было сообщение о конкурсе от КРОК «Летающие роботы». Мне стало интересно поучаствовать и приобрести опыт в конструировании автономного летающего робота. К сожалению, из конкурса пришлось выйти из-за нехватки времени, но интерес к решению проблемы остался. Конкурсное задание, если кратко, заключалось в том, чтобы пролететь от точки A до точки B, пролетев через отверстие в стене, и вернуться.

Создание своего летающего робота

Что и как получилось на данном этапе под катом.

Решение данной задачи, очевидным образом разбивается на две части. Первая — как «пролететь вдоль стенки не натыкаясь на нее», вторая — посадка. Для ориентации робота в пространстве я решила использовать ультразвуковые дальномеры. Получилось, что нужно как минимум 3 датчика (вниз, вперед и влево, вперед и вправо). Посадку планировалось осуществлять с помощью камеры, но до этого дело еще не дошло.

Мне хотелось построить своего робота полностью автономным, со всей логикой на борту. Собственно, вопрос грузоподъемности летательного аппарата, а так же простота в управлении, устойчивость к падениям и невысокая цена привели меня к выбору игрушечного радио-управляемого вертолета с со-осным расположением винтов, модель Hawkspy LT-711. На одном из сайтов заявлялось, что он может поднять груз до 50-ти грамм. И как показал эксперимент, действительно, не полностью заряженный, он спокойно поднял половину стандартной сто-грамовой шоколадки.

Для того, чтобы летать «вдоль стеночки» нужно, прежде всего, уметь держать высоту. Собственно, решение этой подзадачи я и хочу описать в этом посте.

Корпус вертолетика легко снимается и можно сразу увидеть электронику, отвечающую за управление полетом. После пристального изучения платы, оказалось, что можно вклиниться в передачу управляющего сигнала, подключившись между выходом радиоприемника и входом декодера.

Создание своего летающего робота
1 — выход радио-приемника (сигнал, который декодировали); 2 — вход декодера (куда подаем сформированный сигнал); 3 — земля; На обратной стороне платы была перерезана дорожка, соединяющая контакты 1 и 2.

Таким образом можно использовать уже имеющуюся схему управления, а не паять все с нуля. Но для этого необходимо было разобраться с управляющим сигналом, т.е. решить задачу реверс-инжиниринга сигнала.

Создание своего летающего робота

После наблюдения за сигналом я сумела выделить характерные паттерны. На картинке представлен типичный сигнал с разметкой. В итоге стало понятно, что сигнал кодируется довольно просто — четырьмя байтами. Играя с пультом управления и наблюдая изменения сигнала, удалось восстановить, какая часть сигнала за что отвечает. Получилось следующее:

Создание своего летающего робота
lt — включить/выключить лампочки на корпусе вертолетика; sm — turbo-режим;

Самым сложным оказалось угадать контрольную сумму. Выяснилось, что контрольная сумма считается в два этапа — вначале суммируется сигнал по-байтно, а потом у результата суммируются верхняя и нижняя половины байта.

На этом этапе большая часть подготовительных действий были выполнены и пора было приступать к написанию своей прошивки для микроконтроллера. У меня давно валялся микроконтроллер stm32f4discovery и я решила для начала попробовать использовать его. Заметную часть времени заняли установка и настройка окружающей среды. У меня MacOS, поэтому на свой лэптоп пришлось ставить армовский тулчейн с linaro и openocd. За основу был взят и модифицирован один из примеров из библиотеки для работы с переферийными устройствами. В него были перенесены подпрограммы по декодированию и кодированию сигнала. Принятый приемником сигнал декодируется программой микроконтроллера. Управляющие воздействия вверх/вниз, поворот влево/вправо, движение вперед/назад (и другие) представляются в виде отдельных чисел. На этом этапе легко их модифицировать. Далее производится кодирование в исходный формат и передача на штатный декодер вертолетика.

Для решения задачи измерения высоты, использовался ультразвуковой датчик измерения расстояния LV-MAXONAR-EZ0. Датчик подключался к микроконтроллеру через интерфейс UART и выдавал расстояние до предмета в конусе его видимости в дюймах.
Таким образом прошивка выполняла следующее: снимала показания с датчика высоты, и управляла скоростью вращения винтов с помощью ПИД-регулятора.

Создание своего летающего робота

Для отладки работы датчика есть очень удобная тулза для STM-микроконтроллеров, STM Studio, позволяющая следить за значениями переменных не прерывая работу программы. Правда она работает только под Windows, но с прокидыванием USB-устройства (отладочную плату) и установкой драйверов в виртуалку с виндой проблем не возникло (я использовала PD). Сигнал через виртуальную оболочку проходит полностью, без изменений и видимых задержек, таким образом он-лайн наблюдение за поведением датчика сильно облегчило понимание происходящего.

Создание своего летающего робота

Когда дело дошло до пробных полетов, оказалось, что вся добавленная электроника весит больше 50 грамм, поэтому вертолетик взлетал невысоко и почти сразу медленно и печально стремился к земле. Пришлось думать как уменьшить вес всей этой электроники. Распаивать чип самостоятельно на плате для меня не представляется возможным, поэтому проблема решилась заменой отладочной платы на более маленькую и легкую MINI-m4 с тем же чипом. Перепрограммировать прошивку особо не пришлось: заменить пару параметров и поменять имена некоторых используемых пинов.

Создание своего летающего робота

Отладка всей конструкции заключалась в подборе параметров к ПИД-регулятору, но с помощью написания простейшей математической модели вертолета, решенной стандартным методом Эйлера системы дифуров, было понятно, как будет вести себя вертолет. Было понятно, что он будет колебаться и со временем выходить на стационарное состояние. Поэтому подбор параметров для скорейшего выхода из колебательного состояния не занял много времени. В процессе пробных полетов, вертолетик иногда приходилось резко сажать, поэтому понадобилось сменить несколько деталей. К счастью, к этой модели вертолета найти запчасти не составило проблемы. Завершающим шагом, было добавление фильтрации к снимаемым с датчика высоты данным. Во время полета, вертолет время от времени проваливался немного вниз и потом так же резко подлетал вверх. Так что, одним из первых шагов дальнейшего развития будет реализация функции снятия телеметрии. Как оказалось, датчик иногда сбоил и показывал заведомо неверные значения, но добавление фильтрации решило эту проблему.

Для удобства, сейчас у вертолетика два режима. Если джойстик находиться в верхней половине диапазона, то вертолет удерживает высоту один метр, если джойстик в нижней половине, то — это режим посадки.

Код на github

Автор: Gotto

Источник

Поделиться

* - обязательные к заполнению поля