hobby-проект по изучению печатных плат обернулся реально работающей визиткой без батареи, но с микроконтроллером, анимацией и неожиданными уроками про разрыв между обещаниями LLM и реальной отладкой железа.
Суть события
У визитки нет собственной батареи. Но достаточно поднести её к телефону — и микроконтроллер запускает анимацию по 21 светодиоду, получая питание исключительно через NFC. Исходная цель была скромной: набраться опыта в проектировании печатных плат без лишних усложнений. В реальности проект дал столько инсайтов про разрыв между тем, что обещает LLM, и тем, что происходит при отладке железа, что автор говорит о нём как о главном образовательном опыте за последнее время.
Все материалы и скрипт для KiCad — в репозитории на GitHub.
Детали
Принцип NFC-питания. Телефон несколько раз в секунду излучает слабое магнитное поле. NFC-чип улавливает это излучение, превращая телефон в крохотный беспроводной зарядник. Обратных сообщений чип не отправляет — только меняет объём поглощаемой энергии, а телефон детектирует просадки и преобразует их в двоичные данные. Большинство NFC-меток тратят собранную энергию только на внутреннюю схему. NXP NTAG I2C Plus и STMicro ST25DV-KC способны отдавать избыток постоянного тока на внешние компоненты — на этом принципе и работает визитка.
ATtiny412 → ATtiny816. Исходный чип имел всего 5 портов ввода-вывода и корпус SOIC, заметно выступающий над платой. ATtiny816 в корпусе QFN 3×3 мм дал 17 портов GPIO, что позволило подключить 20 светодиодов по схеме чарлиплексинга и оставшийся порт использовать как индикатор. Для NFC выбран NTAG I2C Plus с поддержкой повышенной мощности. При этом ёмкость на VOUT не должна превышать 220 нФ по документации — иначе просадка на шине питания создаёт цикл перезагрузки. Автор обошёл ограничение: конденсатор 10 мкФ на VCC сглаживает питание, а резистор R3 ограничивает пусковой ток до нескольких мА; через 120 мс микроконтроллер подтягивает затвор P-канального MOSFET и открывает путь с низким импедансом.
Чарлиплексинг и ШИМ. Светодиоды подключены по схеме, где ток течёт через резистор → светодиод → ещё один резистор. Количество независимо управляемых светодиодов рассчитывается как x·(x−1), где x — число портов GPIO. Шесть портов дают 20 светодиодов плюс индикатор. Резисторы 100 Ом на каждой линии при высокочастотной ШИМ сглаживаются конденсатором 10 мкФ в устойчивый ток. При 1 кГц и коэффициенте заполнения 20% напряжение VOUT падает лишь на 0,2 В.
Проектирование антенны. Параметры рассчитаны на калькуляторе STM для резонанса с внутренним конденсатором NTAG 50 пФ на частоте 13,56 МГц. Целевая индуктивность — около 2,75 мкГн. Итоговые характеристики: 8 витков, ширина дорожки 0,5 мм, зазор между линиями 0,3 мм. В KiCad нет встроенного генератора антенн-спиралей, поэтому автор написал скрипт на KiPython с помощью LLM — на это ушло буквально две минуты. Углы скруглены вручную. Дорожки светодиодов перерисовывались раз шесть — чтобы минимизировать площадь замкнутых контуров и исключить вихревые токи, реагирующие на NFC-поле. Выведены на обратную сторону платы, что также защищает антенну от наведённых радиочастотных помех.
Заказ плат и сборка. Поскольку автор летом находился вне колледжа и возможности паять самостоятельно не было, платы заказаны у JLCPCB. Безсвинцовая пайка — обязательное условие: свинца нет ни в компонентах, ни в покрытии. Высокоточная шелкография и финишное покрытие ENIG. После нескольких часов в калькуляторе стоимости выяснилось, что разница в цене между пятью и тридцатью платами ничтожна — заказаны сразу тридцать. После получения визитка подключена к VCC и GND — светодиод загорелся без какой-либо настройки.
Отладка и программатор. ATtiny816 программируется через UPDI (Unified Program and Debug Interface). Попытки использовать Arduino и RPi Pico с прошивкой jtag2updi не увенчались успехом: обе ардуинки работают с 5-вольтовой логикой, что не подошло. Автор несколько часов менял настройки IDE и контакты, подключил осциллограф — сигнала не было. Специализированный отладчик Adafruit UPDI Friend решил проблему сразу. На плате предусмотрен супрессор между UPDI и GND: в кошельках и карманах скапливается статическое электричество, и этот элемент защищает микроконтроллер от пробоя.
Код и анимация. Основной цикл написан на C — чтобы переключение светодиодов в матрице происходило максимально быстро и мерцание было минимальным. Визуально — как простой ардуиновский скетч для мигания, но без задержек. Пасхалка в коде тоже есть.
Контекст
«Hardware is hard» — расхожая истина в сообществе разработчиков, и этот проект её лишний раз подтверждает. LLM отлично объясняют концепции: NFC, чарлиплексинг, расчёт антенны — всё звучит логично и нестрашно. На практике каждая из этих идей приносит свой набор граблей: ограничения по ёмкости, вихревые токи, уровни логики, отладка без видимого сигнала. Проект начался как упражнение по чарлиплексингу, а превратился в полноценный курс по проектированию печатных плат, антеннам, силовой электронике и отладкеembedded-систем. Итоговый результат — функционирующая визитка — ожидания тоже превзошёл.
Написание скрипта для KiCad с помощью LLM заняло пару минут — и это, пожалуй, единственная часть проекта, где нейросеть не подвела. В остальном каждый этап требовал физического понимания того, что происходит, а не просто чтения документации.
Что дальше
Визитки работают. Они тоньше обычных кредитных карт и соответствуют стандартам RoHS. Теперь автор раздаёт их — не жалко, потому что запас большой. Если хочется повторить: репозиторий со скриптом для KiCad и всеми параметрами открыт. Для тех, кто только начинает с микрочипами, честный совет — начните с ATtiny816 и специализированного отладчика, а не с Arduino и переходника. Это сэкономит несколько вечеров и нервов.
Для LLM уверенно врут про микроконтроллеры — но собрать скиллы для работы с ними всё-таки можно. Даже на визитке.