Примерно год назад было сообщение о конкурсе от КРОК «Летающие роботы». Мне стало интересно поучаствовать и приобрести опыт в конструировании автономного летающего робота. К сожалению, из конкурса пришлось выйти из-за нехватки времени, но интерес к решению проблемы остался. Конкурсное задание, если кратко, заключалось в том, чтобы пролететь от точки 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 с тем же чипом. Перепрограммировать прошивку особо не пришлось: заменить пару параметров и поменять имена некоторых используемых пинов.
Отладка всей конструкции заключалась в подборе параметров к ПИД-регулятору, но с помощью написания простейшей математической модели вертолета, решенной стандартным методом Эйлера системы дифуров, было понятно, как будет вести себя вертолет. Было понятно, что он будет колебаться и со временем выходить на стационарное состояние. Поэтому подбор параметров для скорейшего выхода из колебательного состояния не занял много времени. В процессе пробных полетов, вертолетик иногда приходилось резко сажать, поэтому понадобилось сменить несколько деталей. К счастью, к этой модели вертолета найти запчасти не составило проблемы. Завершающим шагом, было добавление фильтрации к снимаемым с датчика высоты данным. Во время полета, вертолет время от времени проваливался немного вниз и потом так же резко подлетал вверх. Так что, одним из первых шагов дальнейшего развития будет реализация функции снятия телеметрии. Как оказалось, датчик иногда сбоил и показывал заведомо неверные значения, но добавление фильтрации решило эту проблему.
Для удобства, сейчас у вертолетика два режима. Если джойстик находиться в верхней половине диапазона, то вертолет удерживает высоту один метр, если джойстик в нижней половине, то — это режим посадки.
Автор: Gotto