После тестов планера с приемником на улице стало понятно что дальность Bluetooth у VR контроллера никакая. Пара метров - и сервы начинают подлагивать, в 5 метрах связи уже нет. Запустить с определенным положением руля можно, но управлять полетом уже не получится.
Решил пускать сигнал с VR пульта через ретранслятор. Тем более что изначально планировалось ставить на самолёт более лёгкую плату - двухграмовую ESP32C3 Pro Mini с выносной антенной, но из-за того что пульт не поддерживал BLE пришлось делать на Lolin32 Lite с обычным ESP32.
ESP32C3 Pro Mini
Гемини подсказал, что связать две платы ESP32 можно по протоколу ESP-NOW и это будет прям очень быстро (единицы миллисекунд) и далеко (сотни метров).
VR контроллер, ретранслятор и приемник
Схема такая получается: сигнал с VR контроллера отправляется по Bluetooth на плату ESP32, которая висит с павербанком где-то рядом на дереве. Миксуем каналы так как нам нужно и сразу же отправляем пакет дальше по ESP-NOW на приемник самолёта.
Ретранслятор из ESP32 с павербанком
Плату ESP32 для работы ретранслятором доделывать не нужно, возможно потом добавлю буззер для оповещений и всё. А вот на плате приемника надо закоротить диод для питания от 1S аккумулятора, иначе будет вырубаться уже при 3.9В. Если использовать внешнюю антенну через IPX разъем, то перепаять переключатель рядом с SMD антенной на сторону разъема.
ESP32C3 с закороченым защитным диодом
Чтобы связать приемник с ретранслятором нужно включить платы с прижатым к земле контактом Bind (pin6 на приемнике, pin13 на ретрансляторе). Приемник в состоянии бинда шлёт в эфир свой мак адрес, а ретранслятор ждет такое сообщение и получив запишет его.
Далее от приемника требуется только принять пакет с каналами управления и выдать PWM на пины сервам/моторам. Весь тюнинг будет делаться через прошивку ретранслятора, так что приемник можно паковать внутрь самолёта.
Средняя задержка на приемнике 12мс
Скетчи для ретранслятора и приемника загрузил на Github. В папке со скетчем нужно переименовать config_template.h в config.h и внести нужные настройки. Для приемника это например значения каналов при Failsafe, а для ретранслятора - калибровки контроллера и выбор микшера.
На кнопки VR контроллера ABCD повесил через микшер трим Yaw/Pitch чтобы можно было компенсировать потенциальную разницу в установке моторов и начальный угол руля высоты.
Раскладка кнопок на контроллере VR Box
На этом программная и аппаратная часть ретранслятора готовы. Сервопривод на столе откликается мгновенно, лаги исчезли, а связка Bluetooth + ESP-NOW работает стабильно. Дальность приема в поле на штатных антеннах составила не менее 100м, что для визуального полета мне пока будет достаточно. В следующей статье расскажу про подключение и тест моторов.
Чтобы управлять сервами на нашем самолете нужно передать с VR контроллера на ESP32 аналоговые значения c двух осей джойстика.
Так как контроллер у меня с Bluetooth, буду использовать библиотеку Bluepad32 для Arduino. Устанавливается она через менеджер плат, для этого нужно добавить в настройках ссылку на json.
Последняя доступная через Arduino версия Bluepad32 - 4.1.0
После установки нужно выбирать плату уже из нового набора и прошивать со стиранием, это влияет на потребление во время работы.
1/2
Настройки платы
Скетч собрал в DeepSeek и выложил на Github. Можно просто скопировать и залить на плату. После прошивки порядок действий такой:
Ресет ESP32 с кнопки
Включить VR контроллер
Нажать одновременно @+A
Подождать несколько секунд, плата ищет беспроводной gamepad, когда найдет включается LED (pin22)
Нажать одновременно @+B
После этого в терминал Arduino будут сыпаться значения с осей и кнопок VR контроллера, а на пины 12 и 14 начнет подаваться сигнал управления сервами.
Припаял землю и сигнал сервы к контактам G и 12, а питание к ноге разъема аккумулятора.
Возникла идея скрестить пульт от VR шлема и детский метательный планер.
Детский метательный планер с VR пультом
Чтобы не вышло слишком длинно сделаю несколько отдельных статей для каждого этапа эксперимента.
Концепция и выбор запчастей
Всё должно быть легально, легко переноситься и управляться одной рукой.
Буду использовать то что есть в наличии дома либо максимально доступные и дешёвые комплектующие с Авито и Алика.
Тушка
Выбрал обычный планер из EPP, это доступно и конструкция легко воспроизводима.
Метательный планер на Авито
Немаловажно ещё то, что прохожим внешний вид самолёта знаком по витринам Союзпечати и вопросов у них не должно возникать. Остановился на размахе крыльев 48см. Есть еще 36см и 85см. Маленький будет хуже летать, а большой с обвесом уже не влезет в 150г.
Электроника
С давних пор валяется кучка запчастей от вертолётика Pilotage Стрекоза Мини.
Вертолет Пилотаж Стрекоза Мини (Avito)
Аппаратура была переделана под использование с симулятором FPV Freerider, а вот две сервы ждали своего часа.
Сервопривод вертолета
Сервы с маркировкой PL0609-02D, 4 грамовые, на 20 зубьев, разъем JST 1.25мм, питаются напрямую от 1S аккума.
Аккумулятор буду использовать 6 грамовый от Mobula6 на 250mAh.
Приемник
Приемником будет выступать плата с ESP32. Если пульт будет с BLE, то подойдёт любая плата: ESP32S, ESP32H, ESP32C и обычная. Если пульт с Bluetooth, то заработает только обычная ESP32.
Lolin32 Lite на обычной ESP32
Одна из самых легких плат на ESP32 - Lolin32 lite. На ней есть запаяный разъем под аккумулятор, но если решите подключать батарейку от тинивупа с таким же разъемом проверяйте полярность.
Пульт
У меня нашелся самый простой восьмикнопочный с аналоговым джойстиком, именно этот с Bluetooth, но вроде как бывают в таком же корпусе с BLE.
VR контроллер
Полноценный AETR из него не достанешь, но для начала пойдет. Можно например джойстиком влево-вправо отклонять элероны, вверх-вниз - руль высоты, а двумя передними кнопками прощелкивать заданные значения газа.
Прошивка
Проект (пока) несложный, поэтому код буду писать для Arduino в какой-нибудь простой бесплатной иишке, например DeepSeek. Рабочий вариант получается быстро и с первого раза. Код буду выкладывать на Github, там же лежат файлы stl от качалок и кабанчиков.
На этом первая часть закончена. Выбор основных компонентов закрыт, осталось собрать это в кучу и заставить работать. Следующая часть будет про подключение VR контроллера к ESP32. Если появятся вопросы по текущему этапу — напишу дополнение к этой части.
Симптомы: · Потеря связи с реальностью · Везде мерещатся кубы с белыми глазами · Заходя даже в туалет на тебя смотрит Кубобот
Назначено лечение: Переключиться на другой проект
Пациент: В ответ на лечение пациент спаял еще одного кубобота
═══════════════════════
🤖 Всем лимонов! 🍋🍋🍋
После долгого пути проект обрел свое, так скажем, лицо. Форма устоялась, функционал стал ясен. Всё ещё есть шероховатости, которые устраняются, но тем не менее, уже есть объект и этот объект мне нравится.
Сегодня я бы хотел больше поведать именно о техничке того, как сейчас выглядит проект кубобот01.
Корпус состоит из 3 частей: тело, задняя крышка и лицо. Лицо у всех черное. А корпуса бывают разные. В итоге после сборки кубобот остается неразборным.
В своей основе каждый кубобот это миниатюрная плата ESP32-C3. чрезвычайно миниатюрная, но достаточно мощная чтобы выдержать напор моих амбиций.
Тот самый момент, когда в погоне за терабайтами памяти на ПК сидишь, смотришь на микросхемку и думаешь: "этих 4Мб мне просто за глаза"
Мои навыки в пайке растут пропорционально развитию проекта. Если первый прототип еле умещался в кубический корпус, то сейчас там и деталей больше и еще место остается. И наконец то я начал паять не эзернетом, найденным на помойке, а нормальными монтажными проводами.
Все компоненты максимально базовые для базированного ардуинщика, упакованые в кубик со стороной 33мм.
Но я не стою на месте. Например, DHT11 с прошлого поста был заменен на D18b20, потом на DHT22, а потом на BMP280. С остальными компонентами тоже происходят изменения как в наименованиях, так и в расположении. например, кнопка переехала на крышу, вместо левой стороны. Неизменным остается только ESP32C3 и, пожалуй, OLED дисплей. Хотя и он меняется в цветах.
В программной части так же без особых откровений.
Кубобот начинался с простейшей идеи чтобы что-то моргало рядом. И код состоял из 10-20 строчек, не считая #include и #define
Кстати, программирую в Arduino IDE просто потому что привык еще со времен проекта для своей машины, в котором использовался Arduino Nano. переучиваться на ESP-IDF не вижу практического смысла
ну вот, например. Из последнего. Нужно показывать уровень заряда аккумулятора. Если просто кинуть литиевый аккум на ногу МК он сгорит и придется покупать новый. Собираем делитель напряжения из того что валяется под ногами, методом научного тыка подбираем коэфициенты для формулы, подставляем в код и вуаля - кубобот уже реагирует на зарядку.
Почему 3200 не спрашивайте - не знаю. Просто подобрал мультиметром.
И вот на таких функциях строится вся логика кубобота.
Цикл loop содержит в себе только названия функций и соблюдает их очередность. И никаких delay(). Эта функция просто вешает МК и рушится магия происходящего. Ладно, delay() один все таки есть. на 2 секунды. Он при включении чтобы пользователь мог прочитать один из случайных советов
корпус один из первых, но фраза остается до сих пор
void loop() { readLDR(A0, 500); //поменяй на 500 и пин на А0 для кубика. для ЕСП32 1000 и 34 пин //readTempdDHT(); readTempBMP(); //readTempdDallas(); ReadVoltage(); static uint32_t warntmr; if (batteryLevel < 20) //раз в 30сек выводим пустую батарейку если заряда мало { if (millis() - warntmr >= 30000) { warntmr = millis(); // сброс таймера display.clearDisplay(); display.drawBitmap(0,0, battery_empty,128,64, 1); display.display(); delay(2000); } }
ButtonListener(); Gyro();
if (StateFlag) { StateMonitor(); } else { if (!DizzyAnim) FallAside(); DizzyGate(); if (DizzyAnim && !FallFlag) Dizzy(); if (BatteryEmote) showBat(); if(!BatteryEmote && !DizzyAnim && !FallFlag) RandAnim(); if(!BatteryEmote && !RandAnimFlag && !DizzyAnim && !FallFlag) roboEyes.update(); } }
В конце есть монструозная конструкция с булевыми переменными. Можно упростить, но как говорил тот самый: Можно, а зачем? Памяти не ест, отрабатывает хорошо. Если есть советы - буду рад прочитать их в комментариях
Что еще можно сказать? Я почти доволен тем что получилось, и уже постепенно планирую Кубобота02. Он будет огромным, куб со стороной целых 66мм! Монструозный!
А пока я хотел бы сказать спасибо тем, кто уже поддержал проект, купив кубоботов.
1/2
Благодаря им я не забрасываю, а постоянно развиваю и совершенствую как программную, так и аппаратную часть. Как минимум, паяю уже нормальными проводами и не паяльником из фикс прайса.
На этом, пожалуй, стоит остановится.
Спасибо, что дочитали до конца! Буду рад Вашему мнению в комментариях!
Чтобы красиво завершить пост - вот вам фотография попувермы!
Прошло уже 7 лет, как я делал это устройство. Пришло время показать его тут))
Можно сказать, что с этой идеи лампы и начался мой путь в электронике.
Еще в доковидное время я очень много фотографировал, и был в творческом поиске новых световых решений, чтобы создавать какие-то уникальные и классные кадры.
Но начнем с теории.
Что такое фризлайт.
Если коротко, то фризлайт - это искусство рисования светом в пространстве.
Основная идея - съемка на камеру при длинной выдержке. Чем дольше выдержка - тем больше времени матрица фотоаппарата принимает поступающий свет.
Чем дольше источник света в кадре на одном месте, тем он ярче. Если он движется во время съемки - получается какой-либо световой рисунок.
Например, при съемке салютов это очень заметно.
Либо вот съемка ночного города, фары машин оставляют следы в кадре.
Кроме этого, можно создавать световые рисунки своими руками, например, цветными фонариками. Конечно, если фонарик не такой яркий как окружение, линия света не будет так заметна.
Но чтобы нарисовать большие и сложные картины вручную одним или несколькими фонариками потребуется очень много времени и сноровки. А в фотошопе реалистично такое вообще не нарисовать.
И кстати, современные нейросети, тоже врядли нарисуют что-то адекватное, что будет ощущаться как фризлайт. Так как это очень не популярный вид съемки, получается обучающих данных совсем мало и скорее всего будет какая-то ерунда.
Итого чтобы создавать фризлайт потребуется:
Источник света
Фотоаппарат
Штатив или другая подставка для камеры чтобы избежать дрожания
Баланс яркости внешнего освещения и источника света
Если загуглить фризлайт, то будут, например, вот такие картинки:
То есть обычно берется точечный или "длинный" источник света и им в кадре "рисуют" какие-либо формы.
Думаю можно представить сколько времени и дублей занимает один такой удачный кадр. Плюс сильно ограничивает однотонность источников света.
С чего началась моя лампа
Думаю все знают DIY-блогера Alex Gyver. И как-то смотря ютуб, мне попался его канал. И я наткнулся на видео "Рисую светом. Голограмма своими руками".
Это как раз была основа моей будущей лампы.
Собрав всё по инструкции на проводках, у меня всё даже заработало. Но это выглядело ужасно))
Сразу же это было переделано в чуть чуть улучшенный вид и управление переделано на ИК - пульт.
Спустя некоторое время, научился делать печатные платы "на коленке". Спустя кучу итераций, получилось как минимум избавиться от кучи проводов в лампе, но платы всё равно выглядели ужасно.
Научившись проектировать платы, сделал уже что-то нормальное и заказал в Китае. Да, всё на "базовых" модулях, но явно лучше чем было))
Вот так выглядели мои платы из 2019 года. Кроме этой лампы я проектировал и другие источники света, о них может потом расскажу.
Немного о самой лампе
Постараюсь объяснить как работает лампа. Её основа это адресные светодиоды, которые могут переключать свой цвет отдельно от других в линии.
Получается берем картинку шириной в количество пикселей в лампе, и через эти светодиоды включаем построчно с задержкой. Как старые лучевые телевизоры, но надо двигать своими руками "изображение".
Вот так наглядно это выглядит, если включить специальный эффект "повторения предыдущего кадра" в Premiere Pro.
Кстати, саму лампу я обернул черной пленкой, сделав окошко для экрана.
Нижняя часть лампы откручивалась. Внутри был картридер, тумблер включения и разъем зарядки.
Было очень много настроек и режимов, которые я написал поверх кода чтения картинки от Alex Gyver. Приходилось бороться с Ардуино, которому очень не хватало мощностей на всё))
Было вот такое минималистичное меню
Фоток внутренностей лампы в сборе, к сожалению, не осталось, зато сохранилось итоговые фото с фризлайтом.
Фотки. Много фоток.
Думаю, стоит начать с того, что мою лампу для съемок брал Лампас Покрас. Помните такого?
И забавный момент, лампа как раз подглючивала, и тем самым получился интересный глитч эффект.
А вот моими первыми кадрами были "зарисовки" с Марио. Выбрал картинки, чтобы дополнить городские пейзажи.
На всякий случай повторю, что здесь нет фотошопа =))
Причем именно с этой версией лампы у меня было не так много съемок, так как хотелось больше удобства в работе, какой нибудь экранчик и всё такое. И еще тогда я переключился на проектирование второй версии лампы.
Но вот еще откопал кадры
Можно заметить, что лица девушек в кадрах хорошо освещены. Это я подсвечивал вспышкой в конце кадра. То есть допустим была выдержка 15 сек, я пробегал с лампой, а потом в конце вспышка высвечивала человека.
Жаль не снимал видео, как съемка фризлайта выглядит со стороны. В темноте стоит модель, какой-то чувак машет лампой и в конце яркая вспышка)))
Бонус от нейросетей.
В процессе написания, мне всё таки было очень интересно, смогут ли современные нейросети нарисовать что-то адекватное и похожее на настоящий фризлайт, или будет прям сильно заметно, что это нейрослоп))
Конечно, я не запаривался с промтами, чтобы получить идеальный результат, но вот такое получилось с помощью chatGPT.
Присылайте в комменты свои варианты "фризлайта" от нейросетей =))
Надеюсь, вы узнали что-то новое для себя о мире фотографии =)
Симптомы: · 3D-принтер перестал понимать, когда у него выходной · слово «финальная версия» потеряло смысл · девушка на пвз угощает чаем как родного
Назначено лечение: Закончить хотя бы один прототип.
Пациент: Начал переделывать предыдущий.
═══════════════════════
🤖 Всем лимонов! 🍋🍋🍋 После первой части многие спрашивали, где же сам робот. Один из комментариев вообще был прекрасен:
«А части-то зачем? Хоть прототип покажи.»
Ну что ж... сами напросились. 😄
Сегодня будет то, что обычно остаётся за кадром. Те самые фотографии, которые сначала хочется удалить, а спустя время понимаешь — именно с них всё и началось.
Если сейчас Кубобот выглядит примерно вот так...
Кубобот01 Аккумуляторный
...то первые прототипы были вовсе без корпуса. А первые корпуса были похожи на нечто странное и бесформенное (у самого первого было сплошное лицо с вырезом больше экрана). ____________________________________________ После первой эйфории наступил момент, когда идею пришлось превратить во что-то, что можно взять в руки.
В голове всё выглядело предельно просто. Маленький корпус, экран, плата... Ну что тут может пойти не так?
Как выяснилось позже — примерно всё.
Определившись с наполнением кубобота, и кое как написав код который просто моргает глазками, я сел моделировать корпус. Выбрал для себя минимальный размер под OLED 0.96" дисплей - 31мм по внешним стенкам. До этого мне казалось, что куб — одна из самых простых геометрических фигур. Оказалось, это мнение существует ровно до тех пор, пока не пытаешься запихнуть внутрь экран, плату, разъём USB, датчики, провода и при этом сделать так, чтобы крышка ещё и закрывалась.
Первый напечатанный вариант выглядел... оптимистично. На экране компьютера он казался аккуратным и современным. В руках же напоминал что-то среднее между корпусом сигнализации и экспериментом начинающего моделиста.
Но зато он был настоящий.
И это ощущение сложно описать. То, что ещё неделю назад существовало только в голове, вдруг оказалось у тебя на ладони. Начиная многие проекты, которые не уходили дальше бредборда, держать маленький кубик, который моргает было поистине победой.
Пусть кривоватое.
Пусть с щелями и неровной печатью.
Зато своё. Это действительно греет мне душу по сей день. ___________________________________ Дальше началась самая настоящая война за миллиметры.
Каждый новый корпус был почти идеальным. Почти.
То экран выпирал на миллиметр так что не прилегала лицевая пластина. То плата неожиданно упиралась в стенку. То USB-разъём оказывался настолько глубоко, что подключить кабель можно было разве что пинцетом.
Самое смешное, что после каждой такой доработки внутренний инженер уверенно говорил:
— Ну вот теперь точно всё.
Через пару часов начиналась печать следующей «финальной версии».
три первых корпуса. самый нижний с fuzzy skin
В какой-то момент рабочий стол перестал быть рабочим столом и превратился в археологические раскопки электроники. Тут лежит дисплей, там какие-то винтики, рядом катушка пластика, а где-то под этим всем, если очень повезёт, можно было найти компьютерную мышку. Уже позже выделил под свои изыскания отдельный стол.
Когда корпус наконец перестал разваливаться от одного взгляда, настало время оживить робота.
Я собрал навесным монтажом все внутренности и впервые подал напряжение.
Казалось бы, два светящихся прямоугольника. Что в них особенного?
Но кубобот уже смотрел на меня, как будто осознавая себя в этом мире. С немым вопросом почему он голый и висит на крокодиле для пайки
Именно тогда впервые поймал себя на мысли, что делаю уже не просто электронное устройство.
Я делаю маленького друга.
Затем уже ценой больших усилий смог укомплектовать это всё в небольшой кубик со стороной в 31мм. Не самое лучшее расположение компонентов, но на то он и прототип чтобы быть невзрачным, но рабочим.
Потом были эксперименты с цветами корпусов.
Честно говоря, я не знаю зачем вообще это делал, не имея готового продукта. Просто взял у сына мотки его PLA пластика для 3д ручки и напечатал несколько тестовых корпусов.
Зато стало ясно, что Кубобот совсем по-разному воспринимается в разных цветах. Один выглядит как серьёзный гаджет, другой — как игрушка, третий вообще словно просится кому-нибудь в подарок.
Знаете, что меня удивило больше всего?
Я был уверен, что основная сложность окажется в электронике. Или в программировании.
Но больше всего времени неожиданно съел именно корпус.
Снаружи кажется, будто это просто маленький пластиковый кубик.
А внутри каждый миллиметр приходится буквально отвоёвывать. Внешне корпуса не отличались ничем. Зато внутри постоянно были изменения в расположении элементов для расположения платы и прочей требухи.
Именно тогда я понял простую вещь: самые незаметные детали обычно требуют больше всего времени.
Сейчас я иногда специально открываю фотографии первых прототипов.
Не чтобы посмеяться.
Хотя... иногда и чтобы посмеяться тоже.
Скорее чтобы напомнить себе одну простую мысль.
Любой проект, который в итоге выглядит аккуратно, когда-то выглядел так, что показывать его людям было немного неловко.
И знаете что?
Наверное, это совершенно нормально. В следующей части расскажу больше о тонкостях программной части, о дальнейшем развитии и расширении линейки. Которе, само собой, привели с собой новые трудности. И всё это ради того, чтобы два маленьких голубых квадрата начали казаться чуть более живыми.
А как думаете вы? Что оказалось самым сложным в разработке?