Flix: разработка полетного контроллера с нуля

Flix: разработка полетного контроллера с нуля

@opensourcequadcopter

По всем вопросам @okalachevЧат обсуждения: @opensourcequadcopterchatGitHub: https://github.com/okalachev/flixУчебник: https://quadcopter.dev

2 191подписчиков
Еженедельноmixed

Похожие каналы

Все →

Последние посты

Flix: разработка полетного контроллера с нуля — пост в ТГ канале

Дамы и господа: Flix 2 (на плате). И он летает!На видео — один из самых первых стабильных полетов. Еще сегодня удалось полетать на улице, заодно проверить ESP-NOW, позже запощу видео (правда в итоге случился какой-то косяк, как раз о нем напишу).Дамы и господа: Flix 2 (на плате). И он летает!На видео — один из самых первых стабильных полетов. Еще сегодня удалось полетать на улице, заодно проверить ESP-NOW, позже запощу видео (правда в итоге случился какой-то косяк, как раз о нем напишу).

23 мая 2026 г.1 040В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

Фича с ESP-NOW добавлена, но самое главное: наконец приехала плата Flix второй ревизии. В этот раз производство и доставка заняли 26 дней.В прошлый раз не работала IMU (и еще по мелочи). На новой IMU я уже проверил. И она работает! 🎉Проверить было не сложно, оказывается, ICM-40609-D в основном совместима с ICM-42688-P, а для нее есть драйвер для Arduino.Теперь осталось, собственно собрать дрон и полететь.Фича с ESP-NOW добавлена, но самое главное: наконец приехала плата Flix второй ревизии. В этот раз производство и доставка заняли 26 дней.В прошлый раз не работала IMU (и еще по мелочи). На новой IMU я уже проверил. И она работает! 🎉Проверить было не сложно, оказывается, ICM-40609-D в основном совместима с ICM-42688-P, а для нее есть драйвер для Arduino.Теперь осталось, собственно собрать дрон и полететь.

21 мая 2026 г.1 210В Telegram

Начал работу по вкручиванию поддержки ESP-NOW.ESP-NOW это одна из главных фишек ESP, низкоуровневый обмен сообщениями по Wi-Fi, но без всяких подключений, SSID и паролей. Есть только сообщение, номер канала и MAC-адрес — и все. Это идеально подходит для обмена информацией с дроном.Нюансы:1️⃣ У ESP-NOW довольно странное API в Arduino, которое не придерживается Arduino-стиля. Вместо обычного чтения данных через read() используются коллбэки — причем вызываются они в контексте отдельного потока. Соответственно, для нормальной работы требуется возня с локами и очередями, а их совсем не хотелось бы тащить в код Flix. Интересно, что примеры в интернете про ESP-NOW этот вопрос просто игнорируют и лепят код с side-effect'ами прямо в коллбэки, как будто так и надо.Хотя вообще решение есть — встроенный класс ESP_NOW_Serial_Class, который реализует интерфейс а ля Serial, и берет все хлопоты с потоками на себя. Но ESP_NOW_Serial_Class тоже не идеален: во-первых, он не позволяет принимать сообщения с произвольного MAC'а — только с заранее заданного (невозможен автоматический биндинг). Во-вторых, он повторяет отправку пакетов до тех пор, пока не получит подтверждение доставки. Это хорошо для имитации Serial-интерфейса, но не очень хорошо для передачи телеметрии или команд с джойстика. Максимальное количество повторов там 5, и это захардкожено. Было бы хорошо, если бы его можно было настраивать, причем для каждого сообщения отдельно, но такой возможности нет (может, сделать PR?).2️⃣ Есть встроенная криптография, но можно ли использовать ее для аутентификации, или она только для шифрования — я пока не понял. Если нельзя, то придется прикручивать какую-то аутентификацию отдельно, например, использовать MAVLink message signing. Сейчас аутентификацию я сделал только по MAC-адресу, что, конечно, не является защитой и подходит только для лабораторных тестов.В итоге, в ветке espnow я реализовал поддержку с помощью ESP_NOW_Serial_Class. Для наземной стороны написан простой скетч espnow-pro

18 мая 2026 г.1 380В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

