Делаем радиоуправление для самолета


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


    Как и чем управлять


    Нормальные люди берут приемник, втыкают в него сервомашинки, регулятор скорости, двигают рычажки на пульте и радуются жизни не задаваясь принципами работы и не углубляясь в подробности. В нашем случае такое не пройдет. Первой задачей стало узнать каким макаром управляются сервомашинки. Все оказывается достаточно просто, у привода есть три провода: + питания, — питания и сигнальный. На сигнальном проводе прямоугольные импульсы изменяемой скважности. Чтобы понять что это такое смотрим картинку:

    Итак, если мы хотим установить привод в крайнее левое положение нужно слать импульсы длительностью 0,9мс с интервалом 20мс, если в крайнее правое — длительность 2,1мс, интервал тот же, ну со средними положениями аналогично. Как оказалось, регуляторы скорости управляются аналогично. Те, кто в теме скажут что это обычный ШИМ, который реализовать на любом микроконтроллере — плевое дело. Вот и я так решил, купил в местном магазине сервомашинку и склепал на макетке для нее так называемый сервотестер на ATtiny13. И тут оказалось, что ШИМ не совсем простой, а с подводными камнями. Как видно из вышеприведенной диаграммы, скважность (отношение длительности импульса к длительности периода) от 5% до 10% (в дальнейшем я за крайние положения принимаю импульсы длительностью 1,0мс и 2,0мс) для 256-значного ШИМ счетчика ATtiny13 это соответствует значениям от 25 до 50. Но это при условии, что на заполнение счетчика уйдет 20мс, а на деле так не получится и для частоты 9,6МГц и предделителя 1024 нужно ограничить счетчик значением 187(ТОР), в таком случае у нас получится частота 50,134Гц. В большинстве (если не во всех) сервомашинок нету точного генератора опорной частоты и поэтому частота управляющего сигнала может немного плавать. Если оставить ТОР счетчика 255, то частота управляющего сигнала будет 36,76Гц — на некоторых приводах оно будет работать (возможно с глюками), но далеко не на всех. Итак, теперь у нас 187-значный счетчик, для него 5-10% соответствуют значениям от 10 до 20 — всего 10 значений, немного дискретно получится. Если думаете поиграть с тактовой частотой и предделителем ниже привожу сравнительную табличку для 8-битного ШИМа:


    Но ведь у большинства микроконтроллеров есть 16-битный (и больше) таймер для генерации ШИМ. Здесь проблема с дискретностью сразу пропадет еще и частоту можно точно выставить. Долго расписывать не буду, сразу даю табличку:


    Я не думаю, что для китайской сервомашинки есть существенная разница в 600 и 1200 значений, поэтому вопрос с точностью позиционирования можно считать закрытым.

    Многоканальное управление


    С одной сервомашинкой разобрались, но для самолета их нужно минимум три и еще регулятор скорости. Решение «в лоб» — взять микроконтроллер с четырьмя каналами 16-битного ШИМ, но такой контроллер будет стоять дорого и, скорее всего, займет много места на плате. Второй вариант — запилить программный ШИМ, но занимать процессорное время — это тоже не вариант. Если снова посмотреть на диаграммы сигнала, то 80% времени он не несет никакой информации, поэтому рациональнее было бы ШИМом задавать только сам импульс 1-2мс. Почему скважность изменяется в таких узких пределах, ведь проще было бы и формировать и считывать импульсы со скважностью хотя бы 10-90%? Зачем нужен тот неинформативный кусок сигнала занимающий 80% времени? Я заподозрил, что, возможно, эти 80% могут занимать импульсы для других исполнительных механизмов, а потом этот сигнал разделяется на несколько разных. То есть, в периоде длительностью 20мс могут уместится 10 импульсов длительностью 1-2мс, затем этот сигнал каким-то демультиплексором разделяется на 10 различных с длительностью периода как раз 20мс. Сказано — сделано, нарисовал в PROTEUS такую схемку:

    В роли демультиплексора — 74HC238, на его вход E подаются импульсы с выхода микроконтроллера. Эти импульсы — ШИМ с периодом 2мс (500Гц) и скважностью 50-100%. У каждого импульса своя скважность, обозначающая состояние каждого канала. Вот так выглядит сигнал на входе Е:

    Для того, чтобы 74HC238 знал на какой выход подать текущий сигнал используем PORTC микроконтроллера и входы A, B, C демультиплексора. В результате на выходах получаем такие сигналы:

    Сигналы на выходе получаются правильной частоты (50Гц) и скважности (5-10%). Итак, нужно генерировать ШИМ частотой 500Гц и заполнением 50-100%, вот табличка для настройки предделителя и ТОР 16-битного счетчика:

    Интересно, что возможное количество значений ШИМа ровно в 1000 раз меньше частоты таймера.

    Программная реализация

    Для ATmega8 с тактовой частотой 16МГц в AtmelStudio6 все реализуется следующим образом: вначале задефайним значения счетчика для крайних положений сервомашинок:
    #define LOW 16000U
    #define HIGH 32000U
    

    затем инициализируем генератор ШИМа на таймере/счетчике1:
    OCR1A = HIGH; //Устанавливаем ТОР
    TCCR1A = 0<<COM1A1 | 0<<COM1A0 | 1<<COM1B1 | 0<<COM1B0 | 0<<FOC1A | 0<<FOC1B | 1<<WGM11 | 1<<WGM10; //Запускаем неинвертированный Fast PWM на выходе OC1B с верхним значением счетчика, которое записанно в OCR1A
    TCCR1B = 0<<ICNC1 | 0<<ICES1 | 1<<WGM13 | 1<<WGM12 | 0<<CS12 | 0<<CS11 | 1<<CS10; //предделитель 1
    TIMSK = 1<<OCIE1A | 1<<OCIE1B | 0<<TOIE1; //Разрешаем прерывания по совпадению
    

    Остается реализовать прерывания:
    ISR(TIMER1_COMPA_vect) //прерывание по достижению верхнего значения счетчика, непосредственно перед началом следующего импульса
    {
            //c_num- переменная, обозначающая номер текущего канала, channels - массив значений каналов
    	if (c_num <= 7)
    	{
    		OCR1B = channels[c_num];
    	}
    	else
    	{
    		OCR1B = 0; //отключаем ШИМогенератор для несуществующих в демультиплексоре 8 и 9 канала
    	}
    	
    }
    
    ISR(TIMER1_COMPB_vect, ISR_NOBLOCK)// прерывание возникающее в конце импульса
    {
    	if (c_num <= 7)
    	{
    		PORTC = c_num; //для каналов 0-7 выводим номер канала на PORTC
    	}
    
    	//и изменяем значение счетчика от 0 до 9
    	if (c_num >= 9)
    	{
    		c_num = 0;
    	}
    	else
    	{
    		c_num++;
    	}
    }
    

    Глобально разрешаем прерывания и готово, забивая в channels значения от LOW до HIGH изменяем значения на каналах.

    Реализация в железе


    Ну с теорией разобрались, пришло время все это реализовать. Мозгом системы выбран микроконтроллер ATmega8A, тактируется от кварца на 16МГц (не потому, что я захотел 16000 позиций сервомашинки, а потому, что у меня такие валялись). Управляющий сигнал для МК будет поступать через UART. В результате получилась вот такая схемка:

    Спустя некоторое время появилась вот такая платка:


    Два трехштыревых разъема я не припаял потому, что они мне не нужны, а не подряд они впаяны поскольку у меня нету металлизации отверстий, а в нижнем разъеме дорожки с двух сторон, можно было бы заменить проволочкой, но программно нету проблемы выводить сигнал на любой разъем. Также отсутствует 78L05 ибо в моем регуляторе двигателя есть встроенный стабилизатор (ВЕС).
    Для получения данных к плате подключается радиомодуль HM-R868:

    Изначально думал втыкать его прямо в плату, но эта конструкция не помещалась в самолетик, пришлось сделать через шлейф. Если изменить прошивку, то контакты разъема для программирования можно использовать для включения/отключения каких-нибудь системам (бортовые огни и т.п.)
    Плата обошлась примерно в 20грн = $2.50, приемник — 30грн = $3,75.

    Передающая часть


    Самолетная часть есть, осталось разобраться с наземной аппаратурой. Как уже писалось ранее, данные передаются по UART, на каждый канал по одному байту. Вначале подключал свою систему проводом через переходник к компьютеру и команды слал через терминал. Чтобы дешифратор определял начало посылки, а в будущем выделял посылки адресуемые именно ему, вначале шлется байт-идентификатор, затем 8 байт определяющих состояние каналов. Позже стал использовать радиомодули, при отключении передатчика все моторчики начинали дико дергаться. Дабы отфильтровать сигнал от шумов, десятым байтом шлю XOR всех 9 предыдущих байт. Помогло, но слабо, добавил еще проверку на таймаут между байтами, если он превышается — вся посылка игнорится и прием начинается заново, с ожидания байта-идентификатора. С добавлением контрольной суммы в виде XOR слать команды с терминала стало напряжным, поэтому я побыстрому наклепал вот такую программку с ползунками:

    Число в нижнем левом углу — контрольная сумма. Передвигая ползунки на компе двигались рули на самолете! Вообщем отладил я все это и стал думать о пульте ДУ, купил для него вот такие джойстики:
    image
    Но потом меня посетила одна мысль. В свое время я тащился от всяких авиасимуляторов: «Ил-2 Штурмовик», «Lock On», «MSFSX», «Ка-50 Черная Акула» и др. Соответственно был у меня джойстик Genius F-23 и решил я прикрутить его к вышеописанной проге с ползунками. Погуглил как это реализовать, нашел этот пост и получилось! Управлять самолетиком с помощью полноценного джойстика, мне кажется, гораздо круче, чем маленькой палочкой на пульте. Вообщем все вместе изображено на первой фотке — это нетбук, джойстик, преобразователь на FT232, и подключенный к нему передатчик HM-T868. Преобразователь подключается 2м кабелем от принтера, что позволяет закрепить его на каком нибудь дереве или чем-то подобном.

    Пуск!


    Итак, есть самолетик, есть радиоуправление — Поехали!(с) Первый полет производился над асфальтом, результат — сломанный пополам фюзеляж и полувырванный двигатель. Второй полет производился над более мягкой поверхностью:

    Последующие полетов 10 были тоже не особо удачными. Основной причиной я считаю сильную дискретность джойстика — по крену он выдавал только 16 значений (вместо возможных 256), с осью тангажа — не лучше. Но так как в результате испытаний самолет был значительно поврежден и не подлежит ремонту:

    — проверить правдивость этой версии пока не представляется возможным. В пользу этой версии говорит и зафиксированная на видео попытка выровнять самолет — он летит накрененным, а потом резко заваливается в противоположную сторону (а должен плавно). Вот более наглядное видео:

    Дальность действия аппаратуры — примерно 80м, дальше тоже ловит, но через раз.
    Ну вот и все, благодарю за внимание. Надеюсь, приведенная информация окажется для кого-то полезной. Буду рад ответить на все вопросы.
    В архиве схема и разводка платы для Протеуса.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 20

      +4
      Что сделал — молодец, но утверждение про дорогой контроллер это ты погорячился — советую познакомиться с кортексами — там можно на один таймер настроить несколько шимов — таймер себе тикает, а внутренняя логика на каждом канале отвечает за дергание ножек при определенных событиях — сравнения например, все аппаратно происходит, еще можно настроить DMA и тогда можно менять скважность ШИМ просто записавая в нужную переменную другое число
        –1
        Знаком с STM32, в данном случае считаю «из пушки по воробьям», да и корпуса не самые паябельные.
          0
          за ~200р ставить топорный контроллер вместо однобаксового какогонить stm32f100 — это из пушки по воробьям? нормальные вполне корпуса для лута
            +1
            Там, где я затариваюсь, мега8+74нс238 и самый дешевый ф100 стоят одинаково. Пушкой я называю кучу неиспользованных ног и еще большую кучу памяти. В данном случае единственный плюс АРМов — JTAG.
              0
              расширяемость, легкая переносимость кода, удобство программирования, более правильная архитектура, больше периферии, вдруг захочется еще чем то нафаршировать самолет
                +1
                Захочется нафаршировать — придется менять плату, ибо делать порты и с запасом — только лишний вес. Все остальное в данном проекте на 200строк — не актуально, даже чтобы сохранить настройки в энергонезависимую память — приходится огород городить ибо флеш, а не еепром. Я не раздуваю холивар AVR vs ARM, я обосновываю выбор процессора для конкретного устройства.
                  0
                  более правильная архитектура

                  А какой от этого, простите, толк?
                  +1
                  И то, плюс сомнительный. За 10 лет программирования разных МК пользовался им один раз 5 минут.
            0
            Молодца, а с гироскопом поэксперементирвать? Чтобы самолет на прямой сам выравнивался.
              +1
              тут нужно познакомиться с ПИД регуляторами если кому то интересно — тема классная вообще
                0
                У меня есть два разбитых вертолета, у одного транзистор сгорел и немного дорожки опалил, а другой разобран, могу отдать это все в дар, если кому пригодится буду только рад.
                К ним же пульты управления есть!
                  0
                  Отписался в личку =)
                0
                Сейчас строю квадрокоптер, там и поэкспериментируем.
                +2
                Стиками всё же удобнее рулить. Судя по первому видео — есть некоторые проблемы с ориентацией в пространстве, но это у всех новичков так. Я в Reflex XTR тренировался, получается сильно дешевле, чем даже на пенолёте :)

                Что же с аппаратурой — приёмники dsm2 стоят около 5 долларов у китайцев, надо только 1 раз потратиться на пульт. Ваш вариант скорее подошёл бы для обратного канала автопилота, и вот тут могу порекомендовать www.electronshik.ru/card/kontroller-flymaple-a-flight-controller-with-10-dof-imu-117797 — отличная платформа. 3-осевые гироскоп, акселерометр, компас, и ещё барометр есть. Стоит, конечно, довольно много, зато полный комплект датчиков + stm32 на борту. Есть пара uart для подключения GPS приёмника, даунлинка или ещё чего нибудь. i2c для коптероводов тоже есть. Я медленно и печально (ибо лень) портирую paparazzi на неё.
                  0
                  новая отладка от ST — которая под f3 с магнетометром, гироскопом — не помню есть ли акспелерометр, вроде есть — стоит гораздо дешевле — там даже пример кода есть HID — через гироскоп управлять курсором на экране
                    0
                    www.terraelectronica.ru/catalog_info.php?ID=1001&CODE=1075935 — эта? Клёвая, да, но здоровая и тяжёлая. Можно на ней отладиться, а потом сделать что-то похожее на FlyMaple, но я вот не уверен, что осилю столь тонкие дорожки. Приходится переплачивать за неправильную кривизну рук :(
                  0
                  А скорости передатчика хватит чтобы все сигналы пропихнуть?
                    0
                    Стоит 9600бод — хватает вполне, задержки не заметно.
                    +3
                    Начинание супер! Но всё же, для начала есть смысл просто научиться летать. На том, что точно работает и работает «как надо». Радио начального уровня то стоит не дорого, Для первых двух — пяти самолётов будет достаточно дешёвого Hobby King 2.4Ghz 6Ch.

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

                    Свои кустарные системы радиоуправления мне, честно говоря, страшно отправлять в воздух. Для обратной связи пользуюсь своим модулем, который в основном работает на синей изоленте, но управлять дешевле получается с готовых продуктов.
                      +5
                      Честно говоря, мне не так хотелось научится летать, как просто сделать свою систему. Лично мне большее удовольствие доставляет процесс создания, чем эксплуатации))

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое