Платы Flix благополучно доехали. Получил буквально только что.
Пока еще ничего не проверял, даже не включал. Работает ли что-нибудь — полная интрига.
По времени от заказа до получения вышел ровно месяц (не быстро).
Теперь надо проверить работоспобность всех подсистем, написать драйвер для IMU, и тестировать!
Пока еще ничего не проверял, даже не включал. Работает ли что-нибудь — полная интрига.
По времени от заказа до получения вышел ровно месяц (не быстро).
Теперь надо проверить работоспобность всех подсистем, написать драйвер для IMU, и тестировать!
👍40🔥25❤13🙏1
Результаты первых тестов платы
✅ Подсистема питания работает, плата запускается от USB, от батареи, и от обоих источников одновременно. Менял вход аккумулятора от 4.2 до 2.5В, buck-boost отрабатывает корректно. ⚠️ Обнаружил такую проблему: если плату сначала запитать от батареи, а потом подключить по USB, то она не будет видна в системе. Думаю, это скорее всего связано с прошивкой, вряд ли с разводкой.
✅ Заливка прошивки работает. В arduino-cli для этого нужно использовать такой FBQN: esp32:esp32:esp32s3:FlashSize=16M,PSRAM=opi. Также в Arduino и arduino-cli необходимо включать опцию USB CDC On Boot, чтобы все выводы в Serial можно было видеть по USB (аналогично тому, как это работает в платах с обычной ESP32).
❌ Но тут обнаружилась проблема: прошивка иногда стартует не с первого раза. То есть надо переткнуть питание 2 или 3 раза, и только тогда она запускается. Как будто есть какая-то проблема с пинами IO0 или EN. Подскажите, что это может быть?
✅ Прошивка Flix базово работает, Wi-Fi раздается, консоль отвечает. Я добавил в прошивку параметр RC_RX_PIN, который позволяет выбрать пин для SBUS‑интерфейса, и по умолчанию он равен -1, то есть SBUS теперь по умолчанию не запускается.
✅ RGB-светодиод — работает. ⚠️ Но когда управляющий пин не задействован прошивкой, то тыкая пальцем в плату, иногда можно включать его в рандомный цвет. Возможно, тут стоит что-то поменять в разводке, чтобы такого не было.
✅ Проверил выводы на моторы, они работают. ⚠️ В левом верхнем выводе перепутана полярность на шелкографии, но это не критично.
Работу IMU пока не проверил: ICM‑40609‑D довольно новая, и пока никто не написал для нее библиотеку для Arduino. Так что теперь займусь ее написанием.
В целом: супер-критичных косяков пока не нашел. В комментариях — несколько видео разных тестов.
✅ Подсистема питания работает, плата запускается от USB, от батареи, и от обоих источников одновременно. Менял вход аккумулятора от 4.2 до 2.5В, buck-boost отрабатывает корректно. ⚠️ Обнаружил такую проблему: если плату сначала запитать от батареи, а потом подключить по USB, то она не будет видна в системе. Думаю, это скорее всего связано с прошивкой, вряд ли с разводкой.
✅ Заливка прошивки работает. В arduino-cli для этого нужно использовать такой FBQN: esp32:esp32:esp32s3:FlashSize=16M,PSRAM=opi. Также в Arduino и arduino-cli необходимо включать опцию USB CDC On Boot, чтобы все выводы в Serial можно было видеть по USB (аналогично тому, как это работает в платах с обычной ESP32).
❌ Но тут обнаружилась проблема: прошивка иногда стартует не с первого раза. То есть надо переткнуть питание 2 или 3 раза, и только тогда она запускается. Как будто есть какая-то проблема с пинами IO0 или EN. Подскажите, что это может быть?
✅ Прошивка Flix базово работает, Wi-Fi раздается, консоль отвечает. Я добавил в прошивку параметр RC_RX_PIN, который позволяет выбрать пин для SBUS‑интерфейса, и по умолчанию он равен -1, то есть SBUS теперь по умолчанию не запускается.
✅ RGB-светодиод — работает. ⚠️ Но когда управляющий пин не задействован прошивкой, то тыкая пальцем в плату, иногда можно включать его в рандомный цвет. Возможно, тут стоит что-то поменять в разводке, чтобы такого не было.
✅ Проверил выводы на моторы, они работают. ⚠️ В левом верхнем выводе перепутана полярность на шелкографии, но это не критично.
Работу IMU пока не проверил: ICM‑40609‑D довольно новая, и пока никто не написал для нее библиотеку для Arduino. Так что теперь займусь ее написанием.
В целом: супер-критичных косяков пока не нашел. В комментариях — несколько видео разных тестов.
👍23❤7🔥6🙏1
Как выясняется, проектировать платы не так уж легко!
Я долго пытался поднять 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, я планировал использовать именно этот датчик. При подготовке к заказу я понял, что этот чип отсутствует на складах LCSC, и, похоже, не собирается там появляться. Поэтому я решил заменить его на ICM-40609-D (который «designed for drones»). Этот чип был в наличии.
Чтобы поменять устройство, я изменил поле Device в его свойствах. После этого в EasyEDA открывается подробное окно предпросмотра, где показывается, как и что будет заменено в схеме и футпринте, и мне показалось, что все правильно. Но похоже, что все было абсолютно неправильно, потому что итоговый футпринт по расположению пинов получился совершенно не такой, каким он должен быть. На картинках показано реальное расположение выводов ICM-40609-D (слева) и какая разводка получилась у меня (справа). Как видно, разница значительная. Никто из ревьюверов этой ошибки не заметил, но ее было и невозможно заметить без изучения даташита.
Мораль: при замене компонента в EDA никогда не стоит редактировать его прямо in-place, лучше просто удалить и поставить новый.
Не вижу возможности исправить эту ошибку на месте, так что придется проверять все остальное и заказывать плату заново.
Ошибку нашел @sklyaroman.
👍18🙏5❤3😢1
С 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. Увидим, получится ли это сделать!
Хотя накосячить в нем было намного проще. В числе прочего, интерфейс камеры (DVP) требует три отдельных уровня питания (3.3, 2.8 и 1.2 В), следовательно, два отдельных линейных стабилизатора со всей обвязкой.
А работает этот интерфейс так:
Я проверил с самой простой камерой на сенсоре OV2640 — работает и сырой режим, и режим JPEG. Использовал стандартный скетч CameraWebServer из примеров ESP32.
А вообще, итоговая идея — заставить дрон летать автоматически с использованием компьютерного зрения на ESP32. Увидим, получится ли это сделать!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍8❤4🙏2👌1
Я решил, что надо все-таки протестировать мою плату на полет, несмотря на нерабочую IMU. Для этого я просто припаял внешнюю плату MPU6050 к выведенным пинам I2C, аналогично тому, как это делается в обычной версии Flix. Таким образом, вместо Flix2 у меня пока получился Flix1.5.
На видео — самый первый полетный тест (реально). И как видно, дрон полетел! 🎉 Драйверы моторов работают и все остальное тоже.
Так что теперь я исправляю все найденные косяки и заказываю вторую ревизию платы, потому что Flix1.5 это не так интересно, как Flix2.
На видео — самый первый полетный тест (реально). И как видно, дрон полетел! 🎉 Драйверы моторов работают и все остальное тоже.
Так что теперь я исправляю все найденные косяки и заказываю вторую ревизию платы, потому что Flix1.5 это не так интересно, как Flix2.
🔥30👍10❤4⚡1
Мониторинг напряжения батареи 🔋
В моей плате есть цепь для измерения напряжения батареи, и ее надо было проверить. Цепь представляет собой делитель, подключенный к входному напряжению и 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-фильтра для напряжения. Он подобран так, чтобы убрать шум, но не убирать реальную динамику.
Если у кого-то дрон собран с цепью измерения напряжения и он сможет протестировать фичу — буду благодарен!
В моей плате есть цепь для измерения напряжения батареи, и ее надо было проверить. Цепь представляет собой делитель, подключенный к входному напряжению и 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_LPF_A - коэффициент LPF-фильтра для напряжения. Он подобран так, чтобы убрать шум, но не убирать реальную динамику.
Если у кого-то дрон собран с цепью измерения напряжения и он сможет протестировать фичу — буду благодарен!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤4🙏1
Для каких проектов лучше всего подходит 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.
А как вы выбираете платформу для своих проектов?
Я начинал возиться с идеей дрона на 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.
А как вы выбираете платформу для своих проектов?
👍30❤7🔥6🙏1
Главный миф об акселерометре
Хочу разобрать один миф, связанный с расчетом текущей ориентации дрона (attitude estimation). Миф заключается в том, что акселерометр якобы может измерять ускорение свободного падения / силу гравитации, и поэтому его можно использовать для коррекции расчета ориентации. Это не так.
Миф настолько глубоко укоренился, что проник почти во все популярные учебники по беспилотникам, и даже в код некоторых полетников. Но правда в том, что гравитация — это единственная сила, которую невозможно измерить акселерометром. Причем это фундаментальное физическое ограничение, не зависящее от стоимости устройства. Да, на столе акселерометр показывает 9.8, но это не гравитация — это сила реакции опоры. В случае, когда объект неподвижен, эта сила равна силе гравитации, но противоположна по знаку. Поэтому когда дрон не летит, по акселерометру действительно можно корректировать расчет ориентации, как это и сделано в моей прошивке.
Но теперь рассмотрим, какие силы действуют на дрон в полете. По сути их три: гравитация, тяга от пропеллеров и ветер. Акселерометр может измерить только последние две. В квадрокоптере конструктивно тяга от пропеллеров всегда направлена строго вверх, то есть без учета шума акселерометр всегда будет выдавать (0, 0, тягу пропеллеров) — это не зависит от ориентации вообще. Ветер может быть в любом направлении, от ориентации также не зависит.
Из этих рассуждений видно, что примешивание данных с акселерометра никак не помогает нам уточнить ориентацию, потому что в этих данных в принципе не содержится о ней никакой информации. Но расчет ориентации только по гироскопу неизбежно будет приводить к дрейфу по углу.
Получается, дрейф убрать нельзя?
Я предлагаю менее тривиальное решение. Дело в том, что в полете есть другая информация, которая может помочь нам в коррекции: мы знаем, что мы не упали. А если мы не упали, значит мы не перевернулись. То есть в среднем (именно в среднем!) в любом полете, который не закончился крэшем, крен и тангаж дрона равны нулю. Это хорошее приближение для большинства полетов.
Чтобы использовать эту информацию, нужно всего лишь подмешать чисто вертикальный вектор (0, 0, 1) в расчет ориентации, с небольшим весом. Я реализовал эту идею в ветке est-lvl, в функции applyLevel.
Интересно, что коррекция по акселерометру, как это делается везде, фактически дает нам тот же результат (помните, что тяга всегда направлена вверх?), но только намного шумнее, и с неверной мотивировкой — только в качестве побочного эффекта.
Резюмируя, для attitude estimation:
❌ НЕКОРРЕКТНО: подмешивать вертикаль с акселерометра в полете.
✅ КОРРЕКТНО: подмешивать вектор (0, 0, 1) в полете.
Я уже давно тестирую этот механизм, и он работает довольно хорошо: дрейфа реально нет. У кого есть дрон — протестируйте тоже!
В комментариях — примеры ошибочных формулировок, которые я нашел в статьях, книгах и в кодах прошивок.
Хочу разобрать один миф, связанный с расчетом текущей ориентации дрона (attitude estimation). Миф заключается в том, что акселерометр якобы может измерять ускорение свободного падения / силу гравитации, и поэтому его можно использовать для коррекции расчета ориентации. Это не так.
Миф настолько глубоко укоренился, что проник почти во все популярные учебники по беспилотникам, и даже в код некоторых полетников. Но правда в том, что гравитация — это единственная сила, которую невозможно измерить акселерометром. Причем это фундаментальное физическое ограничение, не зависящее от стоимости устройства. Да, на столе акселерометр показывает 9.8, но это не гравитация — это сила реакции опоры. В случае, когда объект неподвижен, эта сила равна силе гравитации, но противоположна по знаку. Поэтому когда дрон не летит, по акселерометру действительно можно корректировать расчет ориентации, как это и сделано в моей прошивке.
Но теперь рассмотрим, какие силы действуют на дрон в полете. По сути их три: гравитация, тяга от пропеллеров и ветер. Акселерометр может измерить только последние две. В квадрокоптере конструктивно тяга от пропеллеров всегда направлена строго вверх, то есть без учета шума акселерометр всегда будет выдавать (0, 0, тягу пропеллеров) — это не зависит от ориентации вообще. Ветер может быть в любом направлении, от ориентации также не зависит.
Из этих рассуждений видно, что примешивание данных с акселерометра никак не помогает нам уточнить ориентацию, потому что в этих данных в принципе не содержится о ней никакой информации. Но расчет ориентации только по гироскопу неизбежно будет приводить к дрейфу по углу.
Получается, дрейф убрать нельзя?
Я предлагаю менее тривиальное решение. Дело в том, что в полете есть другая информация, которая может помочь нам в коррекции: мы знаем, что мы не упали. А если мы не упали, значит мы не перевернулись. То есть в среднем (именно в среднем!) в любом полете, который не закончился крэшем, крен и тангаж дрона равны нулю. Это хорошее приближение для большинства полетов.
Чтобы использовать эту информацию, нужно всего лишь подмешать чисто вертикальный вектор (0, 0, 1) в расчет ориентации, с небольшим весом. Я реализовал эту идею в ветке est-lvl, в функции applyLevel.
Интересно, что коррекция по акселерометру, как это делается везде, фактически дает нам тот же результат (помните, что тяга всегда направлена вверх?), но только намного шумнее, и с неверной мотивировкой — только в качестве побочного эффекта.
Резюмируя, для attitude estimation:
❌ НЕКОРРЕКТНО: подмешивать вертикаль с акселерометра в полете.
✅ КОРРЕКТНО: подмешивать вектор (0, 0, 1) в полете.
Я уже давно тестирую этот механизм, и он работает довольно хорошо: дрейфа реально нет. У кого есть дрон — протестируйте тоже!
В комментариях — примеры ошибочных формулировок, которые я нашел в статьях, книгах и в кодах прошивок.
👍17🔥8❤6👏2🤯1
QGroundControl позволяет управлять дроном со смартфона, но сделано там это довольно убого — виртуальные стики издевательски маленькие, да еще и какие-то глючные.
Артур @goldarte сделал (не без помощи ИИ) свой собственный пульт для Flix, который гораздо удобнее, чем QGC! С большими удобными стиками и кучей настроек. Там также отображается батарейка и режим, и даже есть доступ к консоли (то есть можно делать что угодно). В общем, получилось довольно круто, так что теперь для полетов с телефона я буду рекомендовать именно его.
Так как это MAVLink (конкретно сообщение MANUAL_CONTROL), то этот пульт подходит не только для Flix, но и для PX4 и Ardupilot.
Код открыт: https://github.com/goldarte/mavlink-joystick. В релизах доступен APK-файл для установки, так что у кого есть Android — можно протестировать и написать, как вам!
Артур @goldarte сделал (не без помощи ИИ) свой собственный пульт для Flix, который гораздо удобнее, чем QGC! С большими удобными стиками и кучей настроек. Там также отображается батарейка и режим, и даже есть доступ к консоли (то есть можно делать что угодно). В общем, получилось довольно круто, так что теперь для полетов с телефона я буду рекомендовать именно его.
Так как это MAVLink (конкретно сообщение MANUAL_CONTROL), то этот пульт подходит не только для Flix, но и для PX4 и Ardupilot.
Код открыт: https://github.com/goldarte/mavlink-joystick. В релизах доступен APK-файл для установки, так что у кого есть Android — можно протестировать и написать, как вам!
🔥37👍17❤10🙏1
Media is too big
VIEW IN 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-proxy, который проксирует ESP-NOW в USB. Для QGroundControl это выглядит как обычное Serial-подключение к полетнику. Настройка: установить WIFI_MODE = 3, командой
По первым тестам работает прям хорошо, связь плавная, мгновенное подключение, никаких дисконнектов — см. демо-видео. В будущем попробую потестить на улице на нормальных расстояниях, в том числе long range режим.
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-proxy, который проксирует ESP-NOW в USB. Для QGroundControl это выглядит как обычное Serial-подключение к полетнику. Настройка: установить WIFI_MODE = 3, командой
espnow задать MAC-адрес наземной ESP.По первым тестам работает прям хорошо, связь плавная, мгновенное подключение, никаких дисконнектов — см. демо-видео. В будущем попробую потестить на улице на нормальных расстояниях, в том числе long range режим.
👍17🔥14❤3
Фича с ESP-NOW добавлена, но самое главное: наконец приехала плата Flix второй ревизии. В этот раз производство и доставка заняли 26 дней.
В прошлый раз не работала IMU (и еще по мелочи). На новой IMU я уже проверил. И она работает! 🎉
Проверить было не сложно, оказывается, ICM-40609-D в основном совместима с ICM-42688-P, а для нее есть драйвер для Arduino.
Теперь осталось, собственно собрать дрон и полететь.
В прошлый раз не работала IMU (и еще по мелочи). На новой IMU я уже проверил. И она работает! 🎉
Проверить было не сложно, оказывается, ICM-40609-D в основном совместима с ICM-42688-P, а для нее есть драйвер для Arduino.
Теперь осталось, собственно собрать дрон и полететь.
👍31🔥9❤7❤🔥2😁1🙏1
Дамы и господа: Flix 2 (на плате). И он летает!
На видео — один из самых первых стабильных полетов. Еще сегодня удалось полетать на улице, заодно проверить ESP-NOW, позже запощу видео (правда в итоге случился какой-то косяк, как раз о нем напишу).
На видео — один из самых первых стабильных полетов. Еще сегодня удалось полетать на улице, заодно проверить ESP-NOW, позже запощу видео (правда в итоге случился какой-то косяк, как раз о нем напишу).
🔥27👍11❤6🎉2🍾1
Media is too big
VIEW IN TELEGRAM
Уличные полеты Flix 2.
Снял видео с полетами в разных режимах, тестил связь через ESP-NOW. Вначале дрон летал отлично, управляемость была хорошая, связь вообще не рвется.
Потом он пару раз упал, и дальше что-то стало работать не так. Такое впечатление, что гироскоп сходит с ума, потому что идет очень сильный дрифт по углу и дрон становится неуправляемым. Причем это может быть не связано с падениями, потому что пару раз я наблюдал такой же глюк дома и до этого. В итоге дрон разбил, пока не понял, с чем именно связан этот баг.
Вот думаю, что это может быть? Надеюсь, это не косяк разводки платы (например, питания через dc-dc или ldo), потому что опять ее переделывать очень долго.
📷 Видео на Ютубе.
Снял видео с полетами в разных режимах, тестил связь через ESP-NOW. Вначале дрон летал отлично, управляемость была хорошая, связь вообще не рвется.
Потом он пару раз упал, и дальше что-то стало работать не так. Такое впечатление, что гироскоп сходит с ума, потому что идет очень сильный дрифт по углу и дрон становится неуправляемым. Причем это может быть не связано с падениями, потому что пару раз я наблюдал такой же глюк дома и до этого. В итоге дрон разбил, пока не понял, с чем именно связан этот баг.
Вот думаю, что это может быть? Надеюсь, это не косяк разводки платы (например, питания через dc-dc или ldo), потому что опять ее переделывать очень долго.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤23🔥15👍3😢2
Дрон починил (точнее собрал новый), летает, бага с гироскопом пока не наблюдаю. Для стоек теперь использовал TPU 95A, типа демпфирование.
Только мне все больше начинает казаться, что провода от моторов паять в отверстия не так уж и удобно. А особенно неудобно их перепаивать, в случае ошибки. Когда выкладывал проекты платы, многие советовали заменить отверстия на контактные площадки.
Хочу спросить у вас, все же что лучше для проводов, отверстия или контактные площадки? А может все-таки сделать разъемы?
Только мне все больше начинает казаться, что провода от моторов паять в отверстия не так уж и удобно. А особенно неудобно их перепаивать, в случае ошибки. Когда выкладывал проекты платы, многие советовали заменить отверстия на контактные площадки.
Хочу спросить у вас, все же что лучше для проводов, отверстия или контактные площадки? А может все-таки сделать разъемы?
👍8🤔1
Куда вам удобнее паять провода?
Anonymous Poll
30%
В отверстия
59%
На контактные площадки
10%
Не паяю провода
Пока моя плата работает с переменным успехом, появился еще один проект Flix на кастомной плате из Греции: Sprig-Drone. Причем даже с целым подробным видеоблогом про разработку и отладку! Видео реально интересное, рекомендую к просмотру:
📷 https://youtu.be/82Q-uBq6s48
Также выложены подробные схемы и документация. Я бы сказал, один из лучших проектов на базе Flix.
Также выложены подробные схемы и документация. Я бы сказал, один из лучших проектов на базе Flix.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥9❤3🍾1