← 文章 / 芯片硬件
Hacker News 2小时前 · 2026-08-31 10:21:29 · 1 阅读

Show HN:基于NFC能量采集的PCB名片,内置MCU和LED动画

和大多数名片一样,我的名片里也没有电池。但当它贴近手机时,21 颗 LED 就会开始播放动画,动力完全来自 NFC。

这个项目大约三个月前启动,最初只是我在跳进更复杂设计前用来上手 KiCad 的练手之作。"简单"并没有持续太久。这块最终成品让我在 PCB 流程的方方面面学到的东西远超预期,成品效果也比我想象的好太多。完整仓库在这里

Your browser does not support the video tag.

我见过各种各样的 PCB 名片。我见过的大多数只是用丝印层加上可能露出的铜箔来呈现联系方式和二维码。这些确实很酷,但它们更偏向平面设计而非电子工程。另一些名片则加入了更复杂的功能,比如显示屏、电池和输入元件——非常酷,但成本高、体积厚。

我想做的是既简单又便宜、可以大量分发给别人的名片。后来,我偶然发现了NFC 名片这个概念。这个思路堪称完美:不需要电池,涉及一些基础射频工程,BOM 也很便宜。在开始调研具体的 NFC 芯片时,我发现有几款甚至能从 NFC 采集能量供其他元器件使用,其中最典型的就是 NXP NTAG I2C Plus 和 STMicro ST25DV-KC。

先简单解释一下 NFC 的工作原理:手机会持续向外发射一个微弱的磁场。当 NFC 卡片感应到这个磁场时,手机就相当于一个微型无线充电器。卡片其实并不会主动向手机回传数据,而是通过改变从磁场中吸收的能量多少来传递信息,手机检测到这些能量波动后将其转化为二进制数据。大多数 NFC 标签只会用采集到的能量驱动内部电路,但部分 NFC 芯片能把多余的直流电压引出,给外部硬件供电。这张名片就用到了最后这个特性。

原理看上去并不复杂。我很快就在 KiCad 里画好了原理图。ATtiny412 单片机是顺理成章的选择——体积小、GPIO 够用、功耗极低。

LED 的连接采用了一种叫做查理复用(Charlieplexing)的技术,利用了二极管单向导电的特性。维基百科上的文章讲解得很清楚,其核心思想是利用三态逻辑让少量 GPIO 控制大量 LED。具体公式为:$y = x \cdot (x-1)$,其中 $y$ 表示可独立控制的 LED 数量,$x$ 表示 GPIO 数量。主要缺点是同一时刻只能点亮一个 LED,但可以通过 PWM 将各 LED 的占空比分散开来缓解这个问题。在第一版设计中,我使用了 4 个 GPIO(GPIO_AGPIO_D)来控制 12 个 LED。


系统架构

虽然最初我选择了 ATtiny412 MCU,但后来发现它不太理想,原因有几点:它只有 5 个 GPIO,而且只有直插/引脚封装,没有 QFN 版本,导致 PCB 上的高度偏厚。

由于这个暑假我不在学校,没有办法自己焊接 PCB,所以只能让 JLCPCB 代为贴装。另外,如果打算把这些卡片送人,我不想里面有铅,而回到学校后我同样接触不到无铅焊接工作台。JLCPCB 支持完整的 RoHS 合规,所以自然是首选。

既然都找了专业贴片,不如直接选更小的 QFN 封装,而 ATtiny412 没有这个版本。经过一番调研,我找到了 ATtiny816,它与 ATtiny412 类似,但拥有 17 个 GPIO,封装尺寸也小得多,仅为 3 mm × 3 mm。这样我就可以分配 6 个 GPIO 给 LED,实现 20 个查理复用 LED 加一个从 GPIO 接到 GND 的简单指示灯。同时我把 NFC 芯片换成了 NXP NTAG I2C Plus,因为它支持距离更近、功率更高的 NFC 标准。

在阅读 NTAG I2C Plus 数据手册时,我注意到其中规定 VOUT 上的电容不能超过 220 nF,因为更大的电容会导致电压轨下降,形成一个永远无法上电的振荡回路。不过我需要更大的电容,所以我设计了这个电路:

底部那个 10 µF 的大电容用来平滑 VCC,但启动时它的瞬态电流会很大。R3 把启动电流限制在几毫安以内。不过一旦电容充满电,R3 又会让电容放电变得太慢。MOS 管 Q1 在这里充当开关:120 ms 后 C3 充满,此时 MCU 把 GATE 拉低,给电容提供一条低阻抗通路来平滑电压跌落。R2 只是一个上拉电阻,保证前 120 ms 内 GATE 保持高电平。这样既保留了大电容的好处,又不会违反数据手册的限制。

Charlieplexing 的每条走线上我都用了 100 Ω 电阻。因为电流必须从一个 GPIO 流出,经过一个电阻、穿过 LED、再经过另一个电阻,总电阻实际上是单个电阻值的两倍。另外我意识到,如果 100 Ω 电阻仍然允许的电流太大,我可以用高频 PWM 驱动 LED。10 µF 电容会把这些脉冲平滑成稳定的直流电流,避免 VOUT 出现塌陷。按照 1 kHz 刷新频率、20% 占空比计算,VOUT 大约只下降 0.2 V。


制作天线

我用 ST 的天线电感计算工具来确定天线的尺寸和参数。我希望天线占满整个卡片面积,所以不断调整匝数、走线宽度和走线间距,直到找到一组比较合适的参数。我需要电感接近 2.75 µH,这样配合 NTAG 内部 50 pF 的电容,就能在 13.56 MHz 处产生谐振。最终效果如下:

实际电感比目标值略低,这样反而方便我把它调到精确的谐振频率。如果一开始就正好是 2.75 µH,那就只能并联电容往低调,而没办法往高调。我预留了一个 1.5 pF 的电容,需要时也可以用来降低谐振频率。

PCB 走线这一步比我预想的要费劲。KiCad 居然没有内置的天线或线圈生成工具,我试了几款插件也都不支持矩形螺旋。没办法,只能写个 KiPython 脚本来搞定。脚本是借助 LLM 写的,聊了几分钟就跑通了——它会生成一条简单的矩形螺旋走线,参数和我之前用 SMT 计算器算出来的结果吻合。我把 .py 文件放在了 仓库 里,相信对其他人也有参考价值。脚本跑完之后,我手动把拐角做了圆滑处理——这样改完之后,线圈包围的面积只变化了几个百分点。


布局

出于美观考虑,我把所有芯片和被动元件都集中在了 PCB 左边的四分之一区域。LED 那部分的走线我反复拉、删、重画了大概六次,才定下现在的样子。理论上其实可以走得更短、平均线长更优,但我刻意避开了完整闭环——同时也想尽可能缩小环路面积。如果走线形成闭合大环,导线会和 NFC 场耦合,感生出破坏性的涡流。而在顶部中间留一道缺口,环路就不闭合,电流自然无法形成,天线也就不会受到宏观层面射频干扰的影响。

用不同颜色区分网络让走线看起来更直观(也更有趣)。不过这种带状拓扑结构在相邻走线之间仍会形成小的闭合回路——这和前面那个大环效应是两回事。通过尽量减小线宽和线距,能在一定程度上缓解这个问题。


背面设计

背面我决定把所有走线都露出来展示。另外还画了一个简单的框图和 IC 物料清单。要把走线复制到 B.Silkscreen 层,我的做法是把 F.CuB.Cu 导出为 .SVG,再导入到 B.Silkscreen 里,凭眼睛对齐。整体走线在不少地方都不走寻常路,估计经验丰富的硬件工程师一看就会发现很多可以改进的地方。肯定有人在看的时候心想:为什么不用地平面?——答案很简单:地平面会把天线完全屏蔽掉,让它彻底失效。

在尽量降低闭合电流、追求有趣又美观的设计目标下,我觉得最终成品还挺不错。


制作与组装

卡片尺寸与信用卡一致,我多花了一点钱让它们做到同样薄。我还选择了高精度的丝印工艺和 ENIG 表面处理。这样一来,卡片完全符合 RoHS 标准——不含铅及其他有害物质。

下单时我面临一个选择:先少量试做几张看看效果,还是一步到位直接量产?在 JLCPCB 的报价工具里折腾了好几个小时后,我发现每多一张的边际成本非常低,五张和三十张之间的总价差距并不大。于是我咬了咬牙,祈祷一切顺利,直接下了三十张的订单。

卡片到手后,我第一件事就是测试它能否真的采集到能量。我在 VCCGND 之间接了一个 LED,直接就亮了,完全不需要调谐。

不过卡片贴在手机背面的时候,拍张照片实在不容易。


编程

卡片背面有三个外露的小焊盘:GNDVCCUPDI。这个排列顺序类似 RC 舵机,即使连接时旋转了 180 度也不会损坏。每个焊盘直径 1.8mm,中心间距 0.1"/0.254mm。这种标准面包板间距让我可以直接用 Pogo Pin 夹子连接,无需额外元件。考虑到名片经常被随手塞进带静电的钱包和口袋里,我在 UPDIGND 之间加了一个 TVS 二极管,这样任何高压都会直接导入地线,而不会击穿 MCU。

ATtiny816 通过 UPDI(统一编程调试接口)烧录。它本质上就是 UART,只不过用的是单线格式。官方有专用调试器,USB 转串口适配器也能用,还有人用 Arduino 和树莓派 Pico 当编程器——最后这种方案听起来最有意思。大多数支持 jtag2updi 固件的 Arduino 都是 5V 逻辑电平,所以我只能用 Pico。我找了个 UF2 文件,接好线……然后什么都没发生。我花了几个小时调整 IDE 设置、换引脚,最后灵机一动,把输出接上了示波器——依然没反应。我觉得自己真是犯傻,于是下单了 Adafruit UPDI Friend,一上电立刻就成功了。

代码本身跟 Arduino 基础闪烁示例有几分相似。不过我把主循环用裸机 C 重写了,让 Charlieplexing 矩阵尽可能快地轮询,尽量减少闪烁。代码里还藏了个彩蛋,看你能不能发现。我把 ATtiny 降频到 1 MHz 以节省功耗。

讽刺的是,NTAG I2C Plus 并没有通过 I2C 接到 ATtiny 上。最初我用的是知名的 Android 应用 NFC Tools 来编程它。踩了几次坑之后,我发现 NXP TagWriter 在格式化和写入名片数据方面好用得多。

二维码和 NFC 链接都指向 https://connect.wilsonharper.net。目前这个地址只跳转到 https://wilsonharper.net,但我可以在 Cloudflare 里配置它跳转到任意 URL,无需任何硬件改动。


物料清单

完整 BOM 详情可在此查看


经验总结

我现在手头这三十张卡片应该够用一阵子了。不过等用完之后,我打算做一版 V2。VOUT 的电压足够高,能驱动任何颜色的 LED,绿色或黄色应该会很有意思。我还在考虑加一两个轻薄的小按钮来做点交互,这样配合一圈 LED 就能做几个街机风格的小游戏。

"硬件很难做"这句话我听过很多次,这次的项目让我深刻体会到了这句话的分量。这个项目里的每一项单独拿出来都不算新颖,甚至谈不上复杂:NFC PCB 天线、带 MCU 的闪烁 LED、PCB 名片,这些以前都有人做过。但据我所知,还没有人把它们三者结合,做成一个美观的产品——至少我在网上没找到类似的例子(有做 NFC 能量收集的,有在天线里集成电路的,也有做 Charlieplexing 的,但三者全占的没有)。中间有好几次我都觉得这事儿我做不来。把所有可能的问题反复排查了三遍之后,我意识到就是得把板子发出去打样,庆幸的是我最后还是发了。

原始来源: Hacker News

评论 (0)