
У моей визитки, как и у большинства, собственной батареи нет. Но достаточно поднести её к телефону, как микроконтроллер запускает анимацию по 21 светодиоду, получая питание исключительно через NFC.
Этот проект я начал около трёх месяцев назад, чтобы без лишних усложнений набраться опыта в проектировании печатных плат. Вот только «без лишних усложнений» продолжалось недолго. В процессе разработки этой визитки я получил гораздо больше опыта, чем планировал, да и сам конечный результат мои ожидания тоже превзошёл. Все детали проекта можно найти в репозитории.
Я повидал много разных визиток, изготовленных на базе печатной платы. В большинстве для нанесения контактных данных и QR-кода использовалась шелкография и медь. И это реально круто, но такие карточки больше про графический дизайн, чем про электронику. Встречались и более сложные версии — с дисплеем, батареями и разъёмами для подключения внешних устройств. Как по мне — это очень крутые модели, но дорогие и слишком уж массивные.
Я же хотел получить простую и достаточно недорогую визитку, которую было бы не жалко отдавать людям. В конечном итоге мне попалась информация о визитных карточках с NFC. Их принцип меня полностью устраивал: никакой батареи, минимум манипуляций с радиоэлектроникой и недорогие комплектующие. Когда я начал изучать конкретные чипы NFC, то понял, что подавать питание на другие компоненты способны лишь немногие — в частности, ими оказались NXP NTAG I2C Plus и STMicro ST25DV-KC.
Думаю, стоит пояснить общий принцип работы NFC. Ваш телефон по нескольку раз в секунду излучает небольшое магнитное поле. NFC-чип улавливает это излучение, в некотором роде превращая ваш телефон в крохотный беспроводной зарядник. Обратных сообщений телефону чип не отправляет — он лишь изменяет объём поглощаемой энергии поля, а телефон детектирует эти просадки и преобразует информацию о них в двоичные данные. Большинство NFC-меток используют собранную энергию только для питания внутренней схемы, но есть и такие, которые могут передавать избыток постоянного тока на внешние компоненты. Как раз на этом принципе и работает моя визитка.
В теории всё выглядело не сильно сложно, и я без проблем накидал схему в KiCad. В качестве микроконтроллера я выбрал ATiny412. Он компактный, имеет достаточно вводов-выводов и требует очень мало энергии.

Светодиоды я подключил по технике Чарлиплексинга, задействовав характерное свойство светодиодов пропускать ток только в одном направлении. В приведённой статье Wikipedia это всё прекрасно описано, но ключевой момент в том, что трёхстабильная логика позволяет управлять множеством светодиодов с помощью всего нескольких портов ввода-вывода. Конкретный расчёт можно сделать по формуле y = x⋅(x-1), где y представляет количество светодиодов, которыми можно управлять независимо, а x — количество вводов-выводов. Главный недостаток такого решения в том, что одновременно может гореть только один светодиод. Но это ограничение можно обойти с помощью ШИМ, распределив рабочие циклы между несколькими LED. В этой пилотной версии я реализовал управление 12 светодиодами с помощью 4 вводов-выводов (от GPIO_A до GPIO_D).
Архитектура системы
Изначально я выбрал ATtiny412, но быстро понял, что это не самый оптимальный выбор. У этого микроконтроллера всего 5 портов ввода-вывода, и выпускается он только в корпусах типа SOIC с ножками, а не в формате QFN, поэтому оказывается выше над печатной платой.
Этим летом я находился вне стен колледжа, и возможности самостоятельно собрать платы у меня не было. Тогда я решил заказать их у JLCPCB. К тому же, поскольку я собирался раздавать эти визитки людям, мне хотелось исключить наличие в них свинца. А возможностей для безсвинцовой пайки у меня нет даже в колледже. В этом смысле JLCPCB полностью отвечает требованиям RoHS, так что выбор был очевиден.
Ну а раз я всё равно планировал заказывать профессиональную сборку, то счёл разумным выбрать более компактный корпус QFN, в котором ATtiny412 не выпускается. Немного порывшись в сети, я нашёл ATtiny816. Он похож на 412-й, но уже имеет 17 портов ввода-вывода и выполнен в гораздо более тонком корпусе 3 × 3 мм. Теперь я мог выделить под светодиоды шесть портов GPIO, что позволило подключить 20 штук по схеме чарлиплексинга, а оставшийся использовать в качестве индикатора, включив его между GPIO и GND. Кроме того, я решил перейти на NXP NTAG I2C Plus, так как он поддерживает стандарт NFC с меньшим радиусом действия, но более высокой мощностью.

Читая документацию к NTAG I2C Plus, я заметил, что ёмкость на VOUT не должна превышать 220 нФ. Если взять конденсатор с большей ёмкостью, это приведёт к просадке на шине питания и создаст цикл перезагрузки, который не позволит системе запуститься. Но я всё же хотел конденсатор пожирнее, поэтому придумал такую схему:

С3 на 10 мкФ внизу помогает сгладить VCC, но при запуске он бы потреблял слишком большой ток. Чтобы это исключить, в цепь установлен R3, который ограничивает пусковой ток до нескольких мА. Однако после зарядки конденсатора этот резистор стал бы излишне его замедлять. В этом случае P-канальный MOSFET, Q1, выступает в качестве ключа. Спустя 120 мс после запуска, когда C3 полностью зарядился, микроконтроллер подтягивает GATE к нижнему уровню, создавая для конденсатора путь с низким импедансом, чтобы сгладить просадки напряжения. R2 здесь играет исключительно подтягивающую роль, чтобы удерживать GATE на высоком уровне первые 120 мс. Таким образом мне удалось собрать схему с использованием ёмкого конденсатора, не отклоняясь от основной документации.
На каждой линии чарлиплексинга я решил установить резисторы 100 Ом. Общее сопротивление при этом, по сути, удваивается, так как ток должен протекать из одного порта ввода-вывода через резистор -> светодиод -> ещё один резистор. Я также понял, что если резисторы на 100 Ом будут пропускать слишком большой ток, то можно применить к светодиодам высокочастотную ШИМ. За счёт конденсатора на 10 мкФ эти импульсы будут сглаживаться в устойчивый ток, предотвращая просадку VOUT. Если верить расчётам, то при частоте обновления 1 кГц и коэффициенте заполнения ШИМ 20% напряжение VOUT будет падать всего на 0,2 В.
Сборка антенны
Подходящие размеры и характеристики антенны я определил с помощью калькулятора индуктивности от STM. Я хотел, чтобы она охватывала всю площадь карты. В итоге путём нехитрых экспериментов с количеством витков, шириной дорожки и расстоянием между её линиями, мне удалось найти удачное сочетание этих параметров. Мне нужно было обеспечить индуктивность около 2,75 мкГн, чтобы антенна резонировала с внутренним конденсатором NTAG ёмкостью 50 пФ на частоте 13,56 МГц. Добиться этого удалось при следующих характеристиках:

Благодаря чуть меньшей индуктивности, я могу настроить антенну точно на нужную частоту. Если сделать её ровно 2,75 мкГн, то в случае погрешности поднять частоту до нужного уровня уже никак не удастся. Поэтому я сразу параллельно включил в цепь конденсатор на 1,5 пФ, чтобы слегка опустить частоту. Если же его вдруг окажется мало, то я всегда смогу впаять более ёмкий, чтобы снизить её ещё.
Следующим делом я занялся разводкой печатной платы. Меня удивило, что в KiCad нет инструмента для генерации антенн или катушек индуктивности, а все плагины, которые я перебрал, не прямоугольную спираль создать не могли. Решением стал скрипт на KiPython. Написал я его с помощью LLM — после буквально пары минут диалога скрипт уже работал. Он генерирует простую дорожку в виде прямоугольной спирали, которая в точности соответствует параметрам, что я вводил в калькулятор от STM. Я добавил этот файл .py в репозиторий — возможно, он пригодится другим. После этого я вручную скруглил углы — эта небольшая правка уменьшила площадь охвата антенны всего на несколько процентов.

Компоновка
Я подумал, что будет красиво разместить все микросхемы и пассивные компоненты в левой части платы. В конечном итоге я раз шесть перерисовывал дорожки для светодиодов и остановился на дизайне, показанном ниже. И хотя можно развести их так, чтобы сократить среднюю длину дорожки, я хотел избежать формирования замкнутого контура и заодно минимизировать его площадь. Если бы он получился замкнутым, дорожки начали бы взаимодействовать с NFC-полем, создавая разрушительные вихревые токи. Оставив разрыв по центру верхней части контура, я исключил формирование этих токов и защитил антенну от наведённых радиочастотных помех.
Цветовая маркировка не только сделала наглядными пути отдельных дорожек, но и приукрасила схему в целом. Разводка дорожек плотным шлейфом всё же склонна создавать внутренние паразитные токи, но этот эффект уже не связан с основным контуром. Избавиться от этой проблемы удалось за счёт минимизации ширины дорожек и расстояния между ними.

Обратная сторона
Я решил вывести все дорожки на обратную сторону визитки. Ещё я набросал простую блок-схему и составил список необходимых компонентов. Чтобы продублировать рисунок дорожек на оборотной стороне платы, я экспортировал слои F.Cu и B.Cu в формате .SVG, после чего перенёс их на слой B.Silkscreen, выровняв на глаз. У меня получилась нетипичная разводка, и опытный инженер наверняка найдёт, что здесь можно улучшить. Уверен, многие зададутся вопросом: «А почему он не залил плату землёй?» Дело в том, что сплошной полигон земли экранировал бы магнитный поток через антенну, напрочь её убив.

Изготовление и сборка
По размеру визитки такие же, как обычные кредитные карты, и я специально немного доплатил, чтобы они получились ещё и такими же тонкими. Плюс я выбрал высокоточную шелкографию и финишное покрытие ENIG. Теперь они стали полностью соответствовать стандартам RoHS, не имея в своём составе никакого свинца или иных опасных веществ.
Когда дело дошло до оформления заказа, мне нужно было решить — заказать несколько штук на пробу или сразу рискнуть по-крупному? После нескольких часов расчётов в калькуляторе стоимости JLCPCB я понял, что стоимость каждой дополнительной платы ничтожно мала, и разница в цене между пятью и тридцатью штуками получалась совсем небольшой. Тогда, собравшись с духом, я скрестил пальцы и заказал сразу тридцать.
Когда заказ прибыл, я первым делом решил проверить, а сможет ли моя визитка реально питаться по NFC. Я подключил между VCC и GND светодиод, и он исправно загорелся. Даже подстраивать ничего не потребовалось.

Программирование
На задней стороне визитки доступно три контактные площадки: GND, VCC и UPDI. Такой же порядок применяется в радиоуправляемых сервоприводах — он исключает возможное повреждение схемы, если при подключении случайно развернуть коннектор на 180 градусов. Диаметр каждой площадки 1,8 мм, а шаг между их центрами составляет 0,1”/2,54 мм. Это стандартное для макеток расстояние позволяет подключиться к плате с помощью «прищепки» без использования дополнительных компонентов. С визитками обращаются довольно небрежно и обычно хранят их в подверженных статике бумажниках или карманах, поэтому я добавил между UPDI и GND супрессор. Теперь высокое напряжение будет сбрасываться в «землю» и не спалит ненароком микроконтроллер.


ATtiny816 программируется через UPDI (Unified Program and Debug Interface). По сути, это UART, только в однопроводном формате. Для него существуют официальные отладчики, но можно обойтись и простым переходником USB-UART. Некоторые также используют в качестве программаторов Arduino или RPi Pico, и мне такой вариант показался самым интересным. Большинство ардуинок, которые поддерживают прошивку jtag2updi, работают с 5-вольтовой логикой, поэтому мне пришлось взять Pico. Я нашёл файл UF2, всё подключил и… тишина. Я несколько часов ковырялся в настройках IDE и пробовал разные контакты. Наконец, мне пришла «гениальная» идея подключить выход программатора к осциллографу. Сигнала не было. Я почувствовал себя крайне глупо и решил заказать Adafruit UPDI Friend. С ней всё заработало сразу.
Сам код отчасти похож на простейший скетч Arduino для мигания светодиодом. Но я решил написать основной цикл на C, чтобы переключение светодиодов в матрице чарлиплексинга происходило как можно быстрее, сводя мерцание к минимуму. Ещё я спрятал в коде пасхалку — попробуйте отыскать. Ну и для экономии энергии снизил тактовую частоту ATtiny до 1 МГц.
Иронично, но NTAG I2C Plus в моей схеме не подключён к микроконтроллеру через I2C. Для его программирования я изначально использовал популярное приложение NFC Tools под Android. Но после нескольких ошибок понял, что для форматирования визитки и записи на неё моих контактных данных гораздо лучше подходит NXP TagWriter.
И QR-код, и NFC-ссылка ведут на страницу https://connect.wilsonharper.net. Сейчас она просто перенаправляет на мой основной сайт https://wilsonharper.net, но я также могу через панель Cloudflare сделать перенаправление на любой другой URL-адрес без каких-либо изменений аппаратной части.
Список материалов

Усвоенные уроки
Тридцати изготовленных визиток должно хватить надолго. Но когда они закончатся, я планирую выпустить вторую версию. Напряжение VOUT остаётся достаточно высоким, чтобы запитать светодиоды абсолютно любого цвета, так что было бы интересно попробовать зелёные или жёлтые. Ещё я подумываю добавить одну-две тоненькие кнопки для интерактивности — с таким светодиодным кольцом можно реализовать несколько простеньких аркадных игр.
Мне нередко доводилось слышать фразу «Hardware is hard», и в этом проекте я прочувствовал её смысл сполна. Если брать по отдельности, то все его компоненты вполне знакомы и сложными их не назовёшь: печатные NFC-антенны, мигающие светодиоды под управлением микроконтроллера и визитки на основе печатных плат — всё это уже создавалось. Вот только, насколько мне известно, ещё никто не собирал их в единый красивый дизайн. По крайней мере найти такой пример в сети мне не удалось (есть проекты с питанием по NFC, со схемой внутри контура антенны или применением чарлиплексинга — но нигде эти фичи не собраны воедино). Моментами мне казалось, что задача реально превыше моих сил. Но трижды перепроверив все возможные проблемы, я понял, что нужно просто рискнуть и отправить плату в производство — и я безумно рад, что не сдрейфил.
Кому интересно, проект обсуждается на Hacker News, а также упоминался в блогах Adafruit, Hackaday.com и Microchip Technologies.

Комментарии (16)

NutsUnderline
06.09.2026 12:11че то вызывают сомнения примененые решения. неужели для nfc нет ничего готового с програмируемым ядром. по цене attiny стоило бы сравнить с теми самыми копеечными puya
updi можно шить через почли любой usb-uart, все наработано -у меня получилось с первого раза.

fivlabor
06.09.2026 12:11Для NFC знаю только nRF52/53 (старые и дорогие) или ch585/4 (тут можно заодно LED-адресные) - но они чуть крупнее (qfn26 есть только для редкого ch585c), и могут оказаться с питанием капризнее, чем attiny

kkuznetzov
06.09.2026 12:11Таких плат тьма. И такое делаю, но не визитку, а плату оценки напряжёности поля считывателей. И то идея не моя.

BlackSCORPION
06.09.2026 12:11Был на презентации этого чипа NXP NTAG I2C Plus (и других поделий от NXP). В демо комплекте идёт платка с LCD дисплеем, светодиодом и кнопками, питается от NFC, а также общается с программой в телефоне по этому же NFC. Чип предоставляет питание и I2C через NFC.
Если кому интересно вот https://www.nxp.com/company/about-nxp/smarter-world-videos/NTAG-I2C-PLUS-EXPLORER-BOARD

dlinyj
06.09.2026 12:11Спасибо за перевод!
На счёт самого решения, оно очень спорное. Все эти детали отваливаются достаточно легко. Всё же визитка должна быть полностью плоской. Но концептуально это очень прикольно.
kenomimi
06.09.2026 12:11Визитку надо делать на максимально тонкой плате (0.6 вроде), и сверху клеить пластину акриловую с вырезами под торчащие компоненты, сверху пленку. Тогда в 2 мм толщины довольно несложно вписаться, компоненты не отобьются, и свинец в припое не помешает.
NutsUnderline
благодатная тема для переводов. и еще бейджи с хакерских пати по типу defcon - там тоже интересные навороты и полет мыслей
tklim
Это имеет смысл, а слово визитка, как и визитница (хабр даже подчеркивает орфографию) утратили смысл 20 лет назад.
Но самое главное, в 2026 ни один адекватный ИТ руководитель не будет у себя держать среди документов или дома непонятный девайс, который, который как-то может к чему то подключаться и скомпрометировать какие то данные. А в такую карту и батарейку и жучек и ещё чего можно добавить
NutsUnderline
говорят еще тов. И.Сталину или кому т о такому подарили часы со встроенным жучком который работал без батареек вообще
Vasay125rus
Американскому консулу, герб США из драгоценных пород дерева, да, с жучком :)
dragonnur
- Не Иванов, а Рабинович, не в лотерею, а в преферанс, не Волгу, а три рубля, не выиграл, а проиграл.
NutsUnderline
суть то в другом. тоже подарили девайс, руководителю.
Bigdoc
https://habr.com/ru/companies/pult/articles/418959/