Радиокот :: радиоуправление самолетом на mrf49xa
Радиоуправление самолётом в MRF49XA
Привет всем!
С удовольствием делюсь с вами своим опытом создания самодельного цифрового радиоуправления самодельным самолетом. Эта статья предназначена в основном для тех, кто недавно начал изучать микроконтроллеры и жаждет создать свою собственную летающую игрушку.
Как начинающему радиолюбителю мне еще со школы хотелось научиться создавать радиоуправление. Данная область привлекала возможностью своими руками создавать интересные игрушки с редкими функциями, вроде запуска ракеты с лодки на озере, электромеханической руки у машинки для перетаскивания грузов, или еще чего.
Нашлось время для хобби в нынешние дни — вот и решил исполнить детскую мечту. Вспомнил навыки паяния, почитал про схемотехнические основы в П.Хоровиц У.Хилл «Искусство схемотехники», попрактиковался с микроконтроллерами, и взялся за дело.
Итак, что же должно представлять из себя радиоуправление.
Во-первых, это управляющий радиосигнал. Полистав многие статьи из советских радиолюбительских журналов, мне стало ясно что там люди изрядно заморачивались темой передачи, приема радиоволн, настройки антенн, чувствительности приемников, и т.д. Конечно, без радиоволн тут никуда. Но если по серьезному, то данную тему нельзя изучить по-быстрому. Она требует отдельного и очень глубокого изучения, вплоть до физического и математического фундамента. Было бы легче, если б выучился я на радиофаке или физфаке… Но ситуация другая. Заморачиваться физикой радиоволн я не захотел. Да и нет большой нужды, ведь КПД самодельной аппаратуры достаточно невысок зачастую. Без грамотности в этих вопросах, да и дома на коленке сложно хорошо отладить приемник и передатчик. Вдобавок мне захотелось, чтобы самолет слал какую-то телеметрию, хотя бы самую простую, а значит передача должна идти в оба конца, и при этом команды от обоих передатчиков не должны смешиваться в эфире, а четко различаться обоими. Это еще больше усложняет ситуацию.
Выход был найден через использование компактных чипов-радиотрансиверов. Их особенность в высокой экономичности (по потерям энергии), по чувствительности према(т.е. дальности действия), не нужно сильно заморачиваться с радиопередачей, и вдобавок не нарушите законы об разрешенных для любителей радиочастотах и предельных мощностях передатчиков.
В моем случае я решил попытать счастья с MRF49XA. Кто-то скажет, что с ним работать несколько неудобно. В общем-то, есть свои недостатки, но не так уж все мрачно. В принципе подойдет. Да и как показывает практика команды уверенно принимаются с расстояния 200-220 метров (специально замерял). Вполне подойдет для самолета летающего в зоне визуальной видимости пилота.
Во-вторых, пульт управления должен уметь преобразовывать движения рук пилота в радиокоманды, (т.е. кодировать управление пилота) а бортовой приемник понимать эти команды и на их основе управлять моторами (т.е. декодировать), лампочками, или еще чем.
Т.е. пульт и приемник превращаются по-сути в два миникомпьютера. Для этих целей я использовал микроконтроллеры PIC18F4431 для приемника и PIC18F2550 для пульта. Первый взял потому, что начитался про его Power PWM модуль, т.е. улучшенный модуль ШИМ-генераторов. И хотя у него аж целых 8 ножек для PPWM, как выяснилось из datasheet, все ж генераторов только 4 (по две ноги на каждый). ШИМ сигналы нужны для управления оборотами несущего двигателя, а так же сервомашинками, двигающими рули и элероны. На большинство самолетов нужен набор: один несущий мотор, два сервомотора для двух элеронов на крыльях, и по одному сервомотору на рули высоты и направления на хвосте. И того требуется 5 ШИМ сигналов (по одному на каждый мотор). Сначала была идея отдельно управлять элеронами по-отдельности (так и сталось в прошивках), хотя как стало ясно позже на практике для элеронов вполне достаточно иметь единый сигнал для двух моторов. Но изначально я захотел иметь 5 ШИМ сигналов и еще 3 запасных для возможных расширений функциональности. Т.е. всего требовалось 8 разных ШИМ сигналов. Но для этого их генерацию пришлось реализовывать самому в прошивке, и замечательный Power PWM остался не у дел. Это все выяснилось уже после того, как мне привезли PIC18F4431. Но девать было некуда, вот и решил пустить его в ход, тем более, что ножек там с запасом — можно пофантазировать.
А что касается PIC18F2550, то тут привлекла возможность приделать к пульту USB разъем, и чтобы управлять самолетом можно было с компьютера нажатием на клавиши. Весьма оригинально, на мой взгляд. Хотя и не очень практично, как выяснилось. Однако, если развивать эту тему и создать не просто самолет, а беспилотник, который будет сам летать по GPS или ГЛОНАСС, то такой USB разьем пригодится для передачи с компа на самолет координат точек в пространстве, через которые он должен пролететь. Согласитесь, интересно…
<b>В-третьих</b>, понимать движения рук рук пилота пульт должен через джойстики и регуляторы (вроде переменных простых резисторов). Джойстики нужны непосредственно для управления положением рулей самолета, а регуляторы для подстройки средних положений этих рулей, т.е. положений, в которые они встают, когда пилот отпускает джойстики. Иногда ведь бывает, что руль при изготовлении настроен не идеально, и немноrо приподнят или опущен, либо в полете выясняется, что самолет немного кренит в какую-нибудь сторону, и чтобы компенсировать, надо чуть-чуть подстроить рули.
Я использовал джойстики такого вида. Они аналоговые. Подводишь напряжение, и на двух ножках джойстики выдают напряжения от земли до уровня питания, соответствующие осям X и Y.
В качестве регуляторов я использовал обычные переменные резисторы. Замечали, что у нах три ножки? Вот если к двум крайним подвести питание, то на средней напряжение будет меняться в зависимости от положения ручки. Т.е. резистор будет выступать в роли регулируемого делителя напряжения. Круто? Не то слово. Замечательная вещь… Здесь только надо не переборщить с сопротивлением резистора. Как видно ниже на схеме, я его напрямую подключал к аналоговой ножке микроконтроллера. А у нее входное сопротивление не бесконечное. И если взять слишком высокоомный переменный резистор, это небесконечное сопротивление будет сказываться в виде нелинейности зависимости выходного напряжения регулятора от положения его ручки. Я сначала пробовал использовать 100 КОм, и напряжение менялось от нуля до максимума лишь на 30 градусах поворота ручки. Неудобно. Если взять слишком мало, то будет пустая нагрузка на батарею питания, т.к. через регуляторы постоянно будет течь большой никому не нужный ток. В схеме ниже я использовал резисторы на 5 КОм. Работает отлично. Но народ часто использует 10 КОм в заводской аппаратуре, как я понял из одного разобранного покупного пульта. К тому же, в джойстиках что я использовал так же применяются 10 КОм-ные переменные резисторы. Не пробовал с ними. Надо попробовать. Думаю, линейность не испортится, а вот нагрузка на батарею немного спадет.
Моя уникальная особенность, которую вы не найдете в магазинных самолетах, — это возможность запускать ракеты с самолета. Зажечь ракету можно, открыв транзистор, который в течение нескольких секунд подает большой ток на бортовую батарею. Затем можно использовать кусок тонкой нихромовой нити длиной несколько сантиметров, скрученный в пружину на швейной игле (в форме пружины она будет нагреваться гораздо лучше). Нажимаю на кнопку, она раскаляется докрасна и сгорает. Китайские пиротехнические ракеты легко воспламеняют свой фитиль. Возможно применение китайских пиротехнических ракет. Однако я еще не испытал функциональность этого сайта, поэтому не могу давать советы на основании этого. Одно могу сказать точно: нужно быть очень осторожным, потому что ракета со стабилизатором полетит только вверх (но стабилизатор тяжелый и неудобный для самолета), а без него полетит по непредсказуемой траектории (эти ракеты делают на кривошипе в Китае, и никто не может гарантировать, что струя газа будет толкать ракету прямо) и может привести к самым негативным последствиям. Я бы не советовал с этим связываться. Однако эту функциональность также можно развить для подбрасывания манекена бомбы или чего-то еще и использования механизма, такого как электромагнит, для удержания или отпускания манекена бомбы в качестве груза. Здесь тоже нужно быть осторожным, поскольку отпирание транзистора может привести к короткому замыканию бортовой батареи. Мгновение спустя ток уже не будет ограничен магнитным полем электромагнита, он резко возрастет, и это закончится плачевно. Сгорит транзистор, или испортится аккумулятор, или, что еще хуже, он взорвется (обычно это происходит с литий-полимерными аккумуляторами). В этом случае следует быть предельно осторожным.
СХЕМЫ АППАРАТУРЫ:
Вот схемы получившихся устройств.
Розетка :
Дистанционный передатчик управления :
Про обозначения на схеме:
MD — Main Drive, т.е. несущий двигатель самолета.
EL — Элероны, т.е. управляющие ими сервомоторы.
TH — Tail Height, т.е. сервомотор хвостового руля высоты.
TT — Tail Turn, т.е. сервомотор хвостового руля направления.
Джойстик J1 управляет элеронами по оси X и рулем высоты по оси Y. Джойстик J2 управляет рулем направления по оси X, а ось Y осталась неиспользованной.
Регулятор MD-P2 управляет скоростью вращения несущего мотора. Регуляторы EL-P1, TT-P3, TH-P4 регулируют среднее положение рулей самолета. Да, для обоих элеронов я все-таки использовал общее значение. Практика показывает, что этого вполне достаточно. А для раздельной подстройки мне не хватило еще одной подходящей аналоговой ножки у PIC18F2550.
Кнопка S7-OnOff включает и выключает несущий мотор самолета. Если выключен, то не работает, если включен, то вращается со скоростью, выставленной в MD-P2. Если включен, то загорается зеленый светодиод.
Кнопка S5-Adj включает и выключает режим подстройки среднего положения рулей. При включении загорается желтый светодиод, и считываются значения с регуляторов. При выключении считывание прекращается, и последние считанные данные записываются в энергонезависимую EEPROM память микроконтроллера. При включении пульта эти значения считываются из памяти и используются при управлении. Так сделано с той задумкой, чтобы лишний раз не настраивать среднее положение рулей при каждом включении, ведь при транспортировки пульта ручки могут сдвинуться. Правда, это и не удобно для подстройки рулей во время полета самолета. Вопрос вкуса…
Кнопка S6-Rock запускает условную ракету (т.е. открывает мощный МОП транзистор IRF630N на борту самолета).
Кнопка S8-Max запускает несущий двигатель на максимальные обороты на время нажатия. При отпускании кнопки обороты возвращаются на значение выставленное в MD-P2. Мне показалось, это будет полезным при взлете. Правда, как выяснилось, не всегда контроллеры бесколлекторных моторов справляются со столь резким перепадом оборотов. Иногда вообще не реагируют. Таким образом, данную величину лучше менять плавно.
Сначала я пытался сохранить передачу радиосигнала. Отправлял пакеты только тогда, когда значение изменялось на определенную величину по сравнению с предыдущим. Однако, возможно, что изменение положения джойстика или ручки управления может не дойти до приемника, если пульт находится далеко. Поэтому я решил сделать это простым, но более надежным способом. Независимо от того, изменилось ли напряжение на контроллерах и джойстиках или нет, микроконтроллер циклически измеряет его и немедленно сообщает об этом приемнику. В результате двигатели будут вращаться точнее, реагировать быстрее и надежнее передавать информацию на приемник.
Питание устройства осуществляется от 9-вольтовой батарейки Duracell типа «Крона». Стабилизаторы LM78M05 используются для питания пульта дистанционного управления напряжением 5 вольт на входе. LM1117-3.3 используется для питания MRF49XA напряжением 3,3 вольта. Следует отметить, что MRF49XA довольно хорошо работает с 5 вольтами. Первая версия моего приемника питалась именно так. Он все еще работает спустя шесть месяцев и независимо от того, сколько раз я его запускал.
M RF49XA по умолчанию имеет двухпроводную линию питания. В результате прочтения статей Blaze и этого блога я решил использовать штырь в качестве антенны. В даташитах описан балун (из балансного — небалансный) из двухпроводной линии питания антенны в однопроводную. В этом случае волновое сопротивление 50 Ом будет наилучшим для приема и передачи. Я думаю, что самое простое и подходящее решение — это четвертьволновой штырь. Согласно им, его сопротивление составляет где-то около 40 Ом. Для этого радиопередатчика я выбрал максимально возможную несущую частоту; т.е. чтобы лучи прямой видимости проходили дальше на частоте 915 МГц. Это связано с тем, что чем выше частота, тем дальше посылается сигнал в пределах прямой видимости, а также с тем, насколько сложно преодолевать препятствия. В схеме для Balun используются значения из Datasheet. В качестве антенны я использовал кусок провода с четвертью длины волны. Для 915 МГц это примерно 82 мм.
Далее… Главный недостаток MRF49XA, на мой взгляд, это его маленький буфер приема — всего 2 байта. Думаю, авторы чипа считали, что при приеме микроконтроллер должен считывать приходящий пакет по байту-двум за цикл. Но в моем случае ситуация сложнее. ШИМ я реализовал логически простым способом: ставим единицу на одну ШИМ-ножку, ждем нужное время длительности сигнала, и переводим в ноль, а затем следующую ножку аналогично, и так по циклу. Управляющий ШИМ для моторов в классическом понимании представляет из себя цифровой импульс длительностью от 1 до 2 миллисекунд, повторяющийся с периодом в 20 миллисекунд. Период может быть другим. Если взять меньший, то моторы чуть быстрее реагировать будут, если побольше, то медленнее. А вот длительность импульса — та самая управляющая величина. Так вот длительность одного главного цикла меняется в пределах от 5 миллисекунд до 10 миллисекунд (5 ШИМ-ножек, по 1-2 мсек на каждую). Т.е. если пульт будет посылать байты чаще, чем по 2 в 10 мсек, то скорее всего они будут теряться. Таким образом, за один цикл мы можем посылать не более 2-х байт. Сначала я хотел посылать пакеты по 4 байта: байт номера устройства — упрощенный аналог IP адреса, байт номера функциональности (которой выставляем значение), байт самого значения, и байт чексуммы — число битов в первых трех байтах. Но безуспешно повозившись с этой затеей, забил и сделал просто по 2 байта: байт номера функциональности, и байт значения.
Значение каждой функциональности меняется в интервале от 0 до 100 (т.е. измеряемое с джойстиков значение напряжения в логике микроконтроллера меняется по шкале от 0 до 100), причем принятое значение 0x00 считается за непринятый пустой байт и всегда отбрасывается. Передаваемое значение 0 кодируется и декодируется как 101. Это позволило избавиться от ситуации, когда второй байт теряется и не доходит, а принятое значение 0 заставляет мотор резко «прыгать» в нуль.
Номера функциональностей меняются от 110 до 200. Остальные значения байта считаются зарезервированными.
В частности, у моего оборудования были некоторые проблемы с телеметрией, которые я не смог решить. Пакеты от приемника к пульту, похоже, идут криво. Кроме того, я разработал два приемника. Пакеты были успешно отправлены в обоих направлениях обоими из них. В любом случае, ни один из приемников не может отправить пакет на пульт, несмотря на то, что функции и библиотеки прошивки одинаковы. Порты ввода/вывода настроены правильно. Перед первым байтом всегда идет номер больше 100, но меньше 250. С чем это связано? Я понятия не имею. Я поменял модуль передатчика для пульта только один раз (старый глючил) и проблема сохранилась. В общем, сплошная загадка.
Передача по USB так же осуществляется командами по 2 байта аналогично. Значения также меняются от 0 до 100, а номера функциональностей от 0x60 до 0x71. Правда, кодирование нуля тут отсутствует — USB и так передает надежно. Протокол передачи я использовал CDC. Мне понравилась идея общаться с устройством через COM порт на компе. Это удобнее, чем с HID, на мой взгляд. Особенно из-за несложной привязки методов к event-ам прихода на комп пакета. Прогу для компа писал на .NET с Windows Forms. Главный недостаток CDC устройства это найти для него драйвер. Себе на комп я когда-то поставил, но где взял и как делал, не помню. Сейчас найти не могу…
Желающим повозиться в HID в коде имеются заготовки. По крайней мере, устройство полностью определяется компом.
Код для USB и HID протоколов брал из семплов официальной библиотеки MLA компании Microchip.
Ниже представлены фотографии получившихся устройств.
Приемник:
Дистанционное управление :
Правда, приемник на фото первой версии — на нем отсутствует LM1117-3.3. Второй версии уже стоит на самолете.:)
На микроконтроллер PIC18F4431 пришлось поставить самодельный минирадиатор, выпиленный из радиатора от старой видеокарты. Уж больно греется он. Для этих же целей частоту тактовую использовал не максимальную в 40МГц (10МГц * PLL), а частоту самого кварца в 10МГц. Падение производительности неощутимо, а вот греться стал существенно меньше.
Микроконтроллеры программировали с помощью Pickit3.
Мы улучшили штифт на джойстике, чтобы он поворачивался более точно и плавно.
САМОЛЕТ:
Несколько слов о самолете. Делал модель Cessna 150 из потолочной плитки толщиной 3мм по известным урокам Сергея Шевырина «Изготовление Цессны из Потолочки». Вот чертежи к нему. Кстати, отдельное спасибо Сергею! Замечательные уроки! Вот только не полностью раскрытым остался вопрос выкоса двигателя. Любознательным рекомендую почитать про это тут.
Составная электронная часть самолета:
— Несущий двигатель EMAX CF2822. Для такого самолета вполне подходит, но, я бы сказал, предельный вариант по мощности для данной модели. Менее мощный мотор точно брать тут не стоит.
— Воздушный винт использую композитный APC 9×4.7 (на пределе возможностей используемого двигателя).
— Сервомоторы TowerPro Microservo SG90.
— Регулятор не знаю какой на 30 ампер. Недорогой, но пашет хорошо.
— Аккумулятор 3-х баночный в 12V на 1000 мА/ч. Не очень емкий, но зато относительно легкий.
Самолет получился тяжеловат — 533 грамма. Но мотор на максимальных оборотах вполне тянет его вертикально вверх.
Вот фото:
Для обдува теплоотвода приемника (где греется PIC18F4431) перед пропеллером имеется специальное окошко.
ЗАМЕЧАНИЯ ОТ АВТОРА:
1) Если переделать самодельный ШИМ на приемнике, чтобы одновременно все ножки в единицу ставил, а потом выключал каждую в нужный момент, то можно будет уменьшить интервал посыла пакетов, и тогда и доработать под 4 и более байтовые пакеты, если надо. Но вообще рекомендую nRF24L01 с антенной. Они имеют буфер приема в 32 байта (можно разгуляться) и за счет усилителя мощности передают на расстояние до километра по прямой. Тогда заодно и телеметрия заработать должна (в моем случае). В перспективе можно поиграться и с LoRa (Long Range) радиотрансиверами вроде Semtech SX1272. Но там тоже придется учиться с ним работать.
Пожалуйста, не связывайтесь с джойстиками Arduino, которые я использовал. Вибрации настолько грубые, что ими можно управлять самолетом. Ими трудно управлять. Используйте дешевый радиопульт, откройте его, и вы будете поражены его джойстиками. С переменными резисторами принцип тот же. Джойстики имеют гораздо лучший дизайн, они гораздо точнее и удобнее. Кроме того, коробка для пульта дистанционного управления будет подходящим корпусом для устройства.
3) Управлять самолетом сложно. Сейчас часто используют гироскопические стабилизаторы. Я не пробовал, но думаю, что это поможет стабилизировать самолет в полете. Я предлагаю вам попробовать.
В большинстве магазинов на панелях управления самолетов есть специальный разъем для подключения к компьютеру. Прежде чем запускать настоящий самолет, можно потренироваться на симуляторе. Очень удобно для начинающих. В любом случае, я не стал делать этот разъем сам. В результате вам придется с самого начала тренироваться на настоящем самолете. Поэтому я рекомендую вам сделать более простой и маленький самолет, чем тот, который предлагает Сергей Шевырин. Неопытные полеты привели к тому, что мне с трудом удалось отремонтировать самолет с размахом крыла 110 сантиметров.
Этого количества ножек микроконтроллера PIC18F2550 недостаточно для разумной панели. Чтобы получить 44 ножки, я рекомендую использовать его удлиненный аналог PIC18F4550. Как вариант, вместо светодиодов можно прикрутить ЖК-дисплей со всеми его возможностями. Кроме того, есть некоторые недостатки использования PIC18F2550. У них нет регистров ANSEL. Кроме того, существует специфический способ конфигурирования аналоговых/цифровых портов, что сильно ограничивает возможности разметки. Это приводит к неудобному переплетению проводов, как показано на фото выше.
6) Регуляторы лучше всего изготавливать из линейных переменных резисторов. Я не рекомендую использовать китайские двигатели со встроенными ограничителями крутящего момента. Вы не сможете быстро менять положение во время полета. Но иногда приходится…
7) Из задач на будущее:
— можно поставить приемопередающую аппаратуру с большей дальностью действия, вроде nRF24L01 с антенной,
— если приделать к схеме MEMS чип-гироскоп и GPS/ГЛОНАСС/Galileo чип-навигатор, вроде отечественного ML8088s, то можно научить самолет летать самостоятельно по координатам в пространстве. Правда, тут придется повозиться с алгоритмом полета, чтобы самолет умел не только поворачивать, но и делать это плавно, и выравниваться при порывах бокового ветра. Зато интересно, на мой взгляд.
— можно приделать к самолету FPV, и тогда уж точно не оторвешься от этой игрушки. Правда, дополнительный вес потребует более мощного мотора, контроллера к нему, и более емкого аккумулятора, соответственно.
Надеюсь, кому-то моя статья оказалась полезной.
В приложении я привожу коды прошивок для приемника и пульта, программный код, необходимый для связи по USB с пультом, а также разводку платы приемника. На плате пульта не так много схем, поэтому я не буду этого делать.
Файлы:
PlaneControlCode
Все вопросы в
Форум.
Ознакомьтесь также с этими статьями: