Разработчик собрал плату-визитку с NFC и светодиодом без батарейки

Разработчик решил, что бумажная визитка, это скучно, и сделал свою в виде печатной платы: пластинка размером с банковскую карту, глянцево-чёрная, с золотым рисунком и именем. По собственным словам, никакой глубокой философии за этим не стояло, просто показалось, что вручать человеку кусок электроники веселее. Необычными в карточке оказались две вещи, и обе не видны, пока к плате не поднести телефон.
Первая, чип NFC (Near Field Communication, ближняя бесконтактная связь): при касании телефон открывает личный сайт автора. Это та же технология, что и в картах для бесконтактной оплаты и в проездных, и работает она на частоте 13,56 МГц. По краю платы семь раз обёрнута медная спираль, антенна, и настройка её резонанса на нужную частоту заняла основную часть работы над платой.
Вторая вещь, главный трюк карточки. На плате нарисован Чаризард, персонаж «Покемона», и на кончике его хвоста стоит красный светодиод: при касании телефоном хвост как будто загорается. Батарейки на плате нет, ни батарейного элемента, ни провода питания, ничего, что можно было бы зарядить заранее. Светодиод целиком питается энергией, которую при чтении метки излучает сам телефон. Обычный NFC-ридер не просто слушает метку, он создаёт вокруг себя сильное радиополе, чтобы запитать саму метку, у которой тоже нет батарейки: чип рядовой NFC-наклейки просыпается на этой одолженной энергии ровно настолько, чтобы ответить, и гаснет, как только телефон убирают. Но некоторые чипы дополнительно отдают остаток этой энергии на отдельный вывод, которым можно распорядиться по своему усмотрению. По документации NXP, для использованного в проекте чипа NTAG I²C Plus типичный показатель такой отдачи, около 5 миллиампер при 2 вольтах в одном конкретном тестовом режиме (это именно типичное значение, а не гарантированный минимум), немного, но достаточно, чтобы зажечь светодиод, мигнуть маломощным датчиком или на долю секунды разбудить микроконтроллер. Автор сравнивает это с зеркалом: метка не излучает собственный радиосигнал, а лишь по-разному отражает сигнал телефона, и телефон считывает эти изменения как биты сообщения, телефон приносит всю энергию, а карточка только решает, что от неё отразить. Похожий трюк уже встречался на рынке: несколько лет назад банк U.S. Bank выпускал платёжную карту, чей логотип светился во время бесконтактной оплаты, и карта была настолько популярна, что банку не хватало тиража.
Всю плату, трассы, катушку антенны, положение каждой буквы, автор описал кодом: у бесплатного редактора печатных плат KiCad есть Python API, так что вся плата генерируется скриптом, а не рисуется мышью, и, как отмечает автор, это придаёт спокойствия новичку в железе, не страшно поменять параметр и пересобрать всё заново. На обороте платы, ещё одна шутка для тех, кто её перевернёт: оборот оформлен как настоящий даташит (техническое описание, которое прилагается к любому электронному компоненту), с расчётом резонанса антенны, впечатанным прямо в шелкографию, и двумя настоящими контактными площадками, которые дотошный инженер может проверить мультиметром. А на лицевой стороне, там, где у обычной чиповой карты золотые контакты, только рисунок такой же восьмиконтактной площадки без чипа под ней: настоящий чип NFC спрятан на обороте, а то, что похоже на чип спереди, муляж.
Файлы отправились на фабрику JLCPCB, которая изготавливает и собирает печатные платы: примерно за 75 долларов там изготовили десять экземпляров и напаяли на каждый чип и светодиод. Через несколько дней пришла посылка с десятью готовыми платами.
Тут же обнаружилась проблема. При касании первой платы светодиод мигал, значит, антенна и питание работали, но сайт не открывался: чистый чип нужно было ещё записать. Автор открыл NFC Tools, стандартное приложение для такой записи, поднёс карту к iPhone и получил ошибку: «NFC-метка не поддерживается». Причина, в выборе чипа: NTAG I²C Plus, не рядовая NFC-наклейка, а чип-посредник, который рассчитан на то, чтобы стоять внутри устройства и по проводу общаться с микроконтроллером, а NFC-часть у него, как бы бонус; именно этот чип даёт вывод для энергии, ради которого он и был выбран, но поставляется он «чистым», без формата NDEF (стандартного формата NFC-записей), который сообщает обычному приложению, куда именно записывать ссылку. NFC Tools пользуется высокоуровневым NDEF-интерфейсом iOS, и тот воспринял неотформатированный чип как неподдерживаемый, вместо того чтобы его отформатировать. Резервный телефон на Android тоже не помог: у дешёвой предоплаченной модели официально есть поддержка NFC, но в версии конкретного оператора связи модуль NFC просто не поставили ради экономии, телефон физически не умеет NFC.
Автор понял, что дело не в самом чипе, а в проверке на уровне приложения: чип по-прежнему отвечает на обычные низкоуровневые команды памяти, рядовые приложения останавливаются раньше, на проверке NDEF. У фреймворка Core NFC от Apple для iOS есть низкоуровневый режим, команда sendMiFareCommand, который позволяет обращаться к метке напрямую, в обход этой проверки, если написать приложение самому. Автор написал совсем небольшое приложение для iPhone, около шестидесяти содержательных строк кода, которое открывает сессию NFC и вручную отправляет команды записи: сначала заголовок, объявляющий чип NFC-меткой со ссылкой, затем сам адрес сайта, кусками по четыре байта, с подтверждением после каждой команды. После этого запись прошла успешно, а при следующем касании телефон предложил открыть сайт, и светодиод загорелся, так сработало на каждой из десяти карт.
Один недостаток остался: карту нужно прижимать точно к верхнему краю телефона, иначе запись срывается. Автор считает, хотя и не проверял это отдельным измерением, что причина в самом светодиоде: он тоже забирает часть той же наведённой энергии, которая нужна чипу для работы, и запаса мощности остаётся меньше, чем у обычной метки без светодиода. В следующей версии платы автор планирует чуть уменьшить яркость свечения ради большей дальности считывания. Главный вывод для себя автор формулирует так: самой сложной частью аппаратного проекта регулярно оказывается не электроника, а последний шаг софта, зазор между «предмет физически существует» и «предмет делает то, что должен». Антенна и вся электроника заработали с первой попытки; чуть не сорвала весь проект галочка совместимости в чужом приложении, которое просто не знало об этом конкретном чипе.
Ключевые факты
- Плата-визитка размером с банковскую карту сочетает чип NFC (NXP NTAG I²C Plus) и красный светодиод на кончике нарисованного Чаризарда, без единой батарейки на борту.
- Светодиод питается энергией, которую при касании (13,56 МГц) излучает сам телефон; по документации NXP типичный показатель отдачи чипа, около 5 миллиампер при 2 вольтах в одном тестовом режиме, а не гарантированный минимум.
- Десять готовых плат, с уже напаянными чипом и светодиодом, обошлись примерно в 75 долларов на фабрике JLCPCB; саму плату (трассы, антенну, буквы) автор сгенерировал скриптом через Python API редактора KiCad.
- Стандартное приложение NFC Tools отказалось писать на чип («NFC-метка не поддерживается»): чип поставляется без формата NDEF. Резервный Android-телефон вообще не имел модуля NFC, хотя официально модель его поддерживает.
- Автор написал собственное приложение для iPhone (около 60 строк) на низкоуровневом API Core NFC (команда sendMiFareCommand), которое пишет ссылку на чип кусками по 4 байта в обход стандартной проверки, после этого запись заработала на всех десяти платах.
Почему это важно
История показывает малоизвестную сторону NFC: то же радиополе, которым телефон обычно просто «опрашивает» метку, можно использовать как источник питания для собственной электроники карты, светодиода, датчика, на долю секунды даже микроконтроллера, и всё это без единой батарейки. Одновременно это пример того, как далеко шагнула доступность мелкосерийного «железа»: спроектировать плату можно кодом (KiCad с Python API), а фабрика вроде JLCPCB изготовит и распаяет десяток экземпляров менее чем за сто долларов. И это же, учебный пример того, что «последняя миля» аппаратного проекта почти всегда софтверная: электроника и антенна заработали с первого раза, а чуть не сорвала весь замысел проверка совместимости в стороннем мобильном приложении.
Кому это важно
В первую очередь, мастерам и любителям электроники, которые проектируют платы для себя и присматриваются к собственной плате-визитке или похожему гаджету. Дальше, инженерам встраиваемых систем и IoT, которым интересен сбор энергии из поля NFC-ридера как способ питать светодиод или датчик без батарейки. Отдельно, разработчикам под iOS, которым когда-нибудь понадобится обойти стандартный NDEF-интерфейс и обратиться к чипу напрямую через низкоуровневый Core NFC. И, шире, всем, кому любопытно, как физически устроены бесконтактная оплата и проездной, по сути та же самая технология.
Как это применить
Если чип для проекта выбран не как рядовая NFC-наклейка, а как чип-посредник (в духе NTAG I²C Plus, с дополнительными выводами вроде отдачи энергии), стоит сразу закладывать, что стандартные приложения для записи (вроде NFC Tools) такой чип отклонят как неподдерживаемый, а не отформатируют, потому что он поставляется без NDEF. Обходной путь, писать напрямую на низком уровне: на iOS это делает фреймворк Core NFC (команда sendMiFareCommand), и рабочее приложение под конкретную задачу умещается в те же примерно шестьдесят строк, что и в этом проекте. Саму плату разумно проектировать не мышью, а скриптом, Python API редактора KiCad это позволяет и сильно упрощает повторные правки (изменить число витков антенны, пересчитать резонанс, пересобрать). А если на чип добавляется собственная нагрузка вроде светодиода, стоит учитывать: она делит с чипом один и тот же скромный бюджет наведённой энергии, и радиус уверенного считывания может заметно сократиться.
Можно ли доверять
Источник, личный блог автора проекта, без независимой проверки: это рассказ от первого лица, а не редакционный материал. Но техническая сторона выглядит последовательно и подкреплена ссылками на источники: частота 13,56 МГц, на Википедию, показатель отдачи энергии чипа, на собственную документацию NXP, история со светящейся картой U.S. Bank, на пресс-релиз, низкоуровневая запись, на официальную документацию Apple по Core NFC. Там, где измерений не было, автор сам обозначает свою версию как предположение, а не как установленный факт: причина тесной связи карты с телефоном названа личной догадкой, а не результатом проверки, и в тексте это не выдаётся за большее, чем есть.
Риски и подводные камни
Стандартное приложение для записи NFC может попросту отказать в работе с легитимным, но неотформатированным чипом-посредником вместо того, чтобы его настроить, и тот, кто повторяет проект без этой оговорки, упрётся в ту же стену. Запись напрямую, в обход стандартных проверок формата, перекладывает ответственность за корректность записи на самого разработчика, типовых защитных проверок, которые в обычном приложении отсекают ошибку заранее, здесь не будет. Официальная поддержка NFC в характеристиках модели телефона ничего не гарантирует, у автора конкретный экземпляр (версия определённого оператора связи) физически не имел радиомодуля NFC, хотя модель в целом его поддерживает. Показатель отдачи энергии чипа в документации, «типичный», а не гарантированный минимум, так что на практике дальность и надёжность считывания могут отличаться от платы к плате и от телефона к телефону. Добавление собственной нагрузки (светодиода) на тот же скромный бюджет наведённой энергии сузило рабочий радиус настолько, что карту приходится прижимать точно к краю телефона, компромисс, который автор пока не решил, как настраивать в следующей версии платы. И это малая партия из десяти штук, собранная для себя, а не проверенный в серийном производстве продукт: заявленные надёжность и цена не обязательно сохранятся при большем масштабе.
«NFC-метка не поддерживается.»
— сообщение об ошибке приложения NFC Tools при попытке записать чип на iPhone