THE ONE CUBE
13 постов
Коротко - перенес змейку на новый игровой движок, спроектировал печатную плату куба V1.5, победил автотайлинг, сделал мини-игру про подземелье с фонариком, придумал, где брать готовые игры (Flash, и это не шутка), полностью перенес ядро с ардуино на ESP-IDF, почти собрал лаунчер игр и переписал систему рендера.
ПРЕДИСЛОВИЕ
Для тех, кто видит меня впервые: я в одиночку разрабатываю The One Cube - мини игровую консоль в форме куба с 6 экранами. Внутри - ESP32, акселерометр, батарейка, карта памяти. Управление - наклонами и вращением самого куба.
ГЛАВА 1. НОВЫЙ ДВИЖОК И ЗМЕЙКА
Змейка переехала на новый движок. На вид тоже самое, но это принципиально другая реализация, чем раньше.
Движок пишется с нуля вместе с нейросетью GLM. Система видит весь проект в папке и сама правит файлы.
Движок почти доведен до кроссплатформенности: один и тот же код работает и на компе, и на кубе - куб в этой схеме просто ещё один "видеовыход".
Сложно разрабатывать что-то под есп32 с ИИ. Технические тесты оно пишет само, но картинку и железо проверить не может. Приходится перепрошивать куб каждый раз и смотреть на результат.
Так же сделал ревизию чужого опыта - разобрал около 40 папок с чужими движками и кодом игр, из каждой выписал, какие идеи стоит перенять.
И вообще, мне кажется, сам бы я такое никогда не сделал бы, даже учитывая что программист по образованию. А тут просто расписываешь системы / задачи и получаешь готовый результат за пару дней.
ГЛАВА 2. ПЛАТА ВЕРСИИ 1.5
В прошлых месяцах, когда я разрабатывал вторую версию кубика, была идея просто отказаться от железа первой версии, продав его "как есть". Но просто железо никому не нужно. А выбрасывать 60 экранов и 10 акселерометров жалко.
Так родилась V1.5: тот же один проц и тот же габарит, но плата переразведена заново, питание и часы реального времени взяты из второй версии, разводка экранов более аккуратная. Влез еще и вибромоторчик.
Да и по деньгам это заметно дешевле, чем сразу городить двухпроцессорный "бутер". Сначала обкатаю игры на этой версии железа, потом уже сделаю полноценную вторую версию.
И еще решил прикольнуться - шелкография на платах всё равно бесплатная. Сгенерил картинки и вставил в платы. Заодно и посмотрю, как будут выглядеть мелкие рисунки.
Китайцы на заводе, думаю, оценят такое творчество))
И ради экономии, закажу 2 платы как одну. Порезать - не проблема =)
И еще при проектировании плат очень важно их перегонять в 3D модель и смотреть как они сходятся между собой и другими частями изделия.
Это немного неудобно, приходится делать скриншот платы в EasyEDA и переносить как картинку на 3D модели.
Но главный факт в том, что когда перенес, увидел еще кучу ошибок)) Разъемы не сходились, элементы на плате задевали другую плату.. Хорошо что вовремя заметил.
Жаль все эти красивые рисунки будут заметны только при сборке, а потом всё перекроется экранами и корпусом =(
ГЛАВА 3. КАРТЫ И АВТОТАЙЛИНГ
Идея же в том, чтобы не изобретать велосипед каждый раз, а находить уже готовые решения. Во многих играх локации строятся автоматически на основе всякой математики и подготовленных картинок - тайлов. По сути как конструктор лего.
Поэтому я перерыл весь инет и собрал всё что можно на тему математики игр, движков и прочего. На тот же автотайлинг было с десяток полезных ресурсов.
Автотайлинг это по сути просто набор команд на основе ячейки и её соседей. Но при вайбкодинге и даже готовых исходниках, нейросети всё равно прям жутко тупят. Пока не объяснишь как ребенку алгоритм для каждого краевого случая, оно нормально не заработает.. Убил на это кучу времени, сжег дофига кредитов и пару раз уперся в лимиты.
Но в итоге всё таки получилось сделать генератор данжа на базе бесплатного тайлсета. Получилось в принципе неплохо, я считаю.
И чтобы было удобно работать с этими генерациями, сразу сделал формат вывода под программу Tiled.
И еще обнаружил прям жирнющий минус этих бесплатных тайлсетов, с чего просто сгорел.
Вот есть у нас набор картиночек 16*16 или 32*32 пикселя, обычно от 100+ элементов. И нигде не подписано, что это означает каждая иконка.
То есть для автотайлинга должна быть подпись каждой ячейки, например "земля слева стена справа" или "пустая земля" или "артефакт зелье". Пришлось разглядывать, как китаец в меме, каждый тайл и подписывать его назначение.
Даже существует свежее исследование, где ученые пытались через ИИ анализировать бесплатные тайлсеты.
Вот тут статья кстати
То есть они так же вручную разметили каждую ячейку и сравнили с тем, как это распознает ИИ. Как я понял, результаты получились так себе.
НО, они выложили все свои наработки с подписями картинок в инет. Так что теперь у меня есть целая библиотека монстров и артефактов.
У меня прям навязчивая идея сделать свою Vampire Survivors на кубике. Как раз такие картиночки должны подойти.
Учитывая что у меня на кубе экраны 240*240, самую мелкая читаемая сетка это 15×15 (тайл 16×16). Далее уже получаются сетки 12×12 (20×20), 10×10 (24×24), 8×8 (30×30), 6×6 (40×40).
ГЛАВА 4. ПОДЗЕМЬЕ С ФОНАРИКОМ
После автотайлинга и пинания нейросетей, получился концепт простенькой игры - надо найти выход из лабиринта, когда факел кончается, а направление выхода указывают определенные ячейки.
Здесь я конечно намучался с ИИ. В обучающих данных видимо никто не делал игр на кубической консоли, и была постоянная путаница с поворотами и взаимодействиями объектов, переходящих между гранями.
По сути получилась некоторая база для будущих тайловых игр.
ГЛАВА 5. FLASH
Вот полгода я разбирался с железом, писал драйвера экранов и тд и тп. А полноценных игр то на платформе нет..
И пришла идея - а вот раньше было множество браузерных игр. А может их можно как-то портировать.. И как оказалось, снова нейросети легко переваривают эти флеш-игры и переводят из скриптового языка в нормальный.
Плюс в этих играх кроме самого кода, много красивой графики, прописан сюжет, механики и тд..
Минусы в таком подходе тоже есть. Самая сложность - найти НОРМАЛЬНЫЕ игры из библиотеки 200 000 игр, а потом из них еще подобрать подходящие под мини экраны и управление наклонами.
Сюда неплохо должны встать 2D-игры с видом сверху / сбоку, лабиринты, логические задачки, сокобан (жанр "кладовщик"), кликеры и идл-игры. Пара десятков разнообразных игр точно должно набраться.
Вот несколько примеров:
И видимо первое время буду заниматься именно портированием игр, а когда библиотека игр будет достаточно большая, можно будет придумывать что-то своё.
Отдельно для ностальгирующих: программа Flashpoint - огромная библиотека флеш-игр. Можно сказать "FLASH - STEAM".
ГЛАВА 6. ЯДРО, ЛАУНЧЕР, 20 FPS
Еще чем удобен именно агентный ИИ с доступом к файлам - он может запускать скрипты, компилировать и проверять ошибки. Тем самым я быстро выкинул ардуино из проекта.
С лаунчером пришлось прям повозиться. То текст не работал, то меню раскладывалось криво. Даже побыл немного UI дизайнером, и нарисовал раскладку экранов.
Скорее всего система поменяется не раз, но главное получилось рабочее меню через перекаты куба.
И бонусом, еще раз вернулся к рендеру на экранах. Частично была переписана несущая библиотека во всем кубе. Не без косяков, конечно)))
Увидел, как выглядит рассинхронизация отправляемых на дисплей данных.
Жаль только получил всё те же 20FPS при отрисовке всех 6 граней. Быстрее железо не может ну никак.
ЧТО ДАЛЬШЕ?
Заказать и собрать платы V1.5. Домучать лаунчер и ядро (сейчас еще нет анимаций и других полезных штук).
И начать портировать игры.
Этот пост - компиляция записей из моего блога в тг, где я каждый день пишу о жизни и работе над всеми своими проектами. Кому интересно - загляните.
Прошлые посты:
Август '25 - LED CUBE. Дневник разработки. Август '25
Сентябрь '25 - THE ONE CUBE. Дневник разработки. Сентябрь '25
Октябрь '25 - THE ONE CUBE. Дневник разработки. Октябрь '25
Ноябрь '25 - THE ONE CUBE. Дневник разработки. Ноябрь '25
Зима '25 + Лето '26 - THE ONE CUBE. Дневник разработки. Зима '25 + Лето '26
Почти год назад я показывал самую первую игру на моей мини консоли.
Вот тот самый пост - LED CUBE. Первая игра - 6D змейка
Теперь с современными нейросетями, получилось объединить кучу моих концепций, кусков кода в одном месте. И понемногу развивать свой игровой движок. Можно сказать, что сейчас это версия v0.1, но она уже работает.
Внутри Esp32 S3 N16R8 + microSD 32GB.
Экранов 240*240 пикс хватает, чтобы рассмотреть красивые текстуры фона. Дракончик и кристаллы не настолько хорошо различимы. Но это уже дело дизайна.
Спрайты дракончика выглядят так:
И яблоки - кристалики, одна форма разных цветов:
Чуть позже планирую сделать и другие игры, добавить менюшки и всё такое.
Впереди еще много работы.
Кстати, в моем TG-канале я пишу о продвижении этого проекта и других своих разработках
Коротко - зимой сделал световые мечи, которые управляются игровым кубом, снял новогоднюю фотосессию, частично приостановил проект, а потом вернулся и полностью переделал архитектуру куба на два процессора: развёл 4 платы размером 40×40 мм, разогнал шину между процами до 55 МБ/с, подключил звук, лаунчер прошивок и начал писать свой игровой движок с нуля.
ПРЕДИСЛОВИЕ (почему пост за 9 месяцев, а не за месяц)
Для тех, кто видит меня впервые: я в одиночку разрабатываю The One Cube - карманную игровую консоль в форме куба с шестью дисплеями. Внутри - ESP32, акселерометр, батарейка, карта памяти. Управление - наклонами и вращением самого куба. В прошлых постах (ссылки внизу) я собрал первую партию из 10 кубов, выжал из железа 20 FPS на все грани и написал первые игры.
Раньше я выкладывал месячные отчеты, когда прям плотно работал над кубом. А в этот раз как немного поделал проект зимой, весной разработка приостановилась, а летом снова взялся за проект.
Так что в этот раз не хронологический, а тематический / идейный отчет.
ГЛАВА 1. СВЕТОВЫЕ МЕЧИ, КОТОРЫМИ УПРАВЛЯЕТ КУБ
Зимой мне в голову пришла буйная идея: а что если кубик - это не просто консоль, а сердце целой экосистемы устройств на основе акселерометра?
И первое, что я решил сделать для зрелищности - бесконтактный бой на световых мечах.
Идея игры:
- 8 направлений рубящих ударов по "циферблату";
- удар контрится блоком в перпендикулярном направлении;
- каждое действие тратит выносливость, незаблокированный удар идёт по здоровью.
По сути меч это светильник-палка на адресной светодиодной ленте и esp32. К нему приделал снизу куб с акселем. Обмен данными между всеми esp32 по ESP-NOW (быстрый протокол поверх Wi-Fi).
Собралось всё не без классики жанра: традиционный колхоз с проводками, платы для кнопок из обрезанной макетки, а 3D-печать, как обычно, сошлась не с первого раза - криво насверлил отверстия в алюминиевом профиле, пришлось перепечатывать рукояти.
Зато в темноте это выглядит прикольно - клинок с двойной подсветкой, на котором можно выводить полосы здоровья и выносливости.
Самое сложное оказалось не железо (его я собрал за пару вечеров), а математика. Если делать простые, не размашистые удары - всё распознается более менее правильно. Но стоит занести меч высоко, острием в потолок - и акселерометр считает полную чушь. Пришлось долго разрабатывать правильную систему считывания направления ударов.
Чем заниматься в новогоднюю ночь? Конечно же веселить прохожих и драться на световых мечах =))
Со стороны выглядит очень забавно и даже как-то работает.
Но после этого одного теста оказалось что не хватает звукового сопровождения "попадания" и вообще при динамичном бое, лучше выкинуть всю систему с "накоплением" блока.
Может быть когда нибудь еще что-то придумаю на основе этой идеи. После НГ эти мечи так и лежат на полке.
ГЛАВА 2. НОВОГОДНИЙ ПАРТИЗАНСКИЙ МАРКЕТИНГ
Параллельно с мечами продолжалась моя традиция партизанского маркетинга - пытаться достучаться до известных D&D-шоу, чтобы они заметили мой кубик и возможно использовали его в своих играх. После неудач с VLDL и Critical Roll настала очередь "Подземелий Чикен Карри" (шоу, где российские блогеры играют в настолку по D&D правилам).
Вместо лимончиков в слот-машине (одна из механик куба - слоты с ручной остановкой барабанов) я сделал тематическую версию под шоу.
А в последний день 2025-го решил вместо новогоднего стола с оливье собрать стол с днд реквизитом и елкой. А в центре поставил свои кубы.
Почти сотня фоток, много переделок монтажа - и получился новогодний клип, который я отправил в ТГ-канал ПЧК. Фидбека от команды так и не дождался.
Но зато остались вот такие кадры.
Весной проект с кубом приостановился. Единственное что сделал - новый скин слот-машины для выставки фото-видео оборудования CPS-2026. Показал парочке человек и всё.
ГЛАВА 3. НОВАЯ АРХИТЕКТУРА: ДВА ПРОЦА ВМЕСТО ОДНОГО
И еще единственная мысль, которая посещала меня в течение весны, что производительности есп32, как сердца кубика, маловато. Но получается ему нужно и логику считать, и на экраны выводить картинки. Да и памяти как-то маловато. Тот же потолок в 20фпс меня не очень радовал, если обновлять все экраны одновременно, конечно.
И то, "условный рендер" отъедает большую часть процессорного времени, которое можно было бы потратить на какую нибудь интересную логику игр, физику столкновений и тд.
Придумал некоторого франкенштейна:
- ESP32-S3 - "мозг": логика игр, датчики, Wi-Fi;
- RP2350 - "видеокарта": только отрисовка на 6 экранов.
При этом давно хотелось уменьшить кубик, чтобы были поменьше рамки между экранами. И это получилось.
При этом вместе с новой "видеокартой", в новом кубике появился мини-динамик и 2 вибромотора. Но пришлось добавить отдельную плату для rp2350.
ГЛАВА 4. ИГРА В ВОДОПРОВОД: ПЛАТЫ НА 40×40 ММ
Летом я увлекся проектированием плат. Называю это "игрой в водопровод": раскидать компоненты на плате и аккуратно соединить их дорожками - залипательное занятие и мозг разомнешь. Особенно когда места ну совсем мало: большинство компонентов пришлось уменьшать до типоразмера 0402. Чувствую, скоро дойду до проектирования плат телефонов))
Схема работы такая: сначала раскидываю крупные компоненты на 3D-модели корпуса (чтобы точно знать, что всё влезет и разъемы выйдут куда надо), и только потом развожу дорожки в EasyEDA.
Получился такой бутерброд из плат:
- Плата ESP32
- Плата "видеокарты" с RP2350
- Отдельная плата памяти
- Центральная плата с акселерометром
- Нижняя плата с динамиком и подключением 6 экрана
Хочу заметить такое маленькое, но важное архитектурное решение.
Всегда стараюсь выжимать из железа максимум. Сначала была идея поставить RP2354 со встроенной флеш памятью. Но там внутренняя память работает на 3.3V. А чтобы разогнать PSRAM, лучше использовать микрухи на 1.8V. Плюс еще просто места на плате мало.
Тем самым появился "картридж" памяти на отдельной плате под RP3250.
И еще раз моя любимая картинка =)
Хочется сказать, что замучился с проектированием этого бутера из двух процов. Там соедини, тут учти кто с кем соединяется, и всё умести в 40*40мм..
ГЛАВА 5. ТЕСТЫ НА КОЛХОЗЕ ИЗ ДЕВКИТОВ
Учитывая мой предыдущий опыт с кубиком версии 1, где пришлось иправлять косяки проводками прям на плате, в этот раз я решил перепроверить все основые системы сначала на девкит модулях.
Первым пошла малинка. Буду так называть RP2350. Кстати, не так просто было найти именно RP2350B c большим количеством выводов.
В малинке вообще есть специальная система PIO. С которой в ардуино IDE нормально работать не получится. Пришлось переехать в VS Code.
При этом еще неожиданный факт - оказалось что малинка очень плохо работает с китайскими микросд картами. Тем самым пришлось переделывать платы и возвращать подключение карточки памяти на есп32. Но тогда встал вопрос - а как передать кучу текстур с микросд на малинку.. И нашел решение - поднял 8 битную шину в стиле Intel 8080 между этими процами. И как раз всё на автоматах PIO.
И что вообще было для меня шоком - эта система заработала без сбоев на 60МГц. Если верить замерам на экране, скорости там под 55МБ/с. Учитывая что связка есп32 + микросд карта может отдавать только 12МБ/с, такой шины точно хватит))
Вот тут можно услышать, как звучит динамик. Возможно я его слишком перегрузил, надо будет еще поиграться с настройками. Но это лучше чем вообще без звука.
Ну и еще главный вопрос - а как вообще прошивать эти два проца, если выйдет обновление прошивки. Учитывая что USB один на всех? Сначала пытался это сделать через дергание пинов rp2350, чтобы есп32 увидел малинку как флешку и залил туда прошивку в виде UF2. Провозился с этим долго и в итоге ничего не вышло.
Сошелся на топорном решении - поставить usb разделитель. Есть такая мини микруха, которая при подаче определенного сигнала переключает линии. Тем самым в меню кубика можно будет просто выбрать, кого перепрошивать и есп32 переключит линию и переведет малинку в режим флешки для компьютера.
Бонусом прокачал фишку "весь куб притворяется флешкой для компа": раньше давало 300 КБ/с, сейчас 800-900 КБ/с. Похоже это предел для этого проца. Тут именно идея загрузки самих игр на карточку памяти.
И также пришел к системе лаунчера игр-прошивок внутри одной памяти есп32 за счет встроенной функции "OTA". После изучения других идей, оставил именно топорный метод с перепрошивкой флеш памяти.
Но учитывая что новые игры будут "ставиться" в куб не так часто - память не посыпется. Там около 100тыс перезаписей может быть.
Ну и эта система работает. "Игры" переключают друг друга.
ГЛАВА 6. ДВИЖОК С НУЛЯ: ТЕТРАДЬ, СВОЙСТВА И ПРАВИЛА
Параллельно с железом я начал писать игровой движок. И тут самое грустное: нейросети помогают ну очень плохо. В интернете очень мало толковых примеров движков для микроконтроллеров с 300 КИЛОБАЙТАМИ оперативки - в основного многи инфы именно по Unreal / Unity.
Особенно весело, когда ИИ вовсю пихает хардкод: говоришь ему, что вся игра на динамических данных - он предлагает прописать свойства объектов прямо в код. Поэтому архитектуру я по возможности продумываю сам, записывая в тетрадку конспект, а ИИ использую только как справочник "а как это в серьезных движках сделано".
И паралельно этому получилось визуализировать куб через QT C++. Чтобы можно было сразу видеть на экране компа как отображается игра без перепрошивки куба.
Главная идея движка: игры задаются НЕ голым С++ кодом. Игра - это набор свойств объектов и набор правил в текстовом файле, а ESP32 выступает интерпретатором и стейт-машиной, которая просто бегает по свойствам и сравнениям. Хочешь сделать игру - описываешь объекты и правила на "определенном и простом" языке, а не сидишь в C++.
Плюс логика полностью отделена от рендера: первый тест гонял "воинов" на карте, где ESP32 считал столкновения и отдавал координаты по USB, а рисовал их компьютер.
Ну и приятный бонус по железу: протестировал новый DC-DC преобразователь - "сердце" питания кубика. КПД в худшем случае 90% (в старом кубе было порядка 70%) - это условные лишние 30-40 минут работы от батареи.
ГЛАВА 7. ЭКОНОМИКА: НЕЙРОСЕТИ ПОВЫСИЛИ ЦЕНЫ НА МОЮ ФЛЕШКУ
Отдельная боль этого лета - карты памяти. Похоже что из-за бума нейросетей дичайше скакнули цены вообще на всю память, включая простые microSD, которые я планировал использовать как хранилище игр. В том году брал простенькие карточки по 200 рублей - сейчас они практически по 700.
Но выход нашелся, и это даже забавно: на Авито продают ПРОМЫШЛЕННЫЕ microSD по 100 рублей за штуку. Всего 4 ГБ вместо 32, но игры для кубика будут весить максимум 100-200 МБ (и это уже навороченные игры). 4 ГБ хватит надолго, а ESP32 всё равно больше 12 МБ/с на чтение не выдает.
Еще были идеи продать кубы первой версии по себестоимости просто как железки. Сделал несколько постов в соцсетях и никому оно не понадобилось. Поэтому решил что и первая версия кубов пойдет в работу и на них будут игры. Придется сделать отдельные ветки кода для 1 и 2 версии кубов, но так хоть не придется дербанить на части в принципе рабочее железо.
ЧТО ДАЛЬШЕ?
А дальше просто дофига работы по проектированию движка))) Это самое главное, учитывая что кубики первой версии в принципе работают.
И еще копить на комплектующие кубиков второй версии. И потом всё заказать и протестить.
Будем очень надеяться, что у меня получится что-то дельное. По крайней мере я уже много работаю над этим устройством и верю в него. Да и судя по реакциям людей, проект перспективный.
И надо обязательно побыстрее сделать еще игры кроме змейки. А то я её показываю всем уже полгода подряд.
Этот пост это большая компиляция постов из моего блога тг, где я каждый день пишу о жизни и работе над всеми своими проектами. Кому интересно - загляните.
Прошлые посты:
Август '25 — LED CUBE. Дневник разработки. Август '25
Сентябрь '25 — THE ONE CUBE. Дневник разработки. Сентябрь '25
Октябрь '25 — THE ONE CUBE. Дневник разработки. Октябрь '25
Ноябрь '25 — THE ONE CUBE. Дневник разработки. Ноябрь '25
У кого есть желание - поддержите проект с кубиком любыми удобными вам способами, хоть комментарием, хоть донатом.
Разбираю старые нерабочие фотики и извлекаю оттуда линзы. Фоткаю на память, какие технологии были давние времена.
Накопилась уже целая коллекция - показываю =)
Cactus CA 900A (он же Toma m900).
Может быть ради экономии или еще чего - напечатали на бумажке датчик освещенности.
Polaroid 2000FF.
Пока что самый навороченный фотик из всех, что разбирал. Здесь даже линза была на пружинном подвесе. Да и электроники много на плате.
Rekam Prestige
Konica POP EF-80
Оригинальная разводка платы =)
Samsung FF 222
Premier PC-663
Praktica BF-md
На линзоблоках нет пометок, поэтому после извлечения у каждой свой мешочек =)
И получаются вот такие объективы.
Об этих объективах писал в посте:
Ранее я уже показывал идею адаптации линзоблоков из старых мыльниц на современные беззеркальные камеры.
Теперь сделал объективы в виде печенек =)
Если коротко, то беру старые нерабочие пленочные фотики, извлекаю оттуда линзоблок и ставлю в новый разноцветный корпус.
Было (один фотик в кадр не попал):
Стало:
Считаю, что получаются очень компактные и стильные объективы =)
Сразу скажу, что хоть это и похоже на поделки с алиэкспресс, но это совсем другое.
У объективов минимальная дистанция фокусировки 20-30см и можно снимать практически макро. И диафрагмы в этих линзоблоках не f10 как в китайских, а в среднем f4.5-5.6.
Чуть позже хочу добраться и до линзоблоков на f2.8.
Причем на объективы получается разная картинка. Кроме разного фокусного расстояния, какие-то более резкие в центре, а у каких-то больше виньетка.
Skina SK 445 - 35/5.6
Rekam BF 222 - 29/5.6
Praktika BF MD - 29/4.5
Skina AW-220 - 35/5.6
И теперь у меня есть много бобин пластика разных цветов )) Хочу сделать еще оранжевые и зеленые печеньки.
И есть идеи сделать форму не только печеньки, но и вафельки, и еще чего нибудь. Предлагайте свои варианты в комментах =)
