YMFC-AL: квадрокоптер с автостабилизацией на Arduino Uno
Примечание
Автор проекта и всех материалов: J.M. Brokking (Joop Brokking), brokking.net. Ниже подробный пересказ его страниц проекта (главная, Q&A, загрузки, медиа) и его файлы без изменений. Оригинал: ymfc-al_main.html, Q&A, загрузки, медиа; копии в Wayback Machine.
YMFC-AL (Your Multicopter Flight Controller, Auto Level) — учебный полётный контроллер квадрокоптера на Arduino Uno с гироакселерометром MPU-6050. Когда пилот отпускает стики, аппарат сам возвращается в горизонт. Автор называет проект не «продвинутым контроллером», а набором простого, хорошо закомментированного кода, который можно понять и переписать под свои задачи. К коду есть видеоуроки (см. Видео и ссылки на оригинальные страницы). Оценка стоимости у автора: около 150 долларов вместе с батареей, пультом и зарядкой.
Файлы
YMFC-AL.zip, версия 1.4 от 30.04.2017:YMFC-AL_setup.ino,YMFC-AL_esc_calibrate.ino,YMFC-AL_Flight_controller.ino, схемаYMFC_schematic.pdfиReadMe.txtс историей версий.
Шаг 1. Программа
Скачать пакет и прочитать ReadMe.txt. В пакете три скетча: настройка (setup), калибровка регуляторов и проверки (esc_calibrate) и сам полётный контроллер.
Шаг 2. Железо (список автора)
рама размера 450 со встроенной платой разводки питания;
4 комплекта «мотор около 1000 kV + винт 10x4.5 + регулятор (ESC)»;
LiPo 3S 2200 мАч (в Q&A указано 20C или 30C);
Arduino Uno или клон Funduino Uno;
гироакселерометр MPU-6050;
пульт Flysky FS-i6 (в старых версиях страницы — FS-T6) на 6 каналов;
зарядное для LiPo 2S/3S;
мелочи: резисторы 1,5 кОм, 1 кОм и 330 Ом, диод на 1 А (1N4001 или аналог), светодиод, провода, разъём для батареи.
Автор лично предпочитает винты 8x4.5 вместо 10x4.5: они разгружают моторы и регуляторы и дают более быстрый отклик. Список — рекомендация, ответственность за выбор деталей на пользователе.
Шаг 3. Сборка
Сборку автор показывает в видео YMFC-3D, часть 1 (железо), плюс схема из пакета.
Диод D1 и резисторы R2/R3. Диод защищает USB-порт компьютера, когда Arduino подключена к нему и к батарее одновременно, исключать его нельзя. Резисторы образуют делитель напряжения батареи (делит на 2,5), чтобы измерять напряжение в полёте. При падении напряжения загорается светодиод, а обороты моторов программно увеличиваются, компенсируя просадку. Номиналы 1 кОм и 1,5 кОм надо ставить правильно, иначе аппарат не будет лететь хорошо.
MPU-6050. Это единственный датчик, который поддерживает YMFC-AL: для автовыравнивания нужны и гироскоп, и акселерометр (принципы — в двух видео про MPU-6050 6dof IMU). Ориентация не важна, если ось Z вертикальна, а грани датчика параллельны граням рамы: программа настройки сама определит ориентацию и при необходимости инвертирует оси. Клеить датчик нужно на тонкий двусторонний скотч, не на поролоновый и не на демпферы: это ухудшает результат.
Пульт и приёмник. Подойдёт почти любой пульт на 4 канала, главное чтобы импульсы приёмника были примерно 1000–2000 мкс с центром 1500 (в Q&A: центр около 1520 мкс допустим). Выходы приёмника крен (aileron), тангаж (elevator), рыскание (rudder) и газ подключаются к цифровым входам Arduino 8, 9, 10 и 11 в любом порядке: программа настройки определит каждый канал. Приёмник питается от +5 В Arduino.
Регуляторы (ESC). На схеме у них подключены только земля и сигнальный провод. Плюс 5 В регуляторов не подключается: Arduino получает питание от основной батареи через диод D1. Иногда земля регулятора тоже не нужна: если мультиметром видно, что минус разъёма батареи уже соединён с минусом провода регулятора, общая земля уже есть. Сигнальные провода:
Выход Arduino |
Положение мотора |
Направление вращения |
|---|---|---|
D4 |
правый передний |
против часовой |
D5 |
правый задний |
по часовой |
D6 |
левый задний |
против часовой |
D7 |
левый передний |
по часовой |
Шаг 4. Программа настройки (setup)
Снять винты, батарею не подключать, залить скетч настройки, открыть монитор порта на 57600 бод и выполнять указания. Настройки сохраняются в EEPROM Arduino. Ошибки (из Q&A):
Нет валидных сигналов приёмника. Программа ищет импульсы длиной больше 900 и меньше 2100 мкс на входах 8–11. Проверьте подключение каналов к 8, 9, 10, 11, что приёмник связан с пультом и что пульт включён.
За 30 секунд не замечено движение стика. Движение засчитывается, если импульс длиннее 1750 или короче 1250 мкс. Двигайте стик до упора; снова проверьте подключение и включённость пульта.
Гироскоп не найден. Программа ищет MPU-6050 и L3G4200D по адресам 0x68/0x69, L3GD20H по адресам 0x6A/0x6B и проверяет ответ Who_am_I. Проверьте подключение: GND–GND, 5V–Vin/VCC, SDA/A4–SDA, SCL/A5–SCL (на Uno A4/A5 и SDA/SCL — одни и те же выводы). Датчик должен быть совместим с 5 В, иначе нужен уровневый преобразователь и питание 3,3 В.
За 10 секунд не обнаружено вращение. Квадрокоптер нужно наклонить на угол не менее 45° (засчитывается свыше 30°) за 10 секунд, во время калибровки не двигать.
Ошибка проверки EEPROM. Нестабильное питание 5 В во время настройки или повреждённая EEPROM.
Ошибка проверки каналов приёмника. Один стик назначен на две функции.
Ошибка проверки осей гироскопа. Одна ось назначена на две функции.
Если setup зависает после текста про движение всех стиков к краям, причина обычно в новой Arduino IDE (1.6.x), которая оптимизирует код: переменную receiver_input_channel_1 и родственные нужно объявить как volatile (исправлено в версии 1.3).
Шаг 5. Проверка приёмника и гироскопа
Винты сняты, батарея отключена, залит скетч esc_calibrate, монитор порта 57600.
Буква
r— монитор приёмника: все каналы должны давать 1000–2000 мкс с центром 1500 (допуск примерно ±8).Буква
a— проверка углов: не двигать, пока гироскоп калибруется. Затем сверить: нос вверх = положительный тангаж, нос вниз = отрицательный; левое крыло вверх = положительный крен; нос вправо = положительное рыскание (значение рыскания из гироскопа, при остановке вращения возвращается к нулю).
Шаг 6. Калибровка ESC
Регуляторы управляются импульсом 1000–2000 мкс (1000 = выкл., 2000 = полный газ). Без калибровки крайних точек моторы работают по-разному, и аппарат плохо летает или падает. Залить скетч калибровки, отключить USB и действовать по инструкции к своему регулятору. Обычная последовательность: стик газа вверх, подключить батарею, после писка стик в самый низ, отключить батарею.
Шаг 7. Балансировка моторов и винтов
Внимание: первый запуск моторов с винтами, обеспечьте безопасные условия; ответственность за безопасность на вас.
Почему важно: разбалансированные винты и моторы создают шум в данных гироскопа и акселерометра, моторы дёргаются, устойчивости нет. Виброподвесы датчика не помогают и только ухудшают.
Как проводить через скетч esc_calibrate:
Поставить винты, проверить, что винты CW и CCW стоят на своих местах.
В мониторе порта отправить
1: тест мотора 1 (правый передний, против часовой).Крепко прижать аппарат, газ в минимум, подключить батарею, плавно поднимать газ до начала вращения. Проверить направление вращения и что винт даёт тягу вверх; если вращение неверное, поменять местами два из трёх проводов мотора.
Держа раму мотора в руке, поднять газ до половины, смотреть числа на экране (уровень вибрации по акселерометру, нестандартная величина, нужная только для сравнения) и чувствовать вибрацию рукой.
Остановить, наклеить маленький кусочек скотча на одну лопасть, повторить. Если вибрации уменьшились, оставить; иначе перенести скотч на другую лопасть, и так подбирать, пока вибрация не станет минимальной.
Повторить для моторов
2,3,4. Команда5запускает все моторы вместе для финальной проверки.
Шаг 8. Загрузка полётной прошивки и первый запуск
Отключить батарею, залить YMFC-AL_Flight_controller, отключить USB, подключить батарею. Держа аппарат в руках:
запуск моторов — газ вниз и рыскание влево;
остановка — газ вниз и рыскание вправо.
Поднять газ почти до «невесомости»: аппарат должен пытаться выровняться и сопротивляться наклону. Стики крена и тангажа должны двигать аппарат в соответствующую сторону; если нет, повторить настройку и перепроверить все пункты. Первый полёт — осторожно, на улице над травой, чтобы смягчить падение. Для дальнейшего улучшения автор советует доводить ПИД-коэффициенты (видео про ПИД YMFC-3D, часть 5) и смотреть остальные видео YMFC.
Q&A автора (все вопросы)
Калибровка акселерометра. Обычно не нужна; если аппарат уходит в сторону, подправьте субтримами на пульте.
Ошибки в настройке. Разобраны выше.
Где скачать код. В разделе загрузок (см. «Файлы»).
Arduino Due, Mega2560 или Pro Mini. Pro Mini подходит (тот же процессор), но её питания может не хватить для приёмника. Due и Mega2560 технически возможны, но не для новичков: нужно переписывать код под другие регистры прерываний и порты. Автор не владеет всеми платами и помогать не может.
A4/A5 или SDA/SCL. На Uno это одни и те же выводы.
Правильные ли ПИД-значения. ПИД зависят от конкретной конструкции, у каждого аппарата свои.
Почему не использован PWM. Чтобы проект был проще; Arduino IDE выставляет 500 Гц, который не принимают все регуляторы, пришлось бы менять регистры ATmega; при 500 Гц нельзя сформировать импульс 2000 мкс, теряется точность.
Какое железо нужно. Список выше.
Светодиод. При старте горит 5 секунд, затем быстро мигает (8 Гц) во время калибровки гироскопа, потом обычно гаснет. Медленное мигание (1 Гц) после калибровки означает, что газ не в минимуме или пульт выключен. Постоянное свечение — setup не выполнен или регистры гироскопа не записались (проблема I2C). В полёте светодиод должен быть выключен: если загорелся, батарея садится, пора садиться; либо превышено время цикла программы (если вы меняли код и цикл стал слишком длинным, расчёт углов ненадёжен).
Моторы то ускоряются, то замедляются на земле. Это нормально: после запуска ПИД и IMU сразу работают и пытаются выровнять аппарат; на наклонной поверхности нижние моторы раскручиваются, верхние замедляются. Взлетать сразу после старта. Если моторы сразу крутятся по-разному, регуляторы не откалиброваны. Проверка по видео: после калибровки отправить
5и убедиться, что при росте газа обороты одинаковы.Дрейф при отпущенных стиках. Использовать субтримы. Автовыравнивание — это не удержание позиции, ветер и турбулентность всегда будут сносить.
4S вместо 3S. Схема и код рассчитаны на 3S (максимум 12,6 В). Диод D1 даёт падение около 0,6 В, на аналоговый вход делитель выдаёт 4,8 В из расчёта (12,6 − 0,6) / (1000+1500) × 1000. При 4S (16,8 В) напряжение превысит 5 В и может повредить Arduino. Нужно заменить резисторы делителя: R3 с 1500 Ом на 8200 Ом, R2 с 1000 Ом на 3300 Ом (получится около 4,65 В) и поправить в коде коэффициенты пересчёта напряжения батареи и порог компенсации. Точные строки и значения — в оригинале Q&A, вопрос 12.
Как подключить ESC. Описано выше.
Как подключить приёмник. Минимум 4 канала (крен, тангаж, газ, рыскание) на входы 8–11, питание приёмника от +5 В и земли Arduino.
Аппарат ведёт себя агрессивно на заводских настройках. Возможная причина — электромагнитные помехи: импульсы тока регуляторов влияют на питание гироскопа, и он выдаёт странные значения. Регуляторы нужно размещать как можно дальше от Arduino и датчика, использовать короткие провода и не использовать макетные платы. Диагностика: включить вывод в последовательный порт (раскомментировать
Serial.begin(57600)), обнулить ПИД, вывести сырые значения гироскопа при работающих моторах, подержать аппарат в руках на половинном газе около 5 секунд, скопировать вывод в Excel и построить график. «Здоровый» гироскоп даёт ровный график, при помехах на графике шум (оба графика автора построены в диапазоне −8000…8000).Можно ли мой пульт. Любой пульт и приёмник с центральным импульсом около 1520 мкс.
Как изменить максимальный угол. По умолчанию около 33° (формула: (500 − 8) / 15 = 32,8, где 500 — нормированный ход стика, 8 — мёртвая зона, 15 — коэффициент в строках
pitch_level_adjustиroll_level_adjust). Значения коэффициента: 13 → 37°, 14 → 35°, 15 → 33°, 16 → 31°, 17 → 29°, 18 → 27°. Менять малыми шагами.Setup встаёт на «Gently move all the sticks…». См. выше (volatile).
ESC-калибровка зависает после отправки символа. Исправлено в версии 1.4: после чтения байта добавлена задержка 100 мс и очистка буфера.
История версий пакета
1.0 (03.07.2016) — релиз.
1.1 (11.07.2016) — исправлена ошибка NaN: при резких манёврах значение под
asinпревышало 1, получалось NaN, а из-за комплементарного фильтра ошибка не исчезала.1.2 (12.07.2016) — доработано исправление: проверка по модулю, так как значения ускорения бывают отрицательными.
1.3 (30.10.2016) — исправлено зависание setup в новых Arduino IDE (1.6.x и выше), стартовая скорость моторов снижена (1100 мкс), добавлена новая схема в PDF.
1.4 (30.04.2017) — исправлено зависание скетча калибровки из-за символа перевода строки.
Видео и фото
Видео автора см. на странице Видео и ссылки на оригинальные страницы. Фотографии сборки автора (12 изображений на главной, 10 в разделе «медиа») и схемы хранятся в нашем архиве сайта.
Видео автора (YouTube)
Видео проекта на канале автора MacPuffdog: плеер ведёт на оригинал, ролики лежат у автора.
Фото на сайте автора
Фотографии и рисунки к проекту лежат на сервере автора (у сайта нет HTTPS, поэтому здесь только ссылки, они открываются в новой вкладке). Копия всех файлов хранится у нас в архиве.