Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Игрушки

Радиоуправление Самолетом на MRF49XA

Автор: Ubermann, ubermann@yandex.ru
Опубликовано 29.07.2015.
Создано при помощи КотоРед.

Всем привет!

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

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

Итак, что же должно представлять из себя радиоуправление.
Во-первых, это управляющий радиосигнал. Полистав многие статьи из советских радиолюбительских журналов, мне стало ясно что там люди изрядно заморачивались темой передачи, приема радиоволн, настройки антенн, чувствительности приемников, и т.д. Конечно, без радиоволн тут никуда. Но если по серьезному, то данную тему нельзя изучить по-быстрому. Она требует отдельного и очень глубокого изучения, вплоть до физического и математического фундамента. Было бы легче, если б выучился я на радиофаке или физфаке... Но ситуация другая. Заморачиваться физикой радиоволн я не захотел. Да и нет большой нужды, ведь КПД самодельной аппаратуры достаточно невысок зачастую. Без грамотности в этих вопросах, да и дома на коленке сложно хорошо отладить приемник и передатчик. Вдобавок мне захотелось, чтобы самолет слал какую-то телеметрию, хотя бы самую простую, а значит передача должна идти в оба конца, и при этом команды от обоих передатчиков не должны смешиваться в эфире, а четко различаться обоими. Это еще больше усложняет ситуацию.
Выход был найден через использование компактных чипов-радиотрансиверов. Их особенность в высокой экономичности (по потерям энергии), по чувствительности према(т.е. дальности действия), не нужно сильно заморачиваться с радиопередачей, и вдобавок не нарушите законы об разрешенных для любителей радиочастотах и предельных мощностях передатчиков.
В моем случае я решил попытать счастья с 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 КОм-ные переменные резисторы. Не пробовал с ними. Надо попробовать. Думаю, линейность не испортится, а вот нагрузка на батарею немного спадет.

В качестве уникальной функции, которых не найдешь в магазинных самолетах, я решил реализовать функцию пуска ракеты с самолета. Для этого достаточно на секунду открыть мощный транзистор, и пустить большой ток с бортового аккумулятора на воспламенитель. В качестве воспламенителя можно использовать кусочек тонкой нихромовой нити (0.1-0.2 мм квадр) длиной пару сантиметров, и закрученной в пружинку на швейной иголке (в форме пружинки намного лучше нагревается). Когда нажимаю кнопку, раскаляется докрасна и выгорает. Фитиль от китайской пиротехнической ракеты поджигает легко. В качестве ракеты можно использовать как раз китайскую пиротехническую. Тут я, правда, еще не испытывал функциональность, и ничего из опыта сказать не могу. Одно скажу точно: надо быть крайне осторожным, т.к. ракета со стабилизатором полетит только вверх (но стабилизатор - тяжелый и неудобный груз для самолета), а без него полетит по непредсказуемой траектории (эти ракеты делают на коленке в Китае, и никто не гарантирует, что струя газа будет толкать ракету строго прямо) и может привести к самым негативным последствиям. Поэтому не советую с этим связываться. Однако, данную функциональность можно запросто переделать под метание макета бомбы или еще чего, где в качестве нагрузки будет какой-нибудь механизм вроде, например, электромагнита, держащего/отпускающего макет бомбы. Правда, и тут надо быть осторожным, т.к. при отпирании транзистора произойдет короткое замыкание бортового аккумулятора. На мгновение ток будет ограничен за счет сопротивления магнитного поля электромагнита, а затем ток резко вырастет, и закончится все плохо. Либо транзистор сгорит напрочь, либо аккумулятор испортится, а то и чего хуже воспламенится или взорвется (иногда случается с литиево-полимерными). Так что тут надо быть крайне осторожным...

СХЕМЫ АППАРАТУРЫ:
Вот схемы получившихся устройств.

Приемник:

Пульт-передатчик:

Про обозначения на схеме:
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. Мне показалось, это будет полезным при взлете. Правда, как выяснилось, не всегда контроллеры бесколлекторных моторов справляются со столь резким перепадом оборотов. Иногда вообще не реагируют. Таким образом, данную величину лучше менять плавно.

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

Питание схемы от 9V Duracell батарейки типа "Крона". На входе у пульта стоит стабилизатор LM78M05 для питания схемы напряжением в 5 вольт. И также LM1117-3.3 для питания MRF49XA напряжением в 3.3 вольта. Кстати, MRF49XA действительно вполне нормально работает от 5 вольт. В первой версии моего приемника он питался так. И до сих пор работает, сколько я его не гонял последние полгода.

По-умолчанию у MRF49XA двухпроводная линия питания. Я же прочитал статью товарища Blaze и еще вот эту , и решил в качестве антенны использовать штырь. В datasheet описан переходник, так называемый Balun (От слов Balanced-Unbalanced), от двухпроводной линии питания антенны к однопроводной. При этом наилучшие характеристики приема-передачи будут, если антенны будут с волновым сопротивлением в 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 9x4.7 (на пределе возможностей используемого двигателя).
- Сервомоторы TowerPro Microservo SG90.
- Регулятор не знаю какой на 30 ампер. Недорогой, но пашет хорошо.
- Аккумулятор 3-х баночный в 12V на 1000 мА/ч. Не очень емкий, но зато относительно легкий.

Самолет получился тяжеловат - 533 грамма. Но мотор на максимальных оборотах вполне тянет его вертикально вверх.
Вот фото:

Окошко перед пропеллером сделано специально для обдува радиатора приемника (где PIC18F4431 греется).

ЗАМЕЧАНИЯ ОТ АВТОРА:
1) Если переделать самодельный ШИМ на приемнике, чтобы одновременно все ножки в единицу ставил, а потом выключал каждую в нужный момент, то можно будет уменьшить интервал посыла пакетов, и тогда и доработать под 4 и более байтовые пакеты, если надо. Но вообще рекомендую nRF24L01+ с антенной. Они имеют буфер приема в 32 байта (можно разгуляться) и за счет усилителя мощности передают на расстояние до километра по прямой. Тогда заодно и телеметрия заработать должна (в моем случае). В перспективе можно поиграться и с LoRa (Long Range) радиотрансиверами вроде Semtech SX1272. Но там тоже придется учиться с ним работать.

2) Настоятельно рекомендую не возиться с теми джойстиками для Arduino, которые я использовал. Они достаточно грубы для управления самолетом. Сложно с ними управлять. Лучше купите самый дешевый пульт радиоаппаратуры, вытащите оттуда начинку, и используйте его замечательные джойстики. Там тот же самый принцип - на переменных резисторах. Но из-за своей конструкции эти джойстики намного точнее и удобнее. К тому же, коробка пульта будет неплохим корпусом для устройства.

3) Управлять самолетом сложно. В наше время часто ставят гироскопические стабилизирующие устройства. Не пробовал такое, но думаю, поможет в стабилизировании самолета в воздухе. Советую попробовать.

4) У магазинных самолетов на пультах управления, как правило, есть специальный разъем для подключения к компу. Через программу-симулятор можно потренироваться на виртуальном самолете прежде, чем запускать реальный. Очень удобно для новичков. Однако, в самодельной аппаратуре я такой разъем не предусмотрел. В этом большой минус своей аппаратуры - тренироваться придется на реальном самолете изначально. Поэтому советую сделать самолет попроще, чем предлагает Сергей Шевырин и поменьше размером. Я сделал самолет с размахом крыла 110 сантиметров, и теперь мучаюсь его чинить после каждого неопытного полета.

5) 28 ножек микроконтроллера PIC18F2550 маловато для толкового пульта. Рекомендую использовать его расширенный аналог PIC18F4550 с 44 ножками. Тогда вместо светодиодов можно будет прикрутить ЖК дисплей, со всеми его возможностями. Отдельно хочу заметить про недостаток PIC18F2550. У них отсутствуют ANSEL-регистры. А конфигурация аналоговый/цифровой для портов выставляется специфическим способом, который сильно ограничивает возможности по разметке на плате. Из-за этого, как видно выше на фото, пульт превращается в "воронье гнездо" с неудобным переплетением проводов.

6) Регуляторы лучше делать из линейных переменных резисторов. Не советую брать китайские, у которых есть встроенный замедлитель поворота ручки. Быстро изменить положение во время полета не получится. А бывает нужно иногда...

7) Из задач на будущее:
- можно поставить приемопередающую аппаратуру с большей дальностью действия, вроде nRF24L01+ с антенной,
- если приделать к схеме MEMS чип-гироскоп и GPS/ГЛОНАСС/Galileo чип-навигатор, вроде отечественного ML8088s, то можно научить самолет летать самостоятельно по координатам в пространстве. Правда, тут придется повозиться с алгоритмом полета, чтобы самолет умел не только поворачивать, но и делать это плавно, и выравниваться при порывах бокового ветра. Зато интересно, на мой взгляд.
- можно приделать к самолету FPV, и тогда уж точно не оторвешься от этой игрушки. Правда, дополнительный вес потребует более мощного мотора, контроллера к нему, и более емкого аккумулятора, соответственно.

Надеюсь, моя статья оказалась кому-нибудь полезной.

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

 

 


Файлы:
PlaneControlCode


Все вопросы в Форум.


ID: 2129

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

43 5 2
1
Подробно