У моей визитки, как и у большинства, собственной батареи нет. Но достаточно поднести её к телефону, как микроконтроллер запускает анимацию по 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 светодиод, и он исправно загорелся. Даже подстраивать ничего не потребовалось.

Естественно, сфотографировать визитку с телефона вблизи сложно.
Естественно, сфотографировать визитку с телефона вблизи сложно.

Программирование

На задней стороне визитки доступно три контактные площадки: GNDVCC и 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, а также упоминался в блогах AdafruitHackaday.com и Microchip Technologies.

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


  1. NutsUnderline
    06.09.2026 12:11

    благодатная тема для переводов. и еще бейджи с хакерских пати по типу defcon - там тоже интересные навороты и полет мыслей


  1. NutsUnderline
    06.09.2026 12:11

    че то вызывают сомнения примененые решения. неужели для nfc нет ничего готового с програмируемым ядром. по цене attiny стоило бы сравнить с теми самыми копеечными puya

    updi можно шить через почли любой usb-uart, все наработано -у меня получилось с первого раза.


    1. fivlabor
      06.09.2026 12:11

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


  1. sergyk2
    06.09.2026 12:11

    если сверху нет покрытия, то компоненты поотваливаюца от небрежного хранения


  1. kkuznetzov
    06.09.2026 12:11

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