Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Дурная голова рукам покоя не даёт… история началась несколько месяцев назад: я увидел в интернете забавное видео игры в комнате с пиксельным светодиодным полом и решил сделать подобное для своих детей. За эти месяцы я получил массу удовольствия от процесса разработки и даже заразился идеей масштабирования проекта, но обо всём по порядку! Внимание, ниже будет много фото!

Идея

Идея в целом не уникальна, но я не нашёл в продаже каких-то готовых решений. В том же Китае продаются платформы без обратной связи и без игровых возможностей, у них это называется светодиодный танцевальный пол. Но это всё не то, что я хотел, а значит надо делать самому. Всегда любил работать со светодиодами, это приносит огромное эстетическое удовольствие, и в целом я скучал по работе с электроникой, так что решил сдуть пыль с паяльной станции и прикупить ещё некоторое оборудование.

Пара слов обо мне

Пользуясь случаем, позвольте кратко представиться, так текст будет менее обезличенным.

В жизни меня зовут Анатолием, в прошлом я более 5 лет проработал на крупном заводе инженером-схемотехником-программистом (нужное подчеркнуть), так что присутствует какой-никакой реальный опыт и понимание процесса массового производства электроники, надеюсь ещё пригодится. Последние 5 лет работаю фуллстек разработчиком. Так и решил совместить эти две области в одном проекте.

Меня весьма вдохновляет прорабатывать полный производственный цикл изделия: от разработки схемотехники и написания низкоуровневого ПО на микроконтроллеры до продумывания конструктива и поиска редких метизов для сборки (это когда ты немного ошибся в 3D модели крепления датчика, а их уже напечатано более 320 штук *facepalm*).

На VC публикуюсь впервые, раньше немного писал на Хабре (аля Как я в армии в экселе сетевого Бомбермена писал или Как банкоматы взрывоопасным газом накачивал), теперь решил попробовать VC. Будем знакомы!

Концепция

Вот примерный концепт того, каким я видел проект:

Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Игровая комната:

  • пиксельный RGB-светодиодный интерактивный игровой пол с адекватным временем реакции на нажатие;
  • настенные кнопки для разнообразия игрового процесса;
  • табло с информацией по игре (название игры, общее время, время этапа, очки, жизни и т.п.);
  • колонки со звуковым сопровождением игры (озвучивать ошибки/победы/поражения, называть цели этапов, цвета и прочее).

Игровой контроллер:

  • приёмопередатчик для шины данных;
  • Ethernet / Wi-Fi канал для связи с внешним миром;
  • аудио выход для звукового сопровождения;
  • видео выход для табло.

Админ интерфейс:

  • отображение текущего состояния платформы и информации по игре;
  • запуск/остановка игр;
  • индивидуальная настройка пикселей (назначение адресов, коэффициентов, калибровка, дефектовка и т.д.);
  • конструктор игр;
  • всякого рода журналирование (игры, логи контроллера, ошибки и пр.).

Основная цель: на старте заложить техническую возможность масштабирования платформы до размеров средней комнаты ~20-30 м2. На этом этапе лбами сталкиваются проблемы частоты обновления платформы и надёжности связи. По своей сути это взаимовытесняющие вещи: хочешь надёжно — пожертвуй скоростью, хочешь быстро — будь готов к потерям данных. Я не хотел тупо гнать сигнал через адресную ленту на базе WS2812B, это путь в никуда.

Скриншот из видео Activate Games
Скриншот из видео Activate Games

По итогу всех изысканий, в качестве интерфейса связи к пикселям, мной была выбрана шина CAN, я считаю она идеально ложится на вышеизложенную концепцию:

  • количество устройств в одной подсети может достигать до 120 шт. При группировке по 4 пикселя это обеспечит мне теоретический предел в 476 пикселей или примерно 34 м2, чего более чем достаточно на начальном этапе. Далее можно расширять путём введения дополнительных подсетей или увеличения количества пикселей в группах;
  • скорость передачи данных до 500 Кбит/с на 100 метров кабеля, чего как раз должно хватить, чтобы окольцевать 34 м2 площади. В эту скорость для тех же 476 пикселей, в зависимости от выбора протокола цветопередачи, можно будет уложить от 20 до 80 кадров в секунду;
  • возможность выстраивания приоритета сообщений в сети и разруливание коллизий через аппаратный механизм арбитража, что хорошо ложится на концепцию быстрого реагирования на нажатия. Короче говоря, сообщения о нажатии отправляются в шину вне очереди;
  • достаточно устойчивая связь вследствие использования дифференциального сигнала;
  • широкое распространение и дешевизна микросхем, что немаловажно.

Пессимистично делим все теоретические пределы на 4 и всё равно остаёмся в рамках разумного, жить будет. Поехали дальше!

Пиксель

Пиксель представляет собой классическую рамку с боковым расположением светодиодов, накрытую оргстеклом. Рамку выгрызали на ЧПУ фрезере из чёрной ламинированной фанеры толщиной 21 мм. Оргстекло мне тоже раскроили на ЧПУ при заказе, так доставка ТК обошлась в копейки, нежели доставлять лист 2х3 метра.

Первая сложность возникает при выборе типа датчика нажатия. Рассматривал несколько вариантов:

  • концевые переключатели;
  • емкостные датчики (как у китайцев);
  • оптические датчики;
  • тензодатчики (как в напольных весах);
  • тонкоплёночные датчики давления.

Мне сразу не понравилась идея использовать механический переключатель, т.к. для этого потребуется обеспечить подпружиненный свободный ход оргстекла и при этом избежать залипаний. В эту же категорию идут и датчики из двух пластин, работающих на замыкание, как в танцевальных аппаратах.

Оптические надёжны с точки зрения поломок, но имеют сложности с калибровкой чувствительности и температурной компенсацией (показания плывут от изменения температуры окружающей среды).

То ли дело работа с аналоговыми тензодатчиками, свободный ход практически отсутствует (вспомните ваши напольные весы). В эту же категорию можно отнести и тонкоплёночные датчики давления. К тому же есть пара идей, как применить аналоговый сигнал в играх…

Так и поступил: было решено собирать ~85 напольных весов собственной разработки с проводным каналом связи и RGB подсветкой. Использовать тонкопленочные датчики в прототипе не получилось из-за выбора деревянной рамки и необходимости чуть другой механики крепления стекла, но я обязательно вернусь к этой идее позже! А пока что взял обычные тензорезистивные датчики веса, используемые в напольных весах. Крепления для датчиков рисовал сам и заказывал печать на 3D принтере. Было напечатано около 340 таких креплений. Конструкцией доволен, получилось весьма надёжно и доступно для массового производства, в т.ч. и для литья. Нижняя часть пикселя выглядит колхозно, но это прототип, да простят меня эстеты.

Электронная начинка и встроенное ПО пикселя

Как я упомянул ранее, я сгруппировал пиксели по 4 шт, а значит нужно два вида плат: групповая плата с модулем связи и контроллером и 4 маленьких платы просто с внешним АЦП для датчиков. По итогу я собрал 21 большую и 84 маленьких платы (на фото маленьких — это только половина от общего количества).

Основная идея была сделать пиксель максимально тупым. Он должен принимать/отображать цвет и отправлять нажатие. На словах это просто, а на деле, т.к. работа идёт с аналоговыми датчиками, нужен был периодический опрос с цифровыми фильтрами, всякими коэффициентами к ним, калибровками нуля и чувствительности и т.д., чтобы, в случае чего, можно было с бэкенда подкрутить параметры прямо на ходу, в т.ч. вывести пиксель из игры, если он начал неадекватно себя вести или залип.

Контроллер и управляющее ПО

Сначала у меня была идея делать собственный 3х канальный USB-CAN преобразователь и управлять платформой с обычного компьютера. Я даже успел развести и заказать платы, но потом передумал и в качестве контроллера выбрал обычную Raspberry Pi 4. В ней есть всё необходимое: Wi-Fi, аудио/hdmi выходы, а также к ней продаются готовые модули CAN шины. Сложной математики там нет, так что процессор справляется легко, я даже вывел метрики в админку на всякий случай.

Управляющее ПО писал сам полностью с нуля: фронтенд — Vue.js, бэкенд — Golang, база данных — SQLite. Из того, что реализовано на данный момент:

  • отображение текущего состояния платформы (подсветка нажатий и текущего веса в кг);
  • игровое табло (время, очки, жизни);
  • просмотр информации по каждому пикселю в отдельности и отправка индивидуальных команд;
  • отправка широковещательных команд;
  • вывод метрик контроллера (загрузка/температура CPU, потребление памяти, основные метрики бэкенда);
  • простой конструктор кадров для игр;
  • несколько игровых механик: пол — это лава (нужно собрать все синие, не наступая на красные), море волнуется/пиксель дуэль (соревновательные режимы по сбору своего цвета, побеждает самый ловкий), безопасный цвет (робот озвучивает цвет, нужно успеть его найти и занять), классики (пропрыгать случайный паттерн), несколько демо режимов;

  • старт/стоп/пауза игр с возможностью конфигурации непосредственно в момент старта игры (например, для детей я отключал контроль жизней и увеличивал время этапа);
  • имитация игр мышкой прямо через админку для непосредственного тестирования игры после конструктора (ну или вмешивания прямо в процесс игры… хе-хе, я так помогал своей дочке побеждать пару раз, чтоб не расстраивалась).

Сборка прототипа и выявленные проблемы

Сборка такого количества плат и пикселей в одиночку у меня заняла больше месяца: сверлить, прикручивать, приклеивать, паять, отлаживать и перепаивать сгоревшее. К расстановке компонентов на платы я привлекал даже дочь… как говорится, любишь играть, люби и платы собирать!

Какие ошибки допустил в процессе разработки:

Ошибка 1: Россыпь плат, а не панель

Я торопился и заказал платы не панелями, а россыпью… это было немного больно и приходилось наносить пасту на платы поштучно. Я купил трафаретный принтер для нанесения пасты и мини стол для оплавления припоя, это в десятки раз ускорило процесс. Трафаретный принтер — самоделка одного замечательного человека с ютуба, кому будет интересно, могу дать контакт в комментариях.

Ошибка 2: Оргстекло

Найти оргстекло или поликарбонат подходящей толщины оказалось проблемой. В наличии из импортного ничего нет, толстое вообще не в почёте, а если заказывать, то нужен объём + большие сроки. Взял лист оргстекла от какого-то российского производителя, а оно оказалось недостаточно молочным (см. фото), очень сильно просвечивал источник света, пришлось каждый квадратик вручную дополнительно матовать шлиф машинкой… то ещё удовольствие.

Ошибка 3: Танталовые конденсаторы

Танталовые конденсаторы сами по себе достаточно капризная штука, а заказывать их с Китая было вдвойне ошибкой… брака было около 40%: они просто взрывались при напряжении в половину от номинала. Я проверял их непосредственно перед пайкой, но даже это не помогло… несколько штук вышло из строя прямо в день мероприятия, проработав перед этим около месяца дома. В следующий раз поставлю бочонки, благо высота позволяет, они не так горят.

Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Ошибка 4: Таблица на фронтенде

Я ненастоящий фронтендер и умею клепать только админки для внутреннего использования. Как мне кажется, было ошибкой использовать на фронтенде простую таблицу. Хоть обновление ячеек и сделано реактивно на тегах, но рендер всего поля разом немного подтормаживает. Скорее всего нужно будет переходить на графику, проконсультируюсь чуть позже с опытными коллегами.

Ошибка 5: Экономия на протоколе передачи

Цветовые эффекты немного скудные, недостаточная цветопередача, т.к. сэкономил на протоколе. Рассчитать всё в теории — легко, но опыт подсказывал, что теоретические пределы скорости не практике недостижимы, боялся не получить требуемую частоту обновления, поэтому заранее ужимал протокол, хотя при таком размере поля можно было особо не беспокоиться.

Ошибка 6: Размытая граница пикселя и неравномерность засветки

Мне не нравятся размытые контура пикселей, хочется сделать их более чёткими, это будет смотреться гораздо круче. Качество засветки тоже можно улучшить, используя более глубокую рамку и правильное оргстекло.

Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Ошибка 7: Дешёвая светодиодная лента

Было куплено около 90 метров "высококлассной" китайской светодиодной ленты… которая оказалась явно б/у, имела разное свечение и много раз перегорала. Но тут вынужденная экономия на прототипе.

Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Идеи на будущее:

  • Расширение группы до 9 шт. — это будет явное удешевление, повышение надёжности связи за счёт уменьшения устройств на шине и расширение теоретического предела площади игровой зоны;
  • Соты! Очень хочу гексагональное игровое поле, это должно выглядеть весьма круто!
  • Настенные кнопки;
  • Быстрые соединения. Из-за использования в прототипе винтовых клеммников, сборка платформы перед детским праздником у меня заняла около 2.5 часов, что очень много. Буду прорабатывать быстрые соединения;
  • Ну и конечно, разные-разные механики игр! В голове масса идей: всякого рода змейки, пакман, эстафеты, арканоид, захват территорий, повтор рисунка, те же танцы…
Пол — это лава: история разработки прототипа интерактивной светодиодной игровой платформы

Как корабль назовёшь… и заключение

При выборе кодового имени проекта было несколько разных вариантов. Больше всего мне симпатизирует название «Pixel Quest» ввиду широкого распространения в народе понятия «квест-комната». Сразу завёл под это дело домен PixelQuest.ru и, как это водится, отдельный TG канал @pixel_quest для публикации прогресса разработки и дальнейших обсуждений с заинтересованными людьми. Заходите в гости, буду держать в курсе событий!

На VC пишу ради новых знакомств, поиска поддержки и идей для дальнейшего развития проекта. Я технарь, а не предприниматель, и, если честно, плохо представляю, как правильно превратить это в бизнес. Я не умею в эти ваши «найди инвестиции / собери команду / захвати мир» (но это пока что), не умею писать бизнес-планы, хочу просто делать интересный продукт и радовать людей. Буду рад любым советам! Личный телеграм для связи: @AnatoliyB

В ближайший планах найти подходящее помещение у себя в городе (Смоленске) для построения первой комнаты с увеличенной игровой зоной и полноценного тестирования. Хочу развивать идею как по направлению целых игровых квест-комнат, так и небольших игровых платформ 4-6 м2 для установки в детских комнатах или сдачи в аренду на детские праздники.

Итого:

  • Потрачено: пол года жизни и очень много денег
  • Заработано: 0 руб.
  • Удовольствие от процесса разработки и праздника для детей: бесценно!

Спасибо всем, кто дочитал! Пишите свои мысли и идеи игр в комментариях!

Продолжение истории:

246246
163 комментария

А в случае проигрыша будет опускаться потолок 🤣

34
Ответить

это уже следующий уровень крутости аттракциона

5
Ответить

какие-то игры кальмара получаются)

3
Ответить

Добро пожаловать в игру! Вообще такую тему нужно продавать эйчарам, чтобы на собесе смотрели как кандидат принимает решения и отвечает на вопросы, бегая по квадратикам.

3
Ответить

тогда лучше заранее предупредить об этом))

1
Ответить

это уже какая-то пила

Ответить

Стоит признать: это самый охуенный пост в этом году.

Автору респект и уважуха. Инвесторы, а ну-ка, блять, хватайте этого инженера - он вам бабла может сделать столько, что карманов не хватит.

26
Ответить