[Из песочницы] Как мы настольную игру с удаленным управлением сделали
Настольные игры — одно из древнейших развлечений, которое собирает вокруг себя друзей, семьи и просто любителей живого общения и эмоций во время игры.
Сегодня я хочу рассказать вам о том, как мы с другом решили создать свою настольную игру, но не простую, а «умную».
Внимание! Много картинок дальше.
Наша игра — настольная MoBA, в которой каждый из игроков управляет своим уникальным героем, со своими характеристиками и способностями. На данный момент у нас есть первая версия прототипа, сделанная из Arduino и фанеры.
Основная фишка нашей игры — нет необходимости трогать фигуры во время игры, игра должна сама перемещать их и отображать все применяемые способности. Игроку остается только наблюдать и управлять своим героем с мобильного телефона.
Несколько гифок игрового процесса
Что же должна уметь делать «умная» игра:
- Самостоятельно передвигать фигурки по полю.
- Подсвечивать игровое поле (целиком или отдельным блоком) любым цветом.
- Отображать игроку что он может/не может/должен делать, тем самым делая правила игры прозрачными.
- Обмениваться данными со смартфоном каждого из игроков.
Вот как выглядит наш первый работоспособный билд:
Как появилась идея
Как-то я купил себе настолку «Ужасы Аркхема». После магазина, сразу отправился к друзьям, чтобы поиграть. Однако, к сожалению, никто из нас не играл в нее до этого, а осилить 26 страниц правил мы не смогли.
Именно это навело меня на мысль, что было бы здорово сделать настольную игру, которая самостоятельно будет отслеживать выполнение правил, рассчитывать необходимые значения (без кубиков, линеек и исписанного листа бумаги) и т.д.
Одному из моих друзей идея очень понравилась, и он согласился поучаствовать.
Реализация
Опыта в разработке hardware-устройств у нас не было вообще (никто из нас даже Arduino в руках не держал), а опыт программирования ограничивался универом и разработкой небольших приложений под Android. Однако, это только прибавило интереса и желания.
После обсуждения всех деталей мы пришли к следующему:
- Фигуры по полю двигает CoreXY, на каретке которого расположен электромагнит на 12В.
- За движение отвечают два шаговых двигателя Nema 17 17HS4401 и драйверы DRV8825.
- Для подсветки поля используется светодиодную ленту с пиксельной адресацией WS2812b.
- За управление отвечает Arduino Mega 2560, на которой установлен разработанный нами shield.
- За передачу данных между игрой и смартфонами игроков отвечает 4 BLE-модуля HM10.
- Запитывает все это БП на 12В, мощностью 120W и DC-DC преобразователь на 5В.
- На стороне смартфона — мобильное приложение (на данный момент под Android), которое по факту является ядром всей игры. От него по BLE идут команды по движению, включения/выключения магнита и светодиодов.
Механика
К CoreXY мы пришли не сразу. В самом начале, при реализации кинематики, мы вдохновлялись различными DIY-гайдами по сборке 3D-принтеров.
Ниже фотография нашей самой первой попытки:
Для создания комплектующих мы прикупили дешевый, Б/У 3D-принтер, на котором отпечатали уже 6200 метров пластика и он отлично работает и по сей день.
Однако данный вариант имел кучу недостатков:
- Сборка была мучительной — малейшая неточность в расположении валов — каретка переставала ездить.
- Хоть один плохой подшипник — каретка переставала ездить.
- Слишком большая высота всей конструкции.
- Нам не понравилась идея, что двигатель должен быть расположен на движущейся части.
В один прекрасный момент мы наткнулись на статью, описывающую кинематику CoreXY и решили выбрать именно ее. У нее есть как плюсы:
- Сборка простая, т.к. все «кастомные» детали создаются на ЧПУ или 3D-принтере.
- Небольшая высота конструкции, которая ограничена высотой шагового двигателя.
- Шаговые двигатели неподвижны.
Так и минусы:
- Большие размеры. По картинке с 3D-моделью видно, что общая площадь намного превышает площадь рабочей поверхности.
- Длинные ремни, которые надо умудриться натянуть.
- Специфичный способ перемещения каретки, о котором я расскажу ниже.
Чтобы по максимуму избежать всех проблем, мы сделали нашу модель в Tinkercad, после чего уже начали заказывать и печатать комплектующие.
Игра на данный момент имеет следующие физические параметры:
Ширина: 780 мм Длина: 700 мм Высота: 85 мм
Игровое поле: квадрат со стороной 462 мм.
Основа: фанера толщиной 12 мм, с вырезанными на ЧПУ отверстиями под крепления деталей и двигателей.
Когда модель была готова она казалась миниатюрной и легкой… Однако в живую она очень большая и тяжелая. Сейчас мы понимаем, что всю конструкцию надо оптимизировать:
- Заменить фанеру на более легкий и тонкий материал.
- Длина и ширина внешнего контура не должны сильно превышать размеры игрового поля (возможно придется поменять кинематику).
Ниже я опишу особенности, с которыми мы столкнулись при сборке:
- Чтобы движение внутреннего контура и каретки было плавным и без посторонних звуков — важно, чтобы ремни были параллельны валам. Также желательно смазать валы. Мы использовали обычные масло для швейных машин.
- В качестве линейных подшипников сперва мы использовали LM8UU дядюшки Ляо, но нам часто попадались бракованные экземпляры, которые люфтили, мгновенно рассыпались и царапали вал. Поэтому приняли решение поменять их на графитовые втулки.
- Есть некие особенности в движении с помощью кинематики CoreXY. Так, если мы запустим только 1 шаговый двигатель, то каретка поедет по диагонали. Для горизонтального движения необходимо запустить двигатели в одинаковом направлении. Для вертикального — в противоположных направлениях.
Для расчета расстояния по X и Y необходимо использовать следующие формулы:
Игровое поле
Для подсветки игрового поля мы выбрали светодиодную ленту с пиксельной адресацией WS2812b, которая отлично подходит для наших целей.
WS2812b представляет собой RGB светодиод в корпусе SMD5050 с 4 пинами: VDD, VSS, DIN и DOUT.
Какие требования предъявлялись к полю:
- Небольшая толщина, чтобы электромагнит мог тащить фигурку за собой.
- Гладкая поверхность по которой скольжение будет осуществляться без проблем.
В результате игровое поле условно состоит из 3 частей: подложка, к которой крепится светодиодная лента, сама лента и поверхностное покрытие, по которому скользят фигурки.
Основная проблема, с которой мы столкнулись — это из чего сделать подложку?
На данный момент мы используем оргстекло, в котором на ЧПУ вырезали углубления под ленту глубиной в 2 мм (высота ленты и светодиода). Естественно, что данный лист полностью потерял хоть какую-то жесткость и сильно прогибается по линиям реза. Поэтому мы просто приклеили подложку к поверхности. Возможно в следующей версии заменим оргстекло, на монолитный поликарбонат.
В качестве поверхности выбрали все тоже оргстекло, которое завалялось у меня после ремонта на балконе, толщиной 4 мм, молочного цвета, с хорошими показателями рассеивания.
В результате, посидев вечерок с паяльником, мы получили следующее:
Существуют ленты с разной плотностью светодиодов. Обычно это: 144, 90, 60, 30 на один метр. Мы остановились на ленте с 30 светодиодами на метр, т.к. используя ленту с большей плотностью светодиодов — сложно передвигать фигуры без коллизий и возрастает необходимая мощность по питанию.
Стоит обратить внимание, что светодиоды соединены последовательно. Следовательно, если у вас перегорит первый светодиод, то остальные работать не будут.
Наше поле имеет размер — 14×14 клеток, всего 196 пикселей. Лента работает с напряжением в 5В. Один пиксель в ленте состоит из 3 светодиодов — R, G, B, каждый из которых потребляет 20 мА при максимальной яркости. Несложно подсчитать, что если мы хотим зажечь все 196 пикселей белым цветом — то нам необходимо почти 12 А…
Найти компактный БП или DC-DC преобразователь, который может выдать такой ток при 5В — очень проблематично. Поэтому мы решили, что в нашей игре поле не должно быть заполнено более чем на 60%, и не используем белый/серый цвет (цвет, при котором включаются все 3 светодиода), т.е. максимум 40 мА на 1 пиксель. В результате получаем, что стол не должен потреблять больше 5 А.
Часто видел рекомендацию, что необходимо запитывать ленту с двух сторон, чтобы не было потери напряжения. Но мы подключаемся к ленте с одной стороны, каждые 100 светодиодов, и видимых просадок по напряжению не наблюдаем.
Электроника
Управление всеми частями игры происходит с помощью Arduino Mega 2560. На нее возложены следующие функции:
- Произвести калибровку, в результате которой мы узнаем какое количество шагов должен сделать шаговый двигатель, чтобы преодолеть 1 клетку.
- Получить команды и данные от мобильного приложения и отправить статус выполнения обратно по BLE.
- Передвинуть каретку из точки А в точку В согласно координатам из полученных от мобильного приложения данных.
- Включить/выключить электромагнит.
- Зажечь определенный пиксель на столе определенным цветом. Номер пикселя и цвет передает мобильное приложение.
Первый прототип был собран на макетной плате и включал в себя следующие компоненты:
- Arduino Mega 2560;
- 2 драйвера шагового двигателя DRV8825;
- 4 концевых выключателя;
- BLE-модуль HM-10;
- Транзистор IRF530N — для управления электромагнитом;
- БП MeanWell 12В 10A;
- DC-DC преобразователь MeanWell понижающий с 12В до 5В, 10А;
После того, как мы убедились, что все работает, мы решили, что надо изготовить свой shield для Arduino Mega и наконец избавиться от монтажки и вороха проводов.
В связи с отсутствие опыта в разработке ПП, мы решили поручить это дело профессионалу. В результате один наш знакомый полностью разработал плату и произвел монтаж всех компонент. Результате можно увидеть ниже:
Судить о качестве исполнения не могу из-за недостатка опыта, но плата работает без нареканий. Принципиальную схему можно посмотреть тут.
Мобильное приложение
Мобильное приложение — «мозг» нашей игры. Именно приложение содержит в себе всю информацию о состоянии игры, персонажах и т.д. В качестве платформы для разработку был выбран Anroid, основное требование — поддержка BLE (так как в дальнейшем планируется добавление версии игры для iOS).
В отличии от электроники — у нас был небольшой опыт в разработке мобильных приложений, поэтому мы планировали завершить этот этап достаточно быстро. Однако, как обычно, все получилось не так, как планировалось.
Мы достаточно быстро поняли, что по факту нам придется писать полноценную мобильную игру, в которой средством отображения информации является не только экран мобильного телефона, но и поверхность настольной игры.
Основной функционал текущего приложения:
- Поиск BLE устройств, идентификация подходящего устройства для соединения. Идентификация включает в себя «хендшейк» — телефон должен удостовериться, что подключаемое устройство действительно является блютус модулем настольной игры, а не телевизор.
- Выбор игроков (минимум 2) из доступных героев, которых на данный момент 4.
- Предоставление всей необходимой информации текущему игроку: о доступных способностях, о их кулдаунах, о противниках и т.п.
- Совершение ходов — своими ходами каждый игрок управляет при помощи «джойстика», которым он выбирает клетки для применения способностей, перемещения и т.п.
Чувства прекрасного у нас нет, также как и знакомых UX/UI-дизайнеров, поэтому дизайн делали сами, как могли. В будущем мы планируем добавить лор, описание, а также PVE-режим, в котором игроки будут сражаться против боссов на арене.
Результат
На данный момент у нас есть полностью работоспособный прототип, в который можно поиграть (хоть и на 1 смартфоне), и на котором мы полируем правила и механики игры. На его создание мы потратили около года, работая по выходным и редкими вечерами, когда было свободное время.
План у нас амбициозный: найти единомышленников, доработать прототип, полностью «вылизать» баланс и правила игры и попробовать выйти на Kickstarter, т.к. это будет просто фантастический опыт.
Если будет интересно, то в следующей статье подробнее расскажу про мобильное приложение, саму игру, как мы делали наши миниатюры и что из этого вышло.