QGroundControl позволяет управлять дроном со смартфона, но сделано там это довольно убого — виртуальные стики издевательски маленькие, да еще и какие-то глючные.Артур @goldarte сделал (не без помощи ИИ) свой собственный пульт для Flix, который гораздо удобнее, чем QGC! С большими удобными стиками и кучей настроек. Там также отображается батарейка и режим, и даже есть доступ к консоли (то есть можно делать что угодно). В общем, получилось довольно круто, так что теперь для полетов с телефона я буду рекомендовать именно его.Так как это MAVLink (конкретно сообщение MANUAL_CONTROL), то этот пульт подходит не только для Flix, но и для PX4 и Ardupilot. Код открыт: https://github.com/goldarte/mavlink-joystick. В релизах доступен APK-файл для установки, так что у кого есть Android — можно протестировать и написать, как вам!QGroundControl позволяет управлять дроном со смартфона, но сделано там это довольно убого — виртуальные стики издевательски маленькие, да еще и какие-то глючные.Артур @goldarte сделал (не без помощи ИИ) свой собственный пульт для Flix, который гораздо удобнее, чем QGC! С большими удобными стиками и кучей настроек. Там также отображается батарейка и режим, и даже есть доступ к консоли (то есть можно делать что угодно). В общем, получилось довольно круто, так что теперь для полетов с телефона я буду рекомендовать именно его.Так как это MAVLink (конкретно сообщение MANUAL_CONTROL), то этот пульт подходит не только для Flix, но и для PX4 и Ardupilot. Код открыт: https://github.com/goldarte/mavlink-joystick. В релизах доступен APK-файл для установки, так что у кого есть Android — можно протестировать и написать, как вам!

8 мая 2026 г.2 130В Telegram

Главный миф об акселерометреХочу разобрать один миф, связанный с расчетом текущей ориентации дрона (attitude estimation). Миф заключается в том, что акселерометр якобы может измерять ускорение свободного падения / силу гравитации, и поэтому его можно использовать для коррекции расчета ориентации. Это не так.Миф настолько глубоко укоренился, что проник почти во все популярные учебники по беспилотникам, и даже в код некоторых полетников. Но правда в том, что гравитация — это единственная сила, которую невозможно измерить акселерометром. Причем это фундаментальное физическое ограничение, не зависящее от стоимости устройства. Да, на столе акселерометр показывает 9.8, но это не гравитация — это сила реакции опоры. В случае, когда объект неподвижен, эта сила равна силе гравитации, но противоположна по знаку. Поэтому когда дрон не летит, по акселерометру действительно можно корректировать расчет ориентации, как это и сделано в моей прошивке.Но теперь рассмотрим, какие силы действуют на дрон в полете. По сути их три: гравитация, тяга от пропеллеров и ветер. Акселерометр может измерить только последние две. В квадрокоптере конструктивно тяга от пропеллеров всегда направлена строго вверх, то есть без учета шума акселерометр всегда будет выдавать (0, 0, тягу пропеллеров) — это не зависит от ориентации вообще. Ветер может быть в любом направлении, от ориентации также не зависит.Из этих рассуждений видно, что примешивание данных с акселерометра никак не помогает нам уточнить ориентацию, потому что в этих данных в принципе не содержится о ней никакой информации. Но расчет ориентации только по гироскопу неизбежно будет приводить к дрейфу по углу.Получается, дрейф убрать нельзя?Я предлагаю менее тривиальное решение. Дело в том, что в полете есть другая информация, которая может помочь нам в коррекции: мы знаем, что мы не упали. А если мы не упали, значит мы не перевернулись. То есть в среднем (именно в среднем!) в любом полете, который не закончился крэшем, крен и тангаж дрона равн

4 мая 2026 г.2 320В Telegram

