Проект: TacTile Grid (Дима луд[д]ит)  Публичный пост
10 мая 2024  460
TacTile Grid (Дима луд[д]ит)

Привет, винтики и шпунтики!

Хочу рассказать про мой небольшой железный проект, который я относительно недавно начал паять-колотить на коленке.

Немного бэкграунда

Когда я был маленьким, одной из моих любимых игр была очень задротская игра под DOS - Snake Battle (Змеиные Бои) от Gamos (Вот тут можно в нее поиграть через DosBox прям в браузере!). Суть её была в том, что ты должен был запрограммировать змею и отправить ее на арену, соревноваться с другими змеями в откусывании друг другу хвостов :) Со временем у нее появилась парочка реинкарнаций вроде вот этой, а сама она явна была навеяна одной и самых старых игр для программистов — CRobots.

Но Snake Battle была на самом деле совершенно гениальна в сравнении с ними из-за своего визуального языка, на котором писались «мозги» змей: ты был ограничен всего 9 слотами 7x7 клеток, в которых «рисовал» игровые ситуации, которые змея пыталась по очереди применить на поле. Это давало довольно жесткие игровые рамки, которые подогревали азарт, ты даже будучи ребенком понимал, что у самой лучшей чемпионской змеи тоже в голове всего 9 извилин, и если ты постараешься, то сможешь к ней приблизиться или ее перехитрить.

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

Как я вкатился в железки

В старшей школе я ходил в кружок микроэлектроники и делал всякие проекты. Одним из последних был «Танковый Бой» - эдакие CRobots но в физическом мире: у нас было 2 автономных танчика с ИК пушками / сонарами, в которые можно было загрузить код на самодельном ассемблере и танчик начинал биться на поле с другим танчиком. Все это было очень сыро и недоделанно, но крайне весело.

Я хотел из этого сделать образовательный проект чтобы учить школьников кодить, занимал всякие места на конкурсах научно-технического творчества молодежи, меня даже в Бауманку хотели без экзаменов взять, но я не пошел :) Тогда еще приходилось как-то аккуратно обходить военную тему стороной и делать референсы на классические аркады, сейчас уже под другим этическим углом смотришь на всякие танки :(

Это был мой первый подход к железкам и это было лет 12 назад...

С тех пор меня так или иначе заносило в околожелезные проекты, но все время как-то на пол-шишечки: то в распознавание видео на edge устройствах, то в нейротехнологии, а сейчас так и вообще в Метовский Reality Labs работать над секретными гаджестянками из будущего. Я подумал, что пора уже собрать что-то свое, что-то красивое!

TacTile Grid (чиво-чиво?)

И так, я задумал сделать физическую арену для той самой, каноничной Snake Battle из моего детства!

Художник из меня так себе, но вот вам концепт арт:

Выглядеть это должно примерно таким образом:

  • Физическая доска пусть 21х21 клеток (в исходной игре 25х25, но мы программисты любим чтобы все делилось на 8, а 25 уж очень расточительно делится на 8)
  • Каждая клетка доски - небольшой бистабильный плунжер на соленоиде, который умеет подниматься вверх и опускаться вниз: обычно поле опущено, но тело змеи торчит над ним
  • На шляпке каждого такого плунжера 9 RGB диодов чтобы рисовать змей и прочие объекты
  • На плунжеры-воксели можно нажимать как на кнопки?
  • Приложение на телефон, которое сопрягается с полем по BLE и может запускать игры на поле. Ну или является джойстиком, если вы решили запустить обычную змейку и кушать яблочки
  • Все это довольно небольшое, скажем не больше 15х15 см, работает от батарейки
  • Для меня это скорее хоббийный проект и дань уважения комьюнити, которое меня научило тому, что я умею. Так что все исходники плат, 3D модели и код будут в открытом доступе.

А если еще подумать?

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

Я пошел тыкать палочкой кого-то, кто разбирается в такого типа играх и клубная ноосфера выдала мне Анну. Мы очень мило поговорили про PlayDate и Pico-8, про разные идеи того, что можно делать с полем и про эмуляцию железа. Для себя я обновил концепцию так:

  • Поле 20х20 (четное поле даст возможность группировать при желании кластеры клеток-вокселей 2х2 в совместные кнопки и делать укрупненное поле (как четное так и нечетное)
  • Каждый воксель - 4х4 RGB пикселя (ибо там уже появляются читаемые шрифты и опять же это четвертушка от всем привычного 8х8 спрайта, используемого в Pico-8 или NES)
  • Воксели можно и нужно нажимать (как вверху, так и внизу)
  • Нужен эмулятор
  • Можно устроить геймджем!

Сбор материала

Есть такие штуки - Flip Dot displays. На заре электроники из них клепали табло для всяких поездов и автобусов.

И люди делают с ними очень крутые проекты, вроде такого:

https://hackaday.io/project/159415-flip-dot-display-diy-controller/log/150374-schematic-ics-and-logic-description

Еще мне очень понравился вот этот проект с hackaday.io - парень делает электромеханический брайль дисплей!

https://hackaday.io/project/191181-electromechanical-refreshable-braille-module

Прототип железа!

Ох как далеко еще до чего-то полноценно рабочего ахахахах
Начнем с небольших шагов. Соленоиды говорите?


Вот так выглядел мой самый первый прототип

Слёжна. Нинадёжна.

Пару следующих дней я провел в войне с соленоидами и надо сказать совершенно никчёмно им сливал :)

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


Попутно вспомнил как паять сталь с помощью аспирина: воняет он конечно знатно…

Итак, выводы:

  • Магнитная проводимость - дело серьезное. Не все железяки одинаково магнитятся: нержавейка магнитится скверно, сталь для гвоздей и болтов - сносно, но специальные ферритовые стержни для соленоидов - самый топ. К тому же они сильно легче железок и выходят эффективнее
  • Неодимовые магниты это просто волшебство! Вот эта крохотуля очень сильная для своего объема
  • Просто намотать катушку на стержень недостаточно, нужно замыкать магнитный контур (ну или понимать в каком месте вы собираетесь что-то притягивать \ отталкивать
  • Резинки и пружинки - не друзья миниатюрных конструкций - чаще всего они очень жесткие. Не представляю как всякие наручные часы делают точными. А еще найти нужную пружинку в штатах сложнее и дороже чем заказать микросхему лол

А еще я узнал о PCB solenoids / PCB motors пока разбирался с этим всем. Возможно это нормальный способ дальнейшей миниатюризации всей конструкции
https://www.youtube.com/@CarlBugeja

Задротская секция про электромагниты

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

  1. Сила магнитного поля соленоида B = u(N/L)I

где u - относительная магнитная проницаемость, N - количество витков, L длина соленоида, I - ток
2) По закону Ома I = V/R, а R прямо пропорциональна длине провода, то есть количеству витков. I ~ V/N

Получаем что B ~ u(N/L)(V/N) = u(V/L)

Тобиш сколько ни мотай - все одно: хоть 1 виток, хоть 1000. Когда я пришел с этим вопросом к gpt и попросил нарисовать график оптимального количества витков для моих заданных параметров, он порассуждав тем же образом нарисовал мне константу :D

Благо старый добрый гуглинг подкинул мне этот прекрасный пост на реддите: https://www.reddit.com/r/ElectricalEngineering/comments/5rc0y4/calculating_the_ideal_number_of_turns_to_maximize/

Если кратко, то мы забываем о 2 важных допущениях:

  1. На самом деле мы в этом уравнении забыли о внутреннем сопротивлении источника питания:

B ~= N/(Rinternal + kN)
Окей, уже получаем асимптотически сходящуюся к константе кривулину - хотя бы интуитивно понятно

  1. А еще пока мы наматываем мы увеличиваем диаметр кругов. то есть сопротивление на круг растет быстрее чем добавляется сила магнита и у кривулины на самом деле есть экстремум

Еще один смешной вывод из первого уравнения - наматывать катушку в длинну казалось бы бесполезно! (удваивая количество витков намотанных один к одному мы удваиваем длину соленоида, двойки сокращаются, хихи) самая эффективная стратегия - наматывать улитку толщиной в один провод! Но проблема с этим в том, что такая улитка будет иметь очень очень маленькое сопротивление и через нее потечет адски огромный ток (если найдется) и сожжет ее :)

Так что длина катушки на самом деле регулирует ее энергопотребление. При прочих равных длинная катушка с большим сопротивлением и маленьким током эффективнее чем однопроводная улитка

Итого я сделал калькулятор витков соленоида. Он вроде довольно адекватный, но с практикой у меня пока не соотносится, тем не менее было интересное упражнение. https://docs.google.com/spreadsheets/d/1fobH_FH1UGm_q5HY0UcPq7nkKMTIdJ4H_aXhyGzr1rQ/edit#gid=1239644693

3D печать

Несколько недель назад я зашел в очень прикольное место, называется «hack manhattan» - это что-то типа коворкинга для всяких хакеров / радиолюбителей / художников, где есть всякие инструменты и 3D принтеры и можно просто прийти и что-то напечатать или потусить с гиками. У них там было два fdm принтера, на одном из которых мне попытались распечатать вот эту крошку-катушку.

Получилось мягко говоря не очень: из 6 катушек выжила только одна и оказалась слишком грубой

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


Левый прозрачный - это MJP, он супер четкий вышел и прям хрустит какой точный на этих полумиллиметровых масштабах. Жаль что для этого нужен прям промышленный принтер и цена такому развлечению крайне кусачая.
Правый белый - SLA, там конечно все похуже с четкостью, но благо все еще выдерживает масштаб.

Тут еще предстоит куча итераций.

Светодиоды

Есть такая штука - адресуемые светодиоды. Они стоят в тех самых всем известных RGB лентах. Суть их в том, что рядом с каждым диодом впаян крохотный контроллерчик, который умеет читать последовательный сигнал и превращать его в интенсивность RGB. Поэтому они нанизываются на одну шину данных и могут всего одним пином контроллера управлять 500-700 светодиодами. Дайти многа!

К сожалению не со всеми светодиодами у меня получилось подружиться и какие-то пришлось дебажить с осциллографом

Все еще жду когда приедут те самые, которые хочу, очень надеюсь, что с ними удастся подружиться как вот с этим:

Печатные платы (PCB)


Вот так выглядит первая итерация контроллера соленоидов. Не буду наверное сильно вдаваться в технические детали, если есть желание обсудить - можно обсудить отдельно. Все основные идеи отлично описаны у чела, который делает контроллер для Flip-Dot дисплея.

PCBWay

Вот эта секция образовалась совершенно неожиданно. После того, как я разместил проект на hackaday.io, мне написал представитель PCBWay (ребята, которые печатают платы в китае, один из 2 крупных и заметных вендоров) и предложил партнерство: сказал, что его зацепил мой проект и они готовы бесплатно печатать мне прототипы в замен на отзывы об их сервисе. У меня обычно достаточно сильная аллергия на рекламу, но это был на удивление очень аккуратный и четкий маркетинг, респект им! Они реально помогают небольшим авторам делать крутые поделки и делиться ими с миром, продвигают радиолюбительство и образование. красавцы!
Заказал у них плату со светодиодами со сборкой, поглядим что выйдет.

С какими самыми неожиданными трудностями пришлось столкнуться?

Если честно - железо это вообще сложно, долго и дорого :) Но супер интересно, потому что приходится с нулевого, транзисторно-резисторного уровня разбираться с тем как работают комплюхтеры. Очень советую молодым разработчикам и просто неравнодушным к рукоделию :)

Сколько потратили и заработали? Есть идеи как это можно монетизировать?

Подобью смету отдельно чуть позже, пока много трат связано с тем, что в новой квартире после 18 переездов с начала 2022го года, у меня нет никаких инструментов :) По первичным прикидкам думаю финальный прототип 20х20 вокселей (4х4 пикселя) будет стоить баксов 700. На потоке это можно будет смаштабировать до условных 450. Сомневаюсь что это тянет на коммерчески оправданный продукт, но цели такой и нет особо

Какие планы на будущее?

Собрать рабочий прототип железа и попробовать соорудить что-то типа Pico-8 эмулятора для него (только в моем случае Pico-4 хехе)

Устроить в клубе геймджем под это дело и разыграть железку со скидкой?

Нужны ли какие-то советы или помощь Клуба?

Да! Очень да! Дайте два!

  1. Помогите придумать игровые механики, которые раскрывают историю с поднятием - опусканием клеток поля! Может какие-то пазлы, где можно ходить в двух плоскостях? Может строительство городов, чтобы они пупырились? А может и вовсе использовать встроенный акселерометр и катать шарик по лабиринту с дырками? You name it!
  2. Кто-то хочет помочь с эмулятором? Я бы с удовольствием делегировал кодинг, а то еще на работе код писать приходится :) Я могу менторить и помогать со всеми частями стека, возможно это классный проект для кого-то, кому интересно в embedded и кто ищет ментора и опенсорс движухи.

На какой это стадии?

На очень-очень ранней. Я неплохо представляю как все это должно работать с точки зрения железа и софта и имею план действий по которому двигаюсь, но приходится довольно много ждать производства \ доставок или тратить времени на проектирование и выбор компонент.

А вот в геймдизайне у меня очевидная дыра, поэтому call to action во всем этом очень простой: давайте знакомиться!

Если вы шарите в ретро играх или настолках и хотите помочь с такой странной железкой, давайте общаться!

channel: https://t.me/+WDgSwezHSg1jMDRi
telegram: @matasoff
hackaday: https://hackaday.io/project/195878-tactile-grid

Связанные посты
9 комментариев 👇

О, прикольный проект, люблю такое. Могу помочь и с железом и с софтом
По схеме: сдвиговые регистры 595-ые можно заменить на mcp23017 - сразу 16 портов вместо 8, рулится по i2c (два пина на ардуино), можно подряд несколько повесить на одну шину сконфигурировав адреса правильно. Они и в обе стороны работают кстати. PCBWay их тебе сразу и напаяют на схему если выберешь QFN исполнение.

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

  Развернуть 1 комментарий

btw, я работаю в паре блоков от hack manhattan, го пивка бахнем
t.me/kurmanov

  Развернуть 1 комментарий

@kurmanov, с удовольствием! :)

  Развернуть 1 комментарий

@kurmanov, еее, спасибо за фидбэк!
595ые можно тоже дейзичейнить, если захочется пины экономить, я пока старался не мудрить лишний раз. Только вынес в железо упражнение с NAND логикой, чтобы если (читай когда) вдруг накосячу с кодом, не сделать КЗ через драйвера колонок соленоидов :)

Расскажи про отдельную силовую землю! Мне казалось наоборот правильнее все в одну точку заземлять. Где про это почитать?
И еще не совсем понимаю что ты хочешь спасать оптопарами, звучит мудрёно :)

А так да, индуктивности очевидно противная часть конструкции, буду экспериментировать!

  Развернуть 1 комментарий

Прикольный проект! А по вертикали только on/off или есть вариант иметь больше двух позиций?

  Развернуть 1 комментарий

@Cooch, спасибо!
Пока что только on/off, а как бы ты использовал уровни, если б были?

  Развернуть 1 комментарий

@matasoff, Вспоминаются всякие разноцветные градиенты на песке от микрософт, но как это к кнопкам прикрутить хз. Т.е. должна быть какая-то игра на телефоне с физическим фидбеком видимо

  Развернуть 1 комментарий

@Cooch, прости, о каких мелкомягких песках речь? Не очень гуглится

  Развернуть 1 комментарий

@matasoff, Типа такого

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб