Вы уж простите,может, сейчас так уже не принято, но статья написана полностью руками и без помощи LLM.
Как я уже писал в своей прошлой статье, дурная голова рукам покоя не даёт. Так что не прошло и месяца после завершения работы над звонком, как руки уже начали чесаться. И занятие им нашлось достаточно быстро...
Я пользуюсь MAD CATZ S.T.R.I.K.E. 7, которая всем чудо как хороша, кроме того, что вышла больше 10 лет назад, её производитель обанкротился в 2014 и её софт на Win 11 уже надо ставить с бубном. Все мы смертны, клавиатуры - тем более, так что я стал задумываться над заменой. Но проблема в том, что я привык к россыпи макроклавиш, которые позволяют одним нажатием, не задействуя мозг, переключать ветки гита, исправлять криво введённые команды или вбивать пароли в окошки по 15 раз за день (о боги хаоса, как я "люблю" параноиков-безопасников). А современные клавы имеют в лучшем случае 4-5 макроклавиш (что вдвое меньше, чем нужно), а некоторые ещё и стоят как приватный остров. И тут в унынии я наткнулся на это...

Искра, буря, желание... Не купить - нет, я старый пират и не знаю слова "заплати". А что если сделать нечто похожее, но чисто для себя и свои нужды? И я сел формулировать требования.
Требования к агрегату
Во-первых, очевидно, программируемые макроклавиши. На которые можно назначить любое сочетание кнопок любой длины!
То есть, железка должна уметь прикидываться клавиатурой, чтобы сыпать символы в любое поле ввода, где стоит курсор
Впрочем, в "кошке" мне понравился тачскрин, который может использоваться для быстрого запуска экзешника, в который ему ткнули носом. Не то чтобы часто используемая функция, но почему бы и нет?
ЭКРАНЫ НА КНОПКАХ!!! Потому что если уж я готовлюсь вбухать деньги, время и нервы в неизвестно что, оно обязано обладать вау-фактором, хотя бы для меня
Профили. Клавиш мало, а команд много - надо иметь возможность их переключать за конечное время.
Профили было бы неплохо хранить в памяти железки, да не оперативной - а постоянной, чтобы от драйвера на компе не зависеть полностью.
Кстати, там же надо хранить и картинки для экранов.
Окей, тут плюс-минус понятно. Логично, что, кроме самого агрегата, мне нужна будет ещё и прошивка для него, и backend - как-то же надо ему клавиши программировать... Тут я слегка приуныл, но твёрдо решил, что в жизни надо попробовать всё, тем более если есть LLM!
Первые шаги
Я рассудил так: сейчас хабр завален статьями о том, как нейронки круто пишут код. Значит, это я смогу в той или иной степени делегировать. Также, без конечной железки код не нужен, тогда как железка без кода на что-то да сгодится, так или иначе. Так что я решил начать с проектирования самого устройства. Тем более что железо такой сложности я ещё не делал (ну, то есть делал, но на соплях и макетных платах). Значит, это мой шанс научиться и сделать всё правильно лучше, чем раньше.
Окей, берём в оборот Gemini (почти полностью я пользовался им как ассистентом, лишь в конце спалил IP и попал в бан; пришлось перейти на DeepSeek) и начинаем подбирать части железки. И сразу выясняется, что кнопка с экраном стоит совершенно невменяемых денег, да ещё и хрупкая, как хрустальная ваза. Значит, кнопки и экраны разносим. Мозги мне посоветовали взять ESP32-S3-DevKit, так как ног много и, что очень важно, там два входа USB: классика с CH340 и прямой USB-OTG от чипа ESP. То есть устройство сможет прикинуться двумя разными USB устройствами одновременно: USB HID клавой, чтобы слать команды, и чем-то ещё, чьи сигналы от HID RAW я смогу читать с помощью софта бэка и обрабатывать (например, запускать что-то настроенное). Звучит как план, не так ли?
Итоговый BOM (Bill of Material) на этом этапе получился примерно таким:
ESP32-S3
Kailh Box White Owl Switch - 10шт (посоветовал ИИ вместо тактовых кнопок)
прозрачные капы под кнопки - 10шт
TZT 0,71-дюймовый круглый TFT LCD - 10шт (экранчики, достаточно небольшие, чтобы не раздувать габариты железки)
rotary encoder - 1шт (по задумке им можно будет переключать профили, крутя голову)
Вот такие вот экранчики

Схемотехника
Дальше надо было собрать саму плату. Так как опыта у меня в этом было немногим больше нуля, да и то - в теории (в ВУЗе было, я знаю правила разводки, про паразитные ёмкости-индуктивности и т.д.), а настоящего софта я руками ни разу не трогал, то мне было абсолютно всё равно, с чем начинать страдать обучение. ИИ посоветовал KiCad и там я реально прочувствовал всю кривую обучения.
Для тех, кто не в курсе: KiCad - это бесплатная программа "полного цикла" для разработки печатной платы. Там можно накидать элементы в принципиальную схему, соединить выводы, потом перенести это на саму плату и там подвигать элементы и провести дорожки, а особым бонусом идёт 3D модель устройства, на которой можно что-то прикинуть. И, как любая программа, близкая к профессиональной, она крайне недружественна к новичкам. Тут я чётко понимаю: если бы не терпеливый контекстный справочник в виде ИИ - я бы её не осилил и бросил проект.
В итоге я, с помощью Gemini, остановился на таком варианте:
два ряда по 5 экранов, под ними по 5 кнопок
под каждой кнопкой, в специальном вырезе - многоцветный адресный светодиод
сбоку от кнопочного блока - контроллер, снизу от него - энкодер
и где-то там на плате - два дешифратора (для выбора экранов. Вкратце: по 3 входам кодируются 8 выходов, экономит ноги)
Ну и дальше я начал накидывать принципиальную схему. Это оказалось просто - бери себе блоки из большой библиотеки да шлёпай на лист, да тяни между ними соединения. Или даже лучше - можно не тянуть, а просто поставить на коннектор лейбл, и KiCad будет считать всё соединённым без этих ужасных дорожек!

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

У меня есть один контроллер с ограниченным набором ног. Памятуя борьбу за них с прошлым устройством, тут я применил мозги и пару хаков:
Экранов у меня 10, они управляются по интерфейсу I2C, который в обыкновении 4 пиновый. Хорошо то, что I2C по сути не точка-точка, а шина данных - то есть я могу повесить на неё все экраны, а выбирать, какой конкретно получает текущий пакет данных, путём обращени к специальному пину CS (Chip Select). Плохо то, что 10 CS пинов всё ещё надо откуда-то взять. И тут мы используем следующий пункт
Дешифраторы-демультиплексоры. Это микросхемина, которая позволяет превратить 3 выхода в 8. Точнее, N выходов в 2^N, просто в данном случае N=3. У неё три входа, по комбинации 0 и 1 на которых она однозначно понимает, какую из 8 выходов ей надо поднять. Это три входа (2 ряда по 5 экранов) и 3 управляющих сигнала на каждую микросхему... То есть 12 вместо 10. Вайб-инженеринг какой-то. Однако - тут есть лайфхак, который мне очень понравился своей хитростью.
Окей, у меня три линии, которыми задаётся адрес конкретной ноги дешифратора. И нужен выбор микросхемы. Но постойте! Экраны могут слушать СТРОГО по одному. То есть в каждый отдельный момент времени должна быть поднята СТРОГО одна нога из 10 выводов всех микросхем. Окей, разбираем даташит: входы управления - это элемент "И", причем один из входов инвертирован. Е1 и Е2 должны быть в 0, Е3 на 1 - и тогда и только тогда чип включается. Дальше просто: первая микруха с землёй на Е1 и Е2 и входом от ESP на Е3. Вторая микруха с Е1 на ESP, Е2 на земле, Е3 на VCC. Схема работы оригинальна:
Три линии на задание номера ноги я привожу к обеим микросхемам сразу. Управляющий вывод с ESP тоже веду одной линией - тогда при 0 на нём работает одна микросхема, при 1 - вторая. То есть я элегантно сжал 12 линий до 4.Второй лайфхак - на адресных светодиодах. Под каждой кнопкой стоит такой, WS2812 - потому что могу. Однако они требуют 5В питания (ну, то есть, можно и меньше, но не сильно), и порог считывания "единицы" по шине у них - 0.7 VCC. Что совсем немного, но превышает те несчастные 3.3В, которые может выдать на ногу ESP32. Городить конвертер уровней мне очень не хотелось, и тут ИИ подсказало отличное решение. Следим за руками:
- питание на первый светодиод можно подать через диод. Который сожрёт свои 0.7 Вольта и отдаст дальше чуть меньше. По даташиту WS2812 такое проглотит.
- у нас понизился VCC -> понизился порог детекции единицы. Диод видит команды от ESP
- так как светодиоды адресные, команды подаются последовательно по цепочке. И - что важно - ретранслятором работает сам светодиод. То есть он дальше пошлёт "единицу" уже с напряжением своего VCC - то есть 4.3В. То есть дальше порог детекции мы перешагиваем автоматически.Посмотрели на экраны, там, судя по всему, есть микруха, которая понижает напряжение до комфортных экрану 3.3В за счёт нагрева Вселенной. Решили, что можно чуть сколхозить и поставить отдельный DC-DC преобразователь 5В в 4В на TLV62569DBV - чтобы понизить тепловыделение каждого экрана. Там свои, достаточно жёсткие, требования по обвязке, а уж тому идиоту, который проектировал расположение ног микросхемы, вообще хотелось гвоздь в голову забить, но в итоге, надеюсь, игра стоила свеч
Инженерная боль


Футпринты
Те, кто работает с KiCad, знают о чём я. Те, кто не знают - счастливые люди. Если просто, то каждая деталь может быть выполнена в нескольких размерах (для поверхностного монтажа или для ТНТ - сквозь дырки), а также в разных форм-факторах. При таком раскладе плату с дорожками собрать нельзя - хрен знает, куда дорожки вести-то. То есть каждой детали на принципиальной схеме надо назначить этот самый футпринт - это её "физический отпечаток", на который ориентируется программа, где уже рисуется физическое расположение деталей. И мало того, что это достаточно муторно из-за количества этих самых электрических элементов - так и самих футпринтов немереное количество!
Шок-контент

И дальше начинается увлекательнейшее совещание с ИИ по каждому элементу - какой футпринт выбрать, а точно ли подойдёт, а вот скрин детальки из магазина, а посмотри. И ИИ включается в игру - "подойдёт, компилятором клянусь", "бери этот", "ой, хорошо, что ты внимателен, потому что я ошибся". Бонусом идёт потеря контекста из-за длительных бесед и необходимость следить за ним самому и напоминать, что мы тут вообще делаем. Забегая вперёд, скажу, что ИИ тут, с одной стороны, хорошо помог, с другой - его стало не по детски клинить - он по 3-4 раза отвечал на один вопрос, повторяя ответ в каждом следующем посте, пока я его не прерывал. Ну и постоянно меня подгонял в работе. Конечно, это не "шершавый кабан", но давление я ощущал.
Примерно в этот момент ИИ сказал, что можно вместе с изготовлением платы заказать и монтаж элементов. Мне понравилась эта идея: я с ТНТ могу сам справиться, а вот с SMD опыта нет, ещё пережгу всё да и потеряю половину. То есть футпринты мелочи меняем на SMD, заодно и размер плат уменьшится. Сплошные плюсы! То есть прошлый абзац повторяем ещё раз.
Естественно, такое изменение потянуло за собой другое: если я хочу купить детали, мне надо указать какие. Слава Кхорну, есть общая база LCSC, которой пользуются китайские изготовители. Там ищешь подходящую деталь, копируешь артикул и... К каждой детали добавляешь кастомное поле LCSC и туда его вставляешь. Предварительно обсудив с ИИ, конечно. Ещё минус пара дней.
Гладко было на бумаге...
Примерно в этот момент я решил-таки заняться физикой. Ну, там, токи посчитать, стабильность обеспечить. Тут ИИ радостно включился в игру: тут добавь конденсатор, тут микруху, а вот конденсатор ещё, кстати, ты про конденсатор не забыл? Дошло до того, что меня уже даже затроллили.

Потом оказалось, что у меня везде разные напряжения, надо согласовывать уровни. Потом посчитали токи - выяснили, что DevKit банально сгорит от такого количества экранов, надо отдельный вход питания и DC-DC преобразователь для железа. Которому тоже нужна обвязка, которой нужны футпринты, которым нужны LCSC... Сказка про белого бычка, которая заняла у меня ещё кучу времени. Отдельным весельем было то, что для модулей TZT готовых футпринтов нет, пришлось колхозить и собирать их самому. Потому что иначе вполне был вариант получить плату, в которую элементы просто не влезут...
Внешний вид самой платы

Итог: под каждым экраном стоит фильтрующий конденсатор на 100нФ, который сглаживает фронты и чуть режет наводки. Под кнопками - WS2812, на кнопках там специальное углубление и стекло сверху, чтобы красиво световодить на колпачки. Левый верхний угол: сверху посадочное место ESP32, снизу - USB-C для питания от 2А блока.Обратите внимание на диаметр дорожки, она рассчитана на большой ток - под 2А обычные дорожки долго не протянут. Точнее, такое токи - это пиковые, когда все экраны с яркостью 100% постоянно что-то отрисовывают, диоды горят и всё моргает как ярмарка на карнавале. В реальной жизни у дисплеев есть свой контроллер, который поддерживает последний отданный им кадр (тут и далее - со слов Gemini) и в покое это ест куда меньше тока.
Сразу под ESP стоит мегабанка конденсатора в 470мкФ, который работает буфером по входу питания - такой ёмкости вполне хватит, чтобы сглаживать пульсации по питанию, если таковые будут. Рядом с ним тот самый DC-DC с обвязкой, а совсем внизу - поворотный энкодер, шапка которого будет торчать и который я буду постоянно задевать руками при работе. Между рядами экранов стоят дешифраторы. Стоят криво, т.к. я пытался уменьшить количество переходов со слоя на слой, но в какой-то момент этот тетрис меня добил и я сдался, оставив так. Наверняка можно было сделать лучше, но я сломался.
Физический слой
Когда, наконец, я закончил с принципиальной схемой, пришло время того, что я считал интересной частью - расстановка элементов на физической модели платы. Тут как раз уже ключевая роль футпринтов - они моделируют физические размеры элементов. И тут были свои подводные камни и своя часть KiCad, к которой я был не готов и которую тоже пришлось изучать с нуля. Всплыло много нюансов физического расположения: те же конденсаторы (которые нужны для фильтрации помех) нужно располагать максимально близко к деталям, а у DC-DC вообще жесткие требования к обвязке - например, ему нужна индуктивность, которая стоит вплотную к ногам, не далее 2мм, а то он будет глючить. То есть началась игра в пятнашки - как расположить это всё на маленьких пятачках, да так, чтобы ещё и дорожки к этому не превратились в спагетти. Параллельно я пытался расположить экранно-кнопочный блок максимально компактно, не превратив его в аэродром - благо, в программе есть возможность распечатать плату в размере 1:1. Первые ревизии были размером с А4, что было откровенно многовато. Но мне было страшно двигать вслепую, так что я таки дождался, пока ко мне приедут экраны и кнопки и, расположив их на распечатанной плате, примерялся уже на реальных физических обьектах. В итоге плату я сжал до 17см х 13см, что вполне уже можно назвать "компактной" - даже двух ручек для переноски нет. Но в процессе сжатия я допустил типичную ошибку новичка: сначала развёл половину платы. Как потом оказалось, KiCad не умеет при переносе элемента менять геометрию проложенных дорожек. А то, что умеет - лучше бы не умел, так как получается лапша и пересечения. Пришлось всё удалять и разводить снова, когда элементы были уже зафиксированы на местах.
Я умный, я у мамы инженер. Я учился проектировать микросхемы на кафедре микроэлектроники, где нам с придыханием рассказывали про автотрейсеры, которые по оптимальным алгоритмам разводят дорожки на девайсах. Конечно, я решил, что поищу такой - ибо ручной труд есть зло великое, и вообще, кто из нас не отлаживал 8 часов скрипт, который за 5 минут делает то, на что без скрипта ушло бы 4 часа? Так вот, автотрейсеры - крутая штука. С ними ты понимаешь, что работы-то не так и много было. Примерно 70% они разводят круто. Остальное - как получится, с пересечениями с другими дорожками, о чем, конечно, признаются и просят поправить руками... чего я и хотел избежать. Не знаю, может, это мне так не повезло, но после двух дней попыток я плюнул и дальше всё раскидывал руками. Этот процесс занял у меня около двух недель периодической работы по вечерам.
С габаритами железки тоже были приключения. Стандартные штыревые разьёмы торчат почти на сантиметр, мне этого не хотелось. Посовещался с ИИ, решил брать цанговые - это очень низкие с пружинным зажимом внутри. В теории - хороший контакт при компактных габаритах. Я специально спросил, подойдёт ли в "маму" стандартная гребёнка, получил ответ, что да. Конец немного предсказуем. Ну и бонусом поймал биполярку от нейросети:
(Я): С цангой не вышло, надо папу цанговую брать.
(ИИ): Нет, это очень плохая идея, ужаснее быть не может, ни в коем случае не делай этого!
(Я): Но у меня компоненты пока не распаяны, я им ноги любые могу присобачить
(ИИ): Это самая лучшая идея, которую ты мог придумать, срочно патентуй и обязательно делай именно так!
(Я): Значит, займусь пайкой цанг
(ИИ): Нет, ты что, пайка опасна, не вздумай!..
и так далее.
Заказ платы
Проектирование - это хорошо и весело, но мне нужно было железное устройство в руках. Ранее можно было заказать напрямую в Китае, на заводе - но в 22 году что-то случилось и с РФ они более не работают - хотя у некоторых даже страницы на чистейшем русском языке сохранились. Я выделил несколько вариантов изготовления:
заказ у российских изготовителей (они, конечно, есть, мало ли - вдруг будут нормальные условия)
заказ у авитовских "посредников" и "решал"
заказ в Китае напрямую (чем чёрт не шутит)
Результатами калькуляций я был не то чтобы ошарашен, но достаточно сильно удивлён. Конечно, я не буду приводить никаких имён и названий, просто приложу несколько скриншотов с комментариями, которые говорят сами за себя. Да, этот раздел будет очень короткий и грустный.
Расчёт отечественного производства
Первыми откликнулись отечественные производители. Тут всё очень не демократично:


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


Прямой выход на Китай
Оказалось, что китайцы как бы и не работают с нами, но как бы и бабло терять неохота, потому на Алиэеспрессе есть обьявления о создании печатных плат. По паре таких я и пробежался. Один из вариантов меня не устроил тем, что они не смогли в BOM и предложили голые платы, хоть и дёшево. Второй же продавец задал один уточняющий вопрос про изготовление и сам же на него ответил. Вот его предложение:

И сверху ещё $5 за доставку. То есть самое дорогое тут - это пайка, сами компоненты можно даже не учитывать. То есть с комиссией самого алика у меня пять плат вышло порядка 10 килорублей. Всё ещё больно, но уже терпимо.
До этого я иногда задавался вопросом, зачем кормить китайские фабрики, если есть свои. Теперь все вопросы такого рода отпали. Простите, парни, если читаете тут о себе, но вы охренели.
Само изготовление платы в Китае заняло около недели (без понятия почему так долго), я уже начал подпинывать менеджера с той стороны, когда он неожиданно прислал мне это.
My little PCB

Сказал, что ещё пара дней на пайку и всё будет отправлено. И, через четыре дня, Почта России обрадовала меня оповещением "Принято в отделении связи". В целом, общение с заводом оставило приятное впечатление, так что я, видимо, стану эпизодическим их клиентом.
Первое включение.
Думаю, все, кто читал статью, догадывались, к чему шло. Да, я получил персостатейный реальный нейрослоп - плата не стартовала. Где-то было КЗ между землёй и питанием. Это на всех пяти платах, то есть ошибка системная. Более того, две из пяти при включении выпустили волшебный дым и работать не стали совсем.
Вот тут и приходит отрезвление. Когда работаешь с нейронками с кодом, всегда есть мысль "осталось чуть-чуть, поправлю позже". При работе же с реальным железом приходится принимать, что вот сейчас - всё, отдаём в печать, все риски фиксируем. И проблемы - тоже фиксируем. И виноват в этом ты сам.
Вот тут и пригодилось то, что я устройство сам проектировал, своими руками. Проблема оказалась где-то в каскаде DC-DC преобразователя, который, по большому счёту, нужен как рыбе зонтик. Если аккуратно сдуть феном его компоненты и закоротить дорожки входа и выхода, пустив 5В там, где должно было быть 4В - то всё начинает работать. Да, и лайфхак с "диод на входе в светодиод" тоже не нужен - и без него всё прекрасно работает. Единственное, что пригодилось - это дешифраторы, они завелись с первого раза.
Вот так выглядит клавиатура в сборе без корпуса


Да, я капитально ошибся с футпринтом от ESP. Потому он стоит в форме отставного кавалериста.
Финал и выводы
Сейчас я держу в руках первую настоящую самостоятельно сделанную плату. Да, не совсем мною - мог бы и ЛУТ, например, использовать - но тем не менее. Ощущения непередаваемые. В айтишке, с бесконечными ямлами, двиганьем пробелов и фокусом на "код как код" постепенно пропало это чувство, когда делаешь что-то руками и потом этим гордишься. Штош, в случае, если волна увольнений доберётся до меня, я знаю, куда мигрирую.
Ну и по выводам: в отношении "не-кода" LLM сейчас не более чем слегка интеллектуальный справочник, который ещё и глючит напропалую. За которым ещё и перепроверять надо, если не хочется сюрпризов. Может, код он пишет и хорошо (лол, нет, я пробовал и об этом будет в следующих частях), но в проектировании ситуация ещё хуже. Хотя бустит он, конечно, сильно - из-за эффекта "низкого старта". Мне не пришлось сначала пару месяцев ковырять справочники, потом ещё полгода знакомиться с софтом - я сразу приступил к реализации идеи. Помогает не перегореть в процессе.
В следующей части будет о приключениях с написанием софтовой обвязки. Статьи писались kinda параллельно, так как с платой циклы ожидания долгие, да и переключаться хотелось иногда, так что возможны скачки и рваное повествование. Вас предупредили. Оставайтесь тунцом..
UPD: Уже не плату, а устройство. Печать корпуса - отдельная сказка для взрослых, но в итоге - вот оно. Ссылки на гитхаб проекта будут во второй статье.
Моя прелесссть...

Tomasina
Задолго до SteamDesk был Оптимус от Лебедева, в различных вариациях клавиш. И они более функциональны.
Cib0rg Автор
О, воспоминание разблокировано, да. Идея-то, в целом, не нова ни разу. Но спустя столько лет они остались только на Авито и не ясно в каком состоянии.
В любом случае - спасибо, что напомнили, что есть и такой вариант.