Для каких проектов лучше всего подходит ESP32Я начинал возиться с идеей дрона на ESP32 довольно давно, и тогда ESP32 подвергался особенно сильной критике, как «несерьезная» платформа. Особенно критикуют «ненадежность», баги, нестабильные тайминги, в общем, все то, что не годится для серьезных проектов с большими тиражами.Доля справедливости в этом есть, и наверное проект с миллионными тиражами проще делать на проверенной STM. Но в мире существует не только задача делать многомиллионные устройства и системы с сверхтребованиями к таймингам.Лично я думаю, что ESP32 сейчас — это платформа №1 для получения фана от программирования. Неспроста она снискала такую любовь от DIY-разработчиков по всему миру. А фан важен — для привлечения людей, для сохранения мотивации к работе над проектом.У ESP крайне разнообразный и гибкий набор фич, который развязывает руки и позволяет экспериментировать. Тот же GPIO matrix — любой пин может быть назначен на любую функцию. Или очень гибкая настройка UART (включая инверсию линии данных), что позволило мне подключить SBUS-приемник напрямую к МК.Arduino в ESP32 — это first class citizen. Официальной поддержкой Arduino занимается сама Espressif, не сторонние разработчики. А Arduino позволяет на любой популярной ОС (Windows, Linux, macOS) в 3 клика получить рабочий тулчейн для сборки и разработки проекта. Попробуйте поставить и настроить родной тулчейн для STM на macOS — это далеко не простейшая задача, по пути можно растерять всю мотивацию.По фичам. ESP32 из коробки поддерживает работу с камерами, touch-датчиками, I2S (как универсальный костыль для коммуникации с чем угодно), конечно же, Wi-Fi/Bluetooth/BLE/ESPNOW и весь сетевой стек. Для всего есть удобные библиотеки и понятные примеры. Под капотом (даже когда это Arduino с его setup/loop) всегда крутится FreeRTOS, и при желании можно использовать все ее возможности.Так что если удовольствие от разработки важно — надо брать ESP32.А как вы выбираете платформу для своих проектов?

27 апр. 2026 г.2 260В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

Мониторинг напряжения батареи 🔋В моей плате есть цепь для измерения напряжения батареи, и ее надо было проверить. Цепь представляет собой делитель, подключенный к входному напряжению и GPIO-пину с поддержкой АЦП. Результат проверки оказался успешный, и заодно я наконец добавил в прошивку официальную поддержку мониторинга напряжения (ветка voltage).Зачем нужен делитель?Причина банальная. ESP32 может измерять напряжение только до 3.3 В (у батареи до 4.2 В), поэтому используется делитель из двух одинаковых резисторов, который делит напряжение пополам. Выход делителя подключен к пину GPIO3.Как реализованоКак обычно, я реализовал все в стиле минимализма, без сложных фильтраций и калибровок. В прошивку добавлен файл power.ino для всей логики, связанной с питанием. 10 раз в секунду он считывает напряжение с АЦП и пропускает через LPF-фильтр (на всякий случай, чтобы убрать выбросы).Для АЦП я пробовал использовать обычную ардуиновскую analogRead, но неожиданно выяснилось, что заводская калибровка АЦП, которая есть в ESP32, работает только с функцией analogReadMilliVolts, но не analogRead. Причем разница реально заметная — на полном заряде analogRead показывала 3.9 В, тогда как analogReadMilliVolts показывает корректные 4.2 В.Затем напряжение отдается в MAVLink-пакет BATTERY_STATUS и отображается в QGroundControl. Пришлось добавить туда фейковый процент заряда (тупо по вольтажу), потому что без него QGroundControl не рисует нормальную икону батареи. Также в консоль добавлена команда pw, которая показывает вольтаж.ИспользованиеЧтобы включить мониторинг напряжения, нужно установить параметры:🔹PWR_VOLT_PIN — пин, куда подключен делитель.🔹PWR_VOLT_SCALE — коэффициент делителя.Еще добавлен параметр PWR_VOLT_LPF_A - коэффициент LPF-фильтра для напряжения. Он подобран так, чтобы убрать шум, но не убирать реальную динамику.Если у кого-то дрон собран с цепью измерения напряжения и он сможет протестировать фичу — буду благодарен!

21 апр. 2026 г.2 010В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

Я решил, что надо все-таки протестировать мою плату на полет, несмотря на нерабочую IMU. Для этого я просто припаял внешнюю плату MPU6050 к выведенным пинам I2C, аналогично тому, как это делается в обычной версии Flix. Таким образом, вместо Flix2 у меня пока получился Flix1.5.На видео — самый первый полетный тест (реально). И как видно, дрон полетел! 🎉 Драйверы моторов работают и все остальное тоже.Так что теперь я исправляю все найденные косяки и заказываю вторую ревизию платы, потому что Flix1.5 это не так интересно, как Flix2.Я решил, что надо все-таки протестировать мою плату на полет, несмотря на нерабочую IMU. Для этого я просто припаял внешнюю плату MPU6050 к выведенным пинам I2C, аналогично тому, как это делается в обычной версии Flix. Таким образом, вместо Flix2 у меня пока получился Flix1.5.На видео — самый первый полетный тест (реально). И как видно, дрон полетел! 🎉 Драйверы моторов работают и все остальное тоже.Так что теперь я исправляю все найденные косяки и заказываю вторую ревизию платы, потому что Flix1.5 это не так интересно, как Flix2.

12 апр. 2026 г.2 630В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

С IMU не срослось, но зато разъем камеры на плате работает ✅Хотя накосячить в нем было намного проще. В числе прочего, интерфейс камеры (DVP) требует три отдельных уровня питания (3.3, 2.8 и 1.2 В), следовательно, два отдельных линейных стабилизатора со всей обвязкой.А работает этот интерфейс так:🔹Пин XCLK — внешнее тактирование для сенсора. На него обычно подается 20 МГц.🔹Пины SDA и SCL — стандартный I2C для настройки параметров сенсора. Можно включить сырой режим (просто пиксели) или режим JPEG.🔹Пины D0-D7 — 8-битная шина данных. Каждый новый байт сопровождается импульсом на пине PCLK.🔹Сигнал на пине VSYNC обозначает конец кадра. Сигнал на пине HREF — конец строки (в режиме JPEG не используется).🔹Пины PWDN (отключить питание) и RST (сброс) опциональны — их я не подключал.Я проверил с самой простой камерой на сенсоре OV2640 — работает и сырой режим, и режим JPEG. Использовал стандартный скетч CameraWebServer из примеров ESP32.А вообще, итоговая идея — заставить дрон летать автоматически с использованием компьютерного зрения на ESP32. Увидим, получится ли это сделать!

4 апр. 2026 г.2 660В Telegram
Flix: разработка полетного контроллера с нуля — пост в ТГ канале

Как выясняется, проектировать платы не так уж легко!Я долго пытался поднять IMU на плате разными способами, хотя бы считать его WHO_AM_I, но он упорно отказывался подавать хоть какие-то признаки жизни. Хотя питание на нем было. В итоге обсуждения в комментариях стало понятно, что чип подключен некорректно.Что привело к ошибке.Сначала я поставил на плату ICM-42688-P, я планировал использовать именно этот датчик. При подготовке к заказу я понял, что этот чип отсутствует на складах LCSC, и, похоже, не собирается там появляться. Поэтому я решил заменить его на ICM-40609-D (который «designed for drones»). Этот чип был в наличии.Чтобы поменять устройство, я изменил поле Device в его свойствах. После этого в EasyEDA открывается подробное окно предпросмотра, где показывается, как и что будет заменено в схеме и футпринте, и мне показалось, что все правильно. Но похоже, что все было абсолютно неправильно, потому что итоговый футпринт по расположению пинов получился совершенно не такой, каким он должен быть. На картинках показано реальное расположение выводов ICM-40609-D (слева) и какая разводка получилась у меня (справа). Как видно, разница значительная. Никто из ревьюверов этой ошибки не заметил, но ее было и невозможно заметить без изучения даташита.Мораль: при замене компонента в EDA никогда не стоит редактировать его прямо in-place, лучше просто удалить и поставить новый.Не вижу возможности исправить эту ошибку на месте, так что придется проверять все остальное и заказывать плату заново.Ошибку нашел @sklyaroman.Как выясняется, проектировать платы не так уж легко!Я долго пытался поднять IMU на плате разными способами, хотя бы считать его WHO_AM_I, но он упорно отказывался подавать хоть какие-то признаки жизни. Хотя питание на нем было. В итоге обсуждения в комментариях стало понятно, что чип подключен некорректно.Что привело к ошибке.Сначала я поставил на плату ICM-42688-P, я планировал использовать именно этот датчик. При подготовке к заказу я понял, что этот чип отсутств

31 мар. 2026 г.2 730В Telegram