惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
T
ThreatConnect
SecWiki News
SecWiki News
F
Future of Privacy Forum
AWS News Blog
AWS News Blog
C
Cisco Blogs
A
Arctic Wolf
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Scott Helme
Scott Helme
V
V2EX
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
K
Kaspersky official blog
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
NISL@THU
NISL@THU
Microsoft Azure Blog
Microsoft Azure Blog
量子位
The Hacker News
The Hacker News
Stack Overflow Blog
Stack Overflow Blog
Security Latest
Security Latest
M
Microsoft Research Blog - Microsoft Research
Google Online Security Blog
Google Online Security Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
InfoQ
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Troy Hunt's Blog
F
Fox-IT International blog
S
Security @ Cisco Blogs
博客园 - 司徒正美
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
Comments on: Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 最新话题
GbyAI
GbyAI
Project Zero
Project Zero
腾讯CDC
T
Tailwind CSS Blog

Все публикации подряд на Хабре

Не наступайте на наши грабли, если собираетесь использовать Temporal Как создать дебат-клуб в компании: пошаговое руководство от бизнес-тренера Как экономят на метановых автозаправках Всё есть код, или зачем внедрять GitOps в разработку Как получить root на Urovo DT40 Pro (CT48): Android 12 (Проверено на практике) C# мне нравится больше Java. Но в банковском enterprise мне всё равно понадобилась Java Биткоин на Московской бирже — что это? Как мы переводим миллионы iOS-пользователей на новое приложение каждые несколько месяцев Кейс. Zero Bug Policy: как мы снизили бэклог багов в 4 раза за месяц Shadow AI: 80% сотрудников уже пишут в ChatGPT. Почему мы делим задачи на красные, зелёные и серые Попытка пересмотреть ограничения рынка тяжелых БАС: нужен ли вообще кому-то легкий и дешевый электромотор Менеджер, который хакнул систему. И что AI на самом деле умножает Spec-driven development в микросервисах, часть 2: как archspec делает контекст сервисов явным Запись в Kubernetes: как контроллеры учились не перезаписывать друг друга Игровой движок 2.5D, короткие тренировки для ПК-пользователей –и еще 8 российских стартапов MCP в системе управления проектами: как поручить ИИ работу с корпоративными данными Бэклог болей: как hh работает с тем, что не нравится пользователям brec: контролируемая обратная совместимость протокола AI обнулил benchmark и пытался шантажировать инженера. И почему это решаемо Почему пластиковый корпус оказался в 3 раза дороже металлического Как спроектировать API, которое не придется переписывать через полгода Трекинг посетителей на fisheye-камерах: задача “со звездочкой” Красивый скриншот вашего кода. Большое обновление Я создаю проекты без единого созвона с командой Content Pipeline в MonoGame: почему я его не использую Гемблинг партнерки: Как выбрать, ТОП 5 в 2026 За пределами LLM, часть 2: якорная таблица Кэли, которая не является ни полем, ни моноидом Pixverse купить подписку: для чего нужна Пиксверс подписка, как выбрать тариф и оплатить в рублях Meshy AI нейросеть: как создавать 3D-модели из текста и изображений в Меши АИ на русском бесплатно Skywork AI: как использовать Скайворк АИ нейросеть на русском бесплатно, работать с промтами и создавать видео Технотекст 8: победа естественного интеллекта Capacitor: от веба к мобильным приложениям. Часть 4. Интегрируем локальный LLM в проект 20 лет видеокарт в цифрах: как росли FLOPS и TDP и кто вёл в дуэли NVIDIA vs AMD (+ открытый датасет на 13 500 GPU) Архитектура крипто-сканера для биржи: Open Interest, Funding Rate, EMA и MACD в реальном времени @tanstack/vue-table: почему я почти отказался от этого… WHERE превращает ваш LEFT JOIN в INNER JOIN. И никто вам об этом не скажет Гравитация не существует. Вы задали 454 вопроса о времени. Вот ответы с уравнениями Эйнштейна Конец бесплатного кремния: как Google AI Studio превратилась из рая для инженеров в симулятор смены аккаунтов Свой AI-агент из почты, systemd и LLM MemForge2: загрузочная флешка, которая за минуту говорит — какую планку памяти менять Лицензии важны. Разбор ошибок авторов и пользователей программ От RAG-прототипа к агенту в продакшн: путь по метрикам, а не по моде Serial Terminal: кастомный веб-терминал для последовательного порта на Web Serial API Китайский стартап GigaAI обещает робота-домработника за 1 млн рублей уже в 2027 году — правда или PR? Open-source VPN клиент Tunguska Роман за 6 недель без идеи на старте: миф или реальность? ИИ построит ваш план действий за 10 секунд Security Week 2622: эффективность Claude Mythos по версии Cloudflare Reactive Forms vs Signal Forms: Эволюция сложных форм в Angular TorFlash — приложение для Linux: поиск торрентов, скачивание и копирование на флешку в одно нажатие Как я решил проблему русской диктовки для ИИ Оверинжиниринг, потопивший немецкую подлодку или некоторые «баги» не чинятся десятилетиями Как ставить цели и не забывать о них: пошаговая система с примерами в таск-менеджере Как настроить observability в Spring Boot 3 HackTheBox. Прохождение Mini Pro Lab Puppet Обзор серверного ускорителя NVIDIA Tesla V100 16 Gb в корпусе от RTX 4090: Часть 3 — Запуск локальных моделей ИИ Редактирование текста нейросетью: как сделать диплом и курсовую более человечными Самодельный ARM ноутбук, реально ли? Как 100+ авторов пишут 100+ процессов в 3 версиях и не путаются. Или как мы переехали с Wiki на Git Прошла AnalystDays – хорошие выступления и нетворкинг VSCode как IDE для embedded разработки Моделирование широкополосной антенны с двойной круговой поляризацией и высокой изоляцией Ваше прошлое физически существует прямо сейчас. И вы заморожены там навсегда От списка инструментов к technical output: как security engineer’у описывать hands-on опыт в CV и на интервью I just want an agent. Часть 1. Как я научил ИИ собирать ИИ-агентов за пользователей и выиграл конкурс I just want an agent. Часть 1. Как я научил ИИ собирать ИИ-агентов за пользователей и выиграл конкурс Вайбкодинг спас меня от подрядчиков. А потом я поняла, что сама стала подрядчиком для своих агентов Святой Августин и GAN: почему борьба добра и зла — это генеративная состязательная сеть В каждом QR-коде зашита половина лишней информации. Намеренно Я открываю автомат ключом, меняю рулон бумаги и зарабатываю 180 тысяч в месяц с точки Мастер восстановления. Культура достиженства и выгорание Недельный геймдев: #279 — 24 мая, 2026 Защита от дублирования кода агентами: семантические концепции Frontend Status: свежий дайджест фронтенда и AI — 25.05.2026 Где искать IT-работу кроме HH: подборка платформ 2026 Почему простые числа собираются в спирали? OCR для Data Lakehouse: от Apache Tika к собственному решению на базе Docling Jira — Тьюринг-полная Kubernetes-аудит после Wiz и Prisma: как живут без CNAPP в 2026 «Тестируем MVP в 4 раза быстрее»: как нейросети изменили жизнь предпринимателей На каком стеке и железе работает умное наблюдение в вашем городе: обзор технологий от разработчиков видеоаналитики Как мы ускорили согласования на двух заводах в 24 раза Heartbeat-мониторинг cron-job'ов: dead-man-switch на FastAPI [Перевод] Сегодня нет джуниоров, а в 2031 году не станет и синьоров Профайлер для PostgreSQL: от идеи до работающего MVP за сутки [Перевод] Ограничения размера cookie в ASP.NET Core в продакшене: причины и способы решения Проблема «божественного» Obsidian: почему я отказался от централизованного подхода в работе Лицензии GNU GPL: как пройти проверку Минцифры и заказчика для госзакупок и КИИ Хакатон Samsung IT Academy Hack 2026: как студенты оптимизировали поиск в корпоративном мессенджере Хакатон Samsung IT Academy Hack 2026: как студенты оптимизировали поиск в корпоративном мессенджере MTProxy jumper — делаем автоматическое переключение прокси-серверов Telegram Ты уже используешь агента. Просто не заметил Книжный салон. Послевкусие и благодарности Как отлаживать мини‑приложения в MAX и почему без DevTools это боль Cбор биометрических данных. Как защищается наша биометрия на практике Как запустить учет активов без цифровой свалки: первые 90 дней CGE: визуализация кравлера и скрытых связей между поддоменами Зачем банки тратят миллиарды на науку (спойлер: не благотворительности ради) Книга: «Современный Java Concurrency. Глубокое погружение в Virtual Threads, Structured Concurrency и Scoped Values» Как использовать подписку ChatGPT и Claude в Cursor без оплаты за API токены
Самодельный elgato-like макропад. Часть 1, железная
Cib0rg · 2026-05-26 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение14 мин

Охват и читатели54

Кейс

Вы уж простите,может, сейчас так уже не принято, но статья написана полностью руками и без помощи LLM.

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

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

Прям мечта идиота...

Прям мечта идиота...

Искра, буря, желание... Не купить - нет, я старый пират и не знаю слова "заплати". А что если сделать нечто похожее, но чисто для себя и свои нужды? И я сел формулировать требования.

Требования к агрегату

  1. Во-первых, очевидно, программируемые макроклавиши. На которые можно назначить любое сочетание кнопок любой длины!

  2. То есть, железка должна уметь прикидываться клавиатурой, чтобы сыпать символы в любое поле ввода, где стоит курсор

  3. Впрочем, в "кошке" мне понравился тачскрин, который может использоваться для быстрого запуска экзешника, в который ему ткнули носом. Не то чтобы часто используемая функция, но почему бы и нет?

  4. ЭКРАНЫ НА КНОПКАХ!!! Потому что если уж я готовлюсь вбухать деньги, время и нервы в неизвестно что, оно обязано обладать вау-фактором, хотя бы для меня

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

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

  7. Кстати, там же надо хранить и картинки для экранов.

Окей, тут плюс-минус понятно. Логично, что, кроме самого агрегата, мне нужна будет ещё и прошивка для него, и 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, знают о чём я. Те, кто не знают - счастливые люди. Если просто, то каждая деталь может быть выполнена в нескольких размерах (для поверхностного монтажа или для ТНТ - сквозь дырки), а также в разных форм-факторах. При таком раскладе плату с дорожками собрать нельзя - хрен знает, куда дорожки вести-то. То есть каждой детали на принципиальной схеме надо назначить этот самый футпринт - это её "физический отпечаток", на который ориентируется программа, где уже рисуется физическое расположение деталей. И мало того, что это достаточно муторно из-за количества этих самых электрических элементов - так и самих футпринтов немереное количество!

Шок-контент
Это малая доля футпринтов, фильтрованных по Button

Это малая доля футпринтов, фильтрованных по Button

И дальше начинается увлекательнейшее совещание с ИИ по каждому элементу - какой футпринт выбрать, а точно ли подойдёт, а вот скрин детальки из магазина, а посмотри. И ИИ включается в игру - "подойдёт, компилятором клянусь", "бери этот", "ой, хорошо, что ты внимателен, потому что я ошибся". Бонусом идёт потеря контекста из-за длительных бесед и необходимость следить за ним самому и напоминать, что мы тут вообще делаем. Забегая вперёд, скажу, что ИИ тут, с одной стороны, хорошо помог, с другой - его стало не по детски клинить - он по 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 файла.

Тот самый посредник. Самое весёлое в том, что тут мы договорились о том, что с монтажом и элементами будут только 2 платы из 5 (минимальный заказ), т.е. я получаю 2 устройства и 3 голых платы. Шоб я так жил!

Тот самый посредник. Самое весёлое в том, что тут мы договорились о том, что с монтажом и элементами будут только 2 платы из 5 (минимальный заказ), т.е. я получаю 2 устройства и 3 голых платы. Шоб я так жил!

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

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

Прямой выход на Китай

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

И сверху ещё $5 за доставку. То есть самое дорогое тут - это пайка, сами компоненты можно даже не учитывать. То есть с комиссией самого алика у меня пять плат вышло порядка 10 килорублей. Всё ещё больно, но уже терпимо.

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

Само изготовление платы в Китае заняло около недели (без понятия почему так долго), я уже начал подпинывать менеджера с той стороны, когда он неожиданно прислал мне это.

My little PCB
Ну разве не милашка?

Ну разве не милашка?

Сказал, что ещё пара дней на пайку и всё будет отправлено. И, через четыре дня, Почта России обрадовала меня оповещением "Принято в отделении связи". В целом, общение с заводом оставило приятное впечатление, так что я, видимо, стану эпизодическим их клиентом.

Первое включение.

Думаю, все, кто читал статью, догадывались, к чему шло. Да, я получил персостатейный реальный нейрослоп - плата не стартовала. Где-то было КЗ между землёй и питанием. Это на всех пяти платах, то есть ошибка системная. Более того, две из пяти при включении выпустили волшебный дым и работать не стали совсем.

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

Вот тут и пригодилось то, что я устройство сам проектировал, своими руками. Проблема оказалась где-то в каскаде DC-DC преобразователя, который, по большому счёту, нужен как рыбе зонтик. Если аккуратно сдуть феном его компоненты и закоротить дорожки входа и выхода, пустив 5В там, где должно было быть 4В - то всё начинает работать. Да, и лайфхак с "диод на входе в светодиод" тоже не нужен - и без него всё прекрасно работает. Единственное, что пригодилось - это дешифраторы, они завелись с первого раза.

Вот так выглядит клавиатура в сборе без корпуса

Да, я капитально ошибся с футпринтом от ESP. Потому он стоит в форме отставного кавалериста.

Финал и выводы

Сейчас я держу в руках первую настоящую самостоятельно сделанную плату. Да, не совсем мною - мог бы и ЛУТ, например, использовать - но тем не менее. Ощущения непередаваемые. В айтишке, с бесконечными ямлами, двиганьем пробелов и фокусом на "код как код" постепенно пропало это чувство, когда делаешь что-то руками и потом этим гордишься. Штош, в случае, если волна увольнений доберётся до меня, я знаю, куда мигрирую.

Ну и по выводам: в отношении "не-кода" LLM сейчас не более чем слегка интеллектуальный справочник, который ещё и глючит напропалую. За которым ещё и перепроверять надо, если не хочется сюрпризов. Может, код он пишет и хорошо (лол, нет, я пробовал и об этом будет в следующих частях), но в проектировании ситуация ещё хуже. Хотя бустит он, конечно, сильно - из-за эффекта "низкого старта". Мне не пришлось сначала пару месяцев ковырять справочники, потом ещё полгода знакомиться с софтом - я сразу приступил к реализации идеи. Помогает не перегореть в процессе.

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

UPD: Уже не плату, а устройство. Печать корпуса - отдельная сказка для взрослых, но в итоге - вот оно. Ссылки на гитхаб проекта будут во второй статье.

Моя прелесссть...