Создаём систему радиоуправления для самодельного самолёта
Картинка Viarprodesign, Freepik
У каждого человека есть определённая тема, к которой он испытывает некое иррациональное влечение. У автора этой статьи такой темой является авиамоделирование: на тот момент, когда ещё существовали авиамодельные кружки, автор пришёл в него записываться и ему сказали, что он ещё слишком мал и лучше прийти через пару лет. А через пару лет распался Советский Союз и всем стало совсем даже не до кружков — на дворе наступили «благословенные» 90-е годы…
Однако, «гештальт сам себя не закроет» и автор решил тряхнуть стариной и попробовать собрать свою первую авиамодель (лучше поздно, чем никогда, да и в авиамодельный кружок опять не возьмут — теперь уже по причине старости :-)
Сразу небольшой спойлер: на данный момент работа находится на этапе полной успешной разработки электронной части, остаётся только всю эту начинку укрепить на авиамодели и, наконец-то, приступить к полётам! Кроме того, наше время даёт новые интересные возможности, в частности, можно установить на авиамодель камеру и получить новый интересный опыт.
Ниже будет описание опыта работы автора над электронной начинкой, а также весь необходимый исходный код и другие полезности, которые вы можете использовать в своих проектах!
Итак…
Что собираем, как и почему
В наше время есть огромное количество необходимых электронных компонентов на любой вкус и кошелёк, однако это не спортивно, и лучше собрать всё с нуля (так как наша задача — не полететь за минимальное время, а научиться новому, повозиться с «железом»). Таким образом, вся дальнейшая сборка будет во главу угла ставить возможность программирования и гибкой настройки практически всех компонентов.
Понятно, что для любого более-менее далеко летающего аппарата необходим будет условно большой радиус связи, так как летающий аппарат отличается тем, что может за короткое время покрыть большое расстояние и чуть ли не практически моментально «уйти за пределы видимости». А нам этого не надо.
Одним из самых простых и недорогих способов, на взгляд автора, является использование радиомодулей NRF24L01.
Тут надо сделать небольшое уточнение: дело в том, что подобных модулей существует две версии:
- Менее дальнобойная, которая позволяет осуществлять связь на скоростях до 2 мбит/с и на расстоянии до 100 м.
Картинка 3d-diy.ru
- Более дальнобойная, NRF24L01+PA+LNA, которая обеспечивает связь до 1100 м и имеет в составе усилитель и внешнюю антенну.
Картинка 3d-diy.ru
Мы выберем второй вариант, так как у него есть «красивая антенка» :-) Хотя, конечно же, не поэтому, но вы уже поняли почему. Скорость связи сильно зависит от расстояния между двумя соединяемыми модулями и от того, находятся они в прямой видимости или закрыты друг от друга преградами.
Кроме этих вариантов, можно попробовать и что-нибудь на базе других способов, взяв, например, тот же самый Wi-Fi на 1 км. Но выбранный способ автору показался одним из наиболее простых.
Борьба с проблемами NRF24L01+PA+LNA
▍ Питание
Модуль является очень чувствительным к питанию и требует его стабилизации желательно от отдельного источника, так как простое питание от пина Arduino, как правило, не позволяет его обеспечить достаточным уровнем тока, что приводит к нестабильной работе или даже вовсе к неспособности функционирования.
Чувствительность его объясняется тем, что в момент старта модуль потребляет достаточно большие токи. По опыту других людей и по опыту самого автора, одним из наиболее действенных способов борьбы с этой бедой является двойственный подход:
- использование родного адаптера питания со стабилизатором, выходная мощность по току у которого составляет порядка 800 мА;
Картинка 3d-diy.ru
- параллельно желательно припаять к пинам питания самого радиомодуля конденсатор, где-нибудь на 100 мкФ. Это позволит сгладить пиковые пульсации питания в момент запуска модуля.
▍ Помехи радиосвязи
Ещё одной существенной проблемой является крайняя чувствительность радиотракта модулей к помехам. Настолько высокая, что многим, включая и автора, удалось «завести» этот модуль только после того, как его плата была обмотана пекарной кухонной фольгой!
Технология здесь следующая: чтобы у нас ничего не замкнуло, мы сначала обматываем плату простой бумагой, после чего укрепляем эту бумагу одним-двумя витками скотча, а уже поверх скотча наматываем фольгу и поверх фольги заново укрепляем её скотчем.
Почему так: автору не хотелось, чтобы скотч оставил свой липкий слой на плате, поэтому он был отделён от платы слоем бумаги. Если «правильной» фольги под рукой не окажется, то, как показали эксперименты, годится даже блестящий металлизированный фантик от конфеты или, например, творожного батончика.
Без этого лайфхака вы будете делать всё правильно, «вырвете все волосы на голове», но работать оно не будет от слова никак…
Причём нужно обмотать фольгой как плату передатчика, так и приёмника.
▍ Правильная библиотека
Ещё одним существенным фактором, влияющим на успех процесса запуска радиомодуля, является правильная библиотека под Arduino.
По ссылке можно найти библиотеку, которая позволяет запускать модули, приобретённые в известном китайском магазине.
Перечисленные выше нюансы являются причиной того, что даже у признанных мастодонтов, которые далеко не первый день сидят в электронике и программировании, не выдерживают нервы: указанные модули летят в мусорную корзину или раздаются забесплатно по знакомым. («Будь проклят тот день, когда я сел за баранку этого пылесоса!» ©) Кстати, не утрирую, это абсолютно реальные случаи…
Однако если вы примете в расчёт вышесказанное, всё у вас будет хорошо…
В благодарность за своё терпение вы получаете один из самых недорогих (чуть более 200 руб.) и дальнобойных модулей, обеспечивающих хорошую и скоростную связь, а также позволяющих настраивать множество параметров.
Хорошо, с радиосвязью мы разобрались. А теперь — что именно мы будем собирать? Необходимо определиться с этим, так как именно от вида финального изделия будет зависеть и комплекс требований к моторной установке…
Пенолёт из потолочки и разные варианты решения
Некоторое время назад автору попалась на глаза идея создания простого и лёгенького, но в то же время достаточно прочного самолёта — сборка так называемого пенолёта из потолочки.Подобного типа самолёты собираются из лёгкой пенопластовой декоративной плитки, которой оклеивают потолки. Как правило, она имеется в изобилии в хозяйственных магазинах.
Для сборки подобного самолёта достаточно купить пачку потолочной плитки (около 150 руб. за 10 штук 0.5×0.5 м в Москве), силиконовый термоклей с пистолетом для него, а также острый канцелярский нож.
В результате получается очень прочный и лёгкий самолётик, а сам процесс сборки доставляет множество приятных минут, так как проходит достаточно легко и даёт множество возможностей для творчества.
В видео выше показана сборка самолёта из иного материала, однако мы будем использовать потолочку.
Соответственно, для нас сгодится достаточно скромная по мощности силовая установка.
Вариант силовой установки: коллекторный двигатель
С учётом всего вышеперечисленного и в результате поисков в интернете была найдена следующая страничка, где разбирается практическая сборка пенолёта, а в качестве силовой установки которого используется коллекторный двигатель + специальный электронный регулятор оборотов для коллекторных двигателей (Bidirectional Brush Electric Regulator).
Кстати сказать, на этой страничке внизу имеется код приёмника и передатчика, который по идее можно взять. Однако у автора этот код так и не заработал, так как выяснилось, что нужно внести изменения, чтобы он запустился (в случае организации связи между двумя NRF24L01+PA+LNA). Как заставить его заработать — об этом ниже.
После изучения изложенной информации появилось понимание, что использовать подобный регулятор это будет «слишком кучеряво», так как нам вовсе не нужна функция смены направления вращения двигателя (так как самолёт не планирует летать хвостом вперёд).
Поэтому для наших целей вполне сгодится мощный полевой транзистор с логическим уровнем, который сможет открыться от напряжения 3–5 В и будет выступать в роли силового ключа, подающего питание на двигатель. Для регулировки же скорости оборотов будет использован ШИМ.
Стало быть, решено! Был приобретён полевой транзистор, у которого максимальное открытие наступает при 1,7 В, а если с запасом — то 2,2 В. То, что нужно.
В качестве двигателя был взят первый валявшийся под рукой коллекторный электродвигатель, в качестве винта для него были куплены винты от дрона. Так как «правильных» крепежей для винта, которые бывают на «профессиональных» двигателях для самолётов и дронов, под рукой не было, пришлось распечатать на 3D-принтере вставку (оранжевого цвета), нарезать на винте и на самой вставке резьбу и вкрутить одно в другое:
Подключать двигатель к Arduino мы будем по следующей схеме:
Картинка alexgyver.ru
В результате получилось вот что:
В качестве источника питания были взяты два элемента 18650, подключённых последовательно.
Однако автора результаты не устроили несмотря на то, что всё заработало как нужно. Дело в том, что для эффективного взлёта самолёта необходимо было повышать напряжение питания до таких величин, что произошло бы физическое возгорание коллекторного двигателя (три элемента 18650 были подключены последовательно, так как одного или двух недостаточно — слишком малая тяга и обороты).
Ранее было упомянуто о том, что код на приведённой выше страничке не работает. Экспериментально было выявлено, что для выбранного типа радиомодуля в код требуется внести следующие изменения (т. е. изменить первичную настройку радиомодуля):
radio.begin(); // Инициализация модуля NRF24L01
radio.setChannel(5); // Обмен данными будет вестись на пятом канале (2,405 ГГц)
radio.setDataRate (RF24_1MBPS); // Скорость обмена данными 1 Мбит/сек
radio.setPALevel(RF24_PA_HIGH); // Выбираем высокую мощность передатчика (-6dBm)
radio.openReadingPipe (1, pipeIn); // Открываем трубу ID передатчика
radio.startListening(); // Начинаем прослушивать открываемую трубу
Тем не менее, скорее всего, проблема бы решилась, если взять более мощный коллекторный двигатель. Однако автор решил пойти более кардинальным путём.
Если вы захотите попробовать собрать свой радиоуправляемый самолёт, используя коллекторный двигатель, вы вполне можете взять код, который был модифицирован автором именно для этого случая.
Вот ссылка на код приёмника и передатчика.
Однако тут следует отметить, что для интереса в качестве микроконтроллера для передатчика была использована Arduino Nano, а в качестве микроконтроллера приёмника на самом самолёте — esp32. И код, ссылка на который приведена выше, будет работать именно для этого случая.
Важным моментом является правильное подключение радиомодуля к микроконтроллерам.
В случае пульта управления, мы подключаем модуль к микроконтроллеру по следующей схеме:
Картинка rcpano.net
В случае же микроконтроллера esp32 (микроконтроллер на самолёте), мы используем следующую схему:
Картинка dzen.ru
То есть контакты радиомодуля и пины микроконтроллера esp32 соотносятся следующим образом:
- MISO — 19 пин,
- MOSI — 23 пин,
- SCLK — 18 пин,
- CSN — 5 пин,
- CE — 4 пин.
Вариант силовой установки: бесколлекторный (BLDC) двигатель
Как было уже сказано выше, автор решил пойти более кардинальным путём после первого не совсем удачного эксперимента. Его можно было бы довести до успешного результата, использовав более мощный коллекторный двигатель, однако, раз уж подвернулась такая оказия, было решено более подробно ознакомиться с бесколлекторными модельными двигателями, так называемыми BLDC.
Для этого в известном китайском магазине было закуплено 2 отдельных набора, каждый из которых содержит электронный регулятор оборотов (Electronic Speed Controller — ESC), бесколлекторный двигатель, винт и систему его крепежа, а также несколько мощных литий-полимерных (могут отдавать очень большие токи за очень короткое время) аккумуляторов и «правильную» зарядку с балансировкой заряда для них.
Двигатели были взяты двух типов: 1400 kv и 2200 kv. Эти цифры означают, что на каждый вольт поданного напряжения питания двигатели раскрутятся до таких оборотов.
Так как напряжение питания у нас составляет 11,1 В, то, соответственно, двигатели наберут следующие обороты (понятно, что это обороты холостого хода, под нагрузкой они будут меньше):
- 11,1×1400=15540 об/мин;
- 11,1×2200=24420 об/мин.
Как было сказано выше, каждый из наборов содержит так называемый ESC, который служит для регулировки оборотов двигателя. Из него выходит ряд проводов:
- для подачи питания на двигатель (3 провода) — если после подключения к двигателю выяснится, что он крутится не в ту сторону, в которую нужно, достаточно поменять местами любые два провода;
- для подключения аккумулятора (2 провода);
- балансировочный разъём для правильной зарядки с балансировкой заряда между элементами аккумулятора;
- так называемый разъём BEC — Battery Eliminating Circuit, то есть разъём, который позволяет запитывать не только двигатель, но и электронную плату микроконтроллера от того же самого аккумулятора (то есть исключает потребность в отдельном источнике питания для бортовой электроники).
Вообще говоря, ранее с такой штукой, как ESC, сталкиваться не приходилось. И при её изучении выяснилось, что это довольно-таки интересная вещь!
Если сказать вкратце, то это такой маленький микроконтроллер, который может отслеживать вращение двигателя и умно его запитывать.
Типов ESC может быть два (поправьте, если ошибаюсь):
- без возможности изменения его поведения с помощью программирования (автору «повезло» и он купил именно такой);
- с возможностью изменения его поведения с помощью программирования. Зачем вообще нужно программировать ESC: чтобы он наиболее полно отвечал будущим условиям эксплуатации.
Способов программирования поведения ESC может быть два:
- с помощью специальной «карты»;
- с использованием звукового способа, так называемого, «по пикам» (не уверен, что это абсолютно корректное название, однако автор в видео ниже называет его именно так). То есть происходит настройка с ориентировкой на звуковой сигнал, который даёт возможность понять, что мы перемещаемся по определённым пунктам меню. Это позволяет избежать использования любых графических интерфейсов при настройке и использовать, так сказать, звуковой интерфейс.
Для управления бесколлекторным двигателем достаточно использовать способ, подобный тому, который используется для управления сервоприводами, то есть с использованием ШИМ-сигнала. Посылая сервоприводам управляющий сигнал с импульсами разной ширины и постоянной частоты, можно добиться их поворота на нужный угол (чаще всего используются сервоприводы с поворотом на 180°). Обычно для сервопривода генерируют сигнал с частотой в 50 Гц. Это означает, что один импульс испускается и принимается с периодами в 20 мс. При этом, например, если длительность одного импульса составит 1520 мкс, то сервопривод повернётся в среднее положение (другие положения достигаются по аналогичной логике, см. картинку ниже):
Картинка stepik.org
Пример такого способа управления с использованием стандартной библиотеки управления сервоприводами для Arduino (Servo.h) показан здесь:
Однако вернёмся к нашей esp32. Подытоживая всё сказанное, получается, что для управления сервоприводами отклонения закрылок, а также двигателем, нам потребуется тот же самый принцип, что и для управления сервоприводами.
Но проблема заключается в том, что esp32 довольно криво поддерживает стандартную библиотеку Servo.h.
И что же делать? А вот что: так как мы разобрались, что нужно делать для управления сервоприводом, то ради интереса мы для управления используем два разных подхода:
- закрылками будем управлять с использованием чистого самодельного ШИМ-сигнала;
- бесколлекторным двигателем будем управлять с использованием специальной библиотеки для сервоприводов, предназначенной для esp32 (ESP32_Servo.h). По сути она делает то же самое, только всё это обёрнуто в удобную оболочку библиотеки для тех, кто не хочет лезть «под капот».
Стало быть, вкратце первый подход выглядит так:
#define low 1638
#define high 7864
#define timer 16
#define ServoPin1 33
#define ServoPin2 32
struct Signal {
byte throttle;
byte pitch;
byte roll;
byte yaw;
};
Signal data;
void ResetData()
{
// Определение начальных значений
// Среднее положение потенциометров (254/2=127)
data.throttle = 0; // Motor Stop
data.pitch = 127; // Center
data.roll = 127; // Center
data.yaw = 127; // Center
}
void setup() {
ledcSetup(3, 50, timer);
ledcAttachPin(ServoPin1, 3);
ledcSetup(4, 50, timer);
ledcAttachPin(ServoPin2, 4);
}
void recvData()
{
ledcWrite(3, map(data.pitch, 0, 255, low, high) ); //серва1
ledcWrite(4, map(data.yaw, 0, 255, low, high) ); //серва2
}
Второй подход выглядит так:
#include
Servo myservo;
int servoPin = 27;
void ResetData()
{
// Определение начальных значений
// Среднее положение потенциометров (254/2=127)
void ResetData()
{
struct Signal {
byte throttle;
byte pitch;
byte roll;
byte yaw;
};
Signal data;
// Определение начальных значений
// Среднее положение потенциометров (254/2=127)
data.throttle = 0; // Motor Stop
data.pitch = 127; // Center
data.roll = 127; // Center
data.yaw = 127; // Center
}
void setup() {
myservo.attach(servoPin, 800, 2300);
}
void recvData()
{
myservo.write( map(data.throttle,0, 253, 0, 180) );
}
Итак, рабочий финальный код передатчика и приёмника для BLDC-двигателя можно скачать тут.
Библиотека для сервоприводов (под esp32) лежит тут.
Библиотека для модулей NRF — та же, что и выше. Продублирую для удобства.
Можно отметить, что код далеко не оптимальный и его ещё «оптимизировать и оптимизировать». Однако он работает. «А что ещё нужно человеку, чтобы спокойно встретить старость?» :-)
Кроме этого, уже после завершения проекта появилась идея усовершенствовать код следующим образом. Дело в том, что зачастую после сборки самолёта выявляется, что закрылки и хвостовой руль ориентированы не ровно посередине крыла и хвоста соответственно, а несколько отклонены вверх или вниз (или влево — вправо, если мы говорим о хвосте).
Для устранения этого на самолётах обычно калибруют сервопривод, выставляя нулевую точку. То есть, другими словами, для этого поворачивают сервопривод, чтобы он выставил закрылок или хвостовой руль ровно посередине крыла или хвоста, а затем запоминают это положение. Далее все отклонения в ту или иную сторону будут происходить относительно этой точки.
В нашем же случае для этих целей можно использовать незадействованную в данный момент функцию джойстиков, а именно их встроенную кнопку (на джойстик сверху можно нажать и сработает кнопка в основании стика). Там для этого есть отдельный пин для подключения сигнального провода, правда в рамках этого проекта данный провод пока остаётся незадействованным. То есть мы просто вручную чуть-чуть отклоняем стик, выставляя этим действием закрылок или хвостовой руль ровно посередине и нажимаем на кнопку стика. Вот и всё, сервопривод откалиброван! Однако это пока только в проекте, и будет реализовано чуть позже.
Далее нам потребуется ещё некий пульт управления, куда можно «запихнуть» всю электронику.
Для этого была разработана и распечатана на 3D-принтере следующая серия корпусных деталей (увидев их размер, стало совсем тоскливо — было установлено сопло 0,8 мм и каждая деталь печаталась всего лишь час или полтора):
Скачать 3D-модели джойстика можно здесь.
Питание джойстика осуществляется от двух элементов 18650, подключённых последовательно. Но пока временно был подключён внешний блок питания из четырёх батарей АА.
Ну и теперь самое интересное — тест всей системы в работе. Чтобы наглядно было видно, что система генерирует не «лёгкий ветерок», под винт был положен аккумулятор. По тому, как он сдувается ветром, думается, многое становится чуть более понятно:
Если до этого вы никогда не работали с бесколлекторными двигателями на редкоземельных магнитах, — их мощность вас поразит. Но к ним нужно относиться очень внимательно, так как они легко могут порубить на куски выступающие части вашего тела своим винтом.
Таким образом, если вы захотите повторить описанную аппаратную часть, вы можете взять код и 3D-модели из этой статьи и реализовать собственную систему управления.
В описанной системе используется всего 2 сервы, т. к. хотелось сделать более простую версию самолёта (отклоняться будет единый горизонтальный закрылок на хвосте и вертикальный руль там же). При желании и потребности вы можете добавить ещё серв в систему, посмотрев, как это сделано в коде сейчас, и поступив по аналогии.
Останется её только в дальнейшем дополнить той или иной моделью самолёта, изготовленного из потолочной плитки — и вперёд к небу…
Подытоживая весь рассказ, хочется сказать, что люди мечтали летать ещё с древнейших времён, и современные технологии дают возможность это осуществить.
При желании — все требующиеся для такой задумки компоненты могут быть куплены, однако, сборка своего устройства даст гораздо больше позитива и интересных моментов, как в плане общения с железной частью, так и в плане решения возникающих проблем программирования. К тому же впереди праздники, а что может быть лучше, чем реализовать в течение них многовековую мечту человечества (даже если для конкретного человека)? :-)
К тому же если пойти подобным путём, стоимость компонентов будет весьма скромной.
А со временем, если подобное занятие придётся по вкусу, можно вполне установить видеокамеру и перейти на более серьёзные технологии, например, собрать свой собственный дальнолёт.
Ведь полёты на самолёте или планере — это, в общем случае, достаточно медитативное и приятное занятие:
Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх