4 года игры в танчики

Доброго времени суток, дорогой читатель!

Сегодня я хочу поведать тебе забавную, ещё на закончившуюся историю странных совпадений, побед и поражений, радости и смуты. Если интересно как создавался, возможно, один из самых маленьких в мире «умных» (а не просто р/у) танков как на картинке ниже, а так же при чём тут IoT, PHP и Angular — буду рад изложить!

c0f82dd95239ad68e9d1bda0fea4ac79.jpg

Лето-осень 2017 года

Я совладелец смарт-кафе в нашем славном городе Харьков, веду (почти бесплатные) курсы робототехники. То ли чтобы самореализоваться, то ли чтоб прокачать навыки менторства/выступлений. В общем для души и в полный убыток для кармана.

При этом в свободное от работы/курсов время разрабатываю (на тот момент уже 4й год) систему автоматизации, где можно в GUI наклацать любые сценарии поведения (по типу Node-RED, но для домохозяек).

Немного технических деталей

Ещё раз напомню что разработка системы началась just for fun и в 2013 году. Я сам то full stack инженер, поэтому по железу тут может быть много вопросов :)

Исполнительные устройства — маленькие универсальные платы на ATmega32u4 & nrf24l01+. Те что ниже на фото фиолетового цвета — единичные прототипы, красного — мелкосерия. Делали мне по местному, на заказ.

В роли гейта — ранее RPi первая, сейчас NanoPi NEO 2 на Armbian. На С++ написан user space driver для nrf24l01+ по SPI. Через сокет общается с прослойкой на демонизированном PHP (phpDaemon), который, в свою очередь, общается (статистика/апдейты/команды) по вебсокету с Angular (web)/NativeScript (mobile) приложением. Всё работает либо в однопоточном режиме, либо через RabbitMQ для создания распределённой сети с большим покрытием.

Нагрузочное тестирование в однопоточном режиме на NanoPi NEO 2 показывает загрузку одного ядра 80% при ~500 запросов/сек (один запрос это эмит события устройством по радиоканалу → расшифровка сообщения на с++ драйвере → передача по сокету в php, отработка бизнес-логики, сценариев → подсчёт статистики)

В один прекрасный день мне предложили поучаствовать в выставке Kharkiv Mini Maker Faire, времени на подготовку — полгода. Конечно же предложение было принято, ученики (~12 человек на тот момент) введены в курс дела и начался брейн-шторм на тему того, что же мы будем показывать. Хотелось, чтоб было эффектно, весело и для как можно большей аудитории. Не помню как уже, но пришли к идее воплотить игру pacman в виде игрового автомата, где всё будет физическое (не на экране). Начали искать шасси, чтоб маленькое, лёгкое и бюджетное. В итоге набрели на сайт с игрушками и увидели его — Happy Cow Tank-7

Happy Cow Tank-7 масштаба 1:97Happy Cow Tank-7 масштаба 1:97

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

И, внезапно, мне приходит в голову мысль — у нас есть миниатюрный танк, в шкафу лежит пара джойстиков от Dendy, а в детстве мы часами рубились в Battle City! Так давайте же сделаем Battle City в реале! А чтоб было ещё интереснее — добавим туда щепотку IoT и пару капель FPV! При этом, конечно же, по стенам ездить нам не нужно, времени/денег на реализацию необходимо намного меньше -, а звучит это всё так же круто, олдфаги заценят!

На следующее же занятие был приглашён знакомый квадрокоптерщик (у которого был небольшой арсенал FPV камер), взяты прототипы плат от своей системы автоматизации, гейт (на тот момент RPi). Как оказалось, расстояние между выводами платы идеально совпадает с шириной самой платформы, так что двигатели с редукторами оказываются между гребёнкой выводов. Методом святого скотча и клеевого стержня собрали всё это вместе на макетке, вырезанной дремелем под форму шасси:

Фотографии процесса

Естественно восторгу не было предела! Нужно пилить…

И вот тут начались проблемы. Я абсолютно не самый лучший ментор, и мотиватор наверное так себе, но на задачах разводки платы, программирования и 3D-моделирования люди стали потихоньку уходить. Никого в этом не виню, просто факт. То ли фана меньше, то ли сложно/скучно, не знаю. Осталось нас сначала человек пять, а на выставке мы были и вовсе втроём + моя девушка.

В общем распределили задачи среди выживших, а именно:

  1. Нормальная PCB для танка

  2. 3D модель корпуса

  3. Разработать систему ИК оружия

  4. Адекватные джойстики, без проводов

  5. Арена, на которой будет происходить сражение

  6. Отдельная страница в Angular приложении для отображения очков/смертей

Но через некоторое время решили упразднить пункты 1 и 2. На тот момент опыта работы с разводкой PCB было оч мало, поэтому для экономии времени решили сделать второй танк тоже на макетке. И от корпуса отказались, т.к. посчитали что танк выглядит достаточно футуристично, когда все резисторы наружу торчат :)

Я взял на себя ИК оружие, второй танк и джойстики, мой друг Андрей — Angular часть, а остальные — арену.

Фотографии ИК пушек, танка №2 и веб-морды

Прототип ИК оружияПрототип ИК оружияВзял оригинальную башню с танка, засунул ИК приёмник и ИК светодиод тудаВзял оригинальную башню с танка, засунул ИК приёмник и ИК светодиод тудаГотовые к бою, слепленные из подручных материалов, танки :)Готовые к бою, слепленные из подручных материалов, танки :)Страница статистики игры, творение Андрея :) Во вкладках браузера - GeekTimes & HabrСтраница статистики игры, творение Андрея :) Во вкладках браузера — GeekTimes & Habr

Арена и баллоны с краской

Не обошлось и без звуков из оригинального Battle City:

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

Итого, финальные правила были такие:

  • Игрок имеет 5 жизней, после 5 попаданий в него — танк обездвиживается на 5 секунд

  • Для захвата флага необходимо подряд, одним игроком, выстрелить в него 5 раз. В случае если кто-то стрельнет во флаг во время захвата — счётчик сбрасывается.

  • Конца игры фактически нет, но есть смерти/убийства и кол-во захватов флага. Мы решили, что будем играть до 15 убийств/захватов, хотя позже уменьшили до 10. После этого нажимаем кнопку сброса счёта и начинаем сначала

4 ноября 2017 года, ярмарка Kharkiv Mini Maker Faire

До ярмарки дотерпело только четыре человека — Я, Артём и наши девушки :)

Проходило мероприятие на старом заводе, который преобразили в место для проведения ивентов. Но отопления не завезли в должном количестве, равно как и мебель. Кое-как установили нашу арену, подключились к розеткам, протестировали. Добавили лего, чтоб было что протаранить, засунули флаг (сделанный на макетке) в Эйфелеву башню и с нетерпением начали ждать…

Гости ярмарки смотрят на нашу кустарщинуГости ярмарки смотрят на нашу кустарщину

А людей то заинтересовал наш стенд! Очередь поиграть была всегда, пришлось ограничить раунд до десяти очков (примерно 3–4 минуты), чтоб смогли поиграть все. Аккумуляторы заряжались пачками, чтоб обеспечить seamless delivery.

Примерно на пятой минуте мы поняли, что забыли очень важную вещь — ограждение! Без него танки (почти всегда под управлением детей) выезжали за пределы арены и падали, иногда повреждаясь. Даже один раз отвалилась керамическая антенна, благо на DIY ярмарке нашёлся паяльник, и танк в течении пары минут был возвращён в строй.

В остальном всё прошло без проблем (что странно, ведь никаких запасных шасси у нас не было). Люди остались довольны, а мы, хоть и замёрзли, но были очень удовлетворены проделанной работой.

Декабрь 2017 года

Началось всё с того, что мне, наконец-то, пришли платы для танка!

Вот они, пурпурные!

И танк стал выглядеть более сбитым, обтекаемым, законченным :)

Слева - старый (содержание клея 90%), справа - новыйСлева — старый (содержание клея 90%), справа — новый

И только я закончил сборку танка на новенькой PCB, мне позвонили. Девушка, представившись работницей ивент-агенства, сказала что видела нас на выставке и хочет пригласить на корпоратив одной IT-фирмы, в качестве одной из зон развлечений. Конечно же я согласился. Окупить хоть немного проект — дело здравое (а 95% всех затрат нёс я).

И вот уже 16-го декабря я, со знакомым аниматором, раскладываем всё на столе в ожидании толп IT-шников. Лего заменили на пластиковый набор декораций, а вот ограждения арены так и не завезли…

7dc6ae67b1f482241d1b714683b00e51.jpg

Было круто на самом деле, к нам проявляли здоровый интерес, пьяных почти не было. Остались очень довольны, к тому же — пофиксил пару багов прям на лету :)

Но после этого был новый год, много сложных событий в жизни…

Декабрь 2018 года

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

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

Фотки со стороны админа игровой зоны

Вместо нашей арены - бумажная подложка из набора декорацийВместо нашей арены — бумажная подложка из набора декорацийКрасивая связка NanoPi Neo2 и микро-роутера Nexx WT3020 справаКрасивая связка NanoPi Neo2 и микро-роутера Nexx WT3020 справаОчередь чтоб поиграть в танчикиОчередь чтоб поиграть в танчики

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

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

2019 год

Время от времени возвращался к проекту, выделил для себя следующие улучшения:

  1. Новая плата со световой индикацией

  2. Что-то придумать с шасси

  3. Закрыть редуктор, ибо после каждого выезда приходилось его чистить от волос

  4. Вибро-отклик в джойстик

Как ни странно, но всё это удалось сделать.

Новая плата

Новая плата решала все текущие проблемы визуального детектирования:

  • цветовая индикация команды (для игры больше чем 1×1 игроков)

  • мигающий сигнал, пока танк «респавнится»

  • анимация при выигрыше у команды победителя

  • в случае иных применений танка (исследование подвесного потолка, труб) можно использовать светодиоды для освещения территории

А вот с шасси пришлось помучаться. Изначально выбор пал на фотополимерную 3D-печать, т.к. имеет хорошее разрешение. Но после трёх попыток у местной фирмы (которая приспособила fullhd проектор для этого) решил отказаться от этой затеи, ибо плавали внутренние диаметры отверстий, в которые должны были вставляться подшипники. А при попытке расточить сверлом — получал сколы и трещины. В итоге из 30 заготовок получалось 3–5 нормальных деталей.

Вышел по знакомым на человека, который согласился сделать мне несколько деталей из алюминия на 4-х осевом станке с ЧПУ (по цене крутого фотополимера из Киева). И вот тут результат превзошёл все ожидания! С подшипниками всё стало намного лучше — никакого люфта, натяжение гусеницы равномерное, ничего не спадает.

Фото колёс из полимерной смолы и алюминия

a600e15bdd82adf6c3fe45958c7fa0fb.jpgКривые отверстия и попытки их расточитьКривые отверстия и попытки их расточитьОтличные, алюминиевые!Отличные, алюминиевые!

Текущий вид танкаТекущий вид танкаФото со всех ракурсов

116ab5dd3d165ddd0af4279579f80f7a.jpgФаркоп приделал для буксировки прицепа, может когда-то и расскажу какого :)Фаркоп приделал для буксировки прицепа, может когда-то и расскажу какого :)185c5fce26e206b6009ae273bd920827.jpgcc1339fc4ae06d440fcfd938369e971a.jpg

2020 год

Ухх, всё пошло вообще не по плану :) Но всё же есть идеи которые хотелось бы реализовать, пусть даже не в этом году:

  • Уже сделал новую версию колёс, чуть более удобную в обслуживании. Произвести и переобуть все танки в них

  • Сделать новую плату, без «второго этажа». Использовать малюсенький модуль EBYTE E73–2G4M08S1C на nRF52840, для реализации прямого управления с телефона по BLE. И там же разместить передатчик видео на RTC6705 (а может и с OSD на борту, гуглить опенсорс решение «tinyOSD & tinyFINITY»)

  • Ну и чтоб можно было устраивать бои без использования микрокомпьютера и роутера — захардкодить это всё в ESP-шку. Меньше точек отказа, проще initial setup, меньше потребление тока. А управлять всем этим — с планшета (парить танки с джойстиками, менеджмент команд и т.д.)

  • Ну и совсем из области фантастики — нанести сверху на танки маркеры, написать на айпад AR приложение, которое будет с веб-сокета выдёргивать инфу и накладывать всё это на видеопоток, который выводить на телевизор для наглядности (здоровье танка, выстрелы, убийства, захваты флага)

Мне не дают покоя ещё несколько мыслей. Это ведь IoT танк, который управляется либо по радиоканалу, либо через MQ, либо же через вебсокет (web/mobile) — можно реализовать следующее:

  • Оцифровка изображения с камер, управление через интернет в виде веб-аттракциона

  • Написание небольшого JS API с последующим использованием в качестве обучающего конструктора

  • Написание RxJS API для обучения/управления в реактивном стиле:)

  • Создание платформы для проведения боёв ботов (системы свой/чужой на ИК, зонирование арены на ИК, можно добавить бамперы — датчики касания). Кто напишет лучший скрипт поведения бота/роя — победил.

В общем очень широкое поле для полёта мысли. Только бы времени и желания хватило.

Такие вот дела :) Спасибо тебе, что дочитал до конца. Надеюсь, эта история тебе понравилась.

P.S.

Прошу прощения у причастных, если что-то напутал/упустил. Некоторые несущественные подробности были специально упущены, дабы не раздувать статью.

Выражаю огромную благодарность:

  • Всем моим подопытным ученикам, кто слушал мои лекции и принимал активное участие в жизни робосубботника

  • Особенно Артёму с Аней и Андрею, которые в сжатые сроки сделали кучу работы и терпели мой характер :)

  • Максиму, Андрею и всей их команде, которые консультировали, тыкали носом и всячески сопутствовали развитию не только проекта, но и меня

  • Моей жене пока ещё невесте, за помощь и терпение.

P.P. S.

Если у кого-то есть идеи/предложения — пишите в личку, буду рад пообщаться.

P.P. P.S.

Если вдруг нашли ошибку/опечатку — буду благодарен за сообщение в личку.

© Habrahabr.ru