NFC Energy-Harvesting PCB Visitekaartje met een MCU

De meeste visitekaartjes hebben geen batterij. Mijn kaartje is daarop gebaseerd, maar wanneer het tegen een telefoon wordt gehouden, beginnen 21 led-lampjes een animatie die volledig wordt gevoed door NFC.

Dit project begon ongeveer drie maanden geleden als een eenvoudige manier om KiCad te leren voordat ik aan complexere ontwerpen zou beginnen. Dat "eenvoudige" bleek al snel niet het geval te zijn. Het uiteindelijke product heeft me meer geleerd over elk aspect van het PCB-proces dan ik had verwacht, en het resultaat is veel beter geworden dan ik had gedacht.

Context en Concept

Ik heb allerlei visitekaartjes op PCB's gezien. De meeste maken gebruik van de zeefdruk (silkscreen) en soms blootgesteld koper voor contactgegevens en een QR-code. Hoewel die erg leuk zijn, gaat dat meer over grafisch ontwerp dan over electrical engineering. Andere kaarten bevatten complexere functies zoals displays, batterijen en inputs; deze zijn indrukwekkend, maar vaak duur en dik.

Ik wilde iets maken dat simpel en goedkoop genoeg was om aan mensen uit te delen. Uiteindelijk stuitte ik op NFC-visitekaartjes. Dit concept was perfect: geen batterij nodig, een basis in RF-engineering en een goedkope BOM (Bill of Materials). Tijdens het onderzoek naar specifieke NFC-chips ontdekte ik dat sommige chips in staat zijn om NFC-energie te oogsten (energy harvesting) voor andere componenten—met name de NXP NTAG I2C Plus en de STMicro ST25DV-KC.

Hoe NFC werkt

Een smartphone zendt continu een klein magnetisch veld uit. Een NFC-kaart pikt dit veld op, waardoor de telefoon in feite als een kleine draadloze oplader fungeert. De kaart verzendt zelf geen bericht terug naar de telefoon; in plaats daarvan varieert de kaart hoeveel energie hij uit het veld absorbeert. De telefoon detecteert deze stroomdalingen en zet deze om in binaire data.

De meeste NFC-tags gebruiken deze geoogste energie alleen voor hun interne circuits, maar sommige NFC-chips kunnen overtollige DC-spanning naar externe hardware routeren. Dit visitekaartje maakt gebruik van die laatste functie.

Ontwerp en Hardware

De theorie leek niet al te ingewikkeld, dus ik maakte snel een schema in KiCad. De ATtiny412 microchip was een logische keuze vanwege de compacte afmetingen, voldoende GPIO's en zeer lage stroomvereisten.

De led-lampjes zijn aangesloten via een techniek genaamd Charlieplexing, waarbij gebruik wordt gemaakt van de unidirectionele stroomvloei die inherent is aan diodes. Het kernpunt hiervan is dat tri-state logica kan worden gebruikt om met een klein aantal GPIO's veel led-lampjes aan te sturen. De formule hiervoor is:

y = x · (x - 1)

waarbij y het aantal onafhankelijk bestuurbare led-lampjes is en x het aantal GPIO's. Het belangrijkste nadeel is dat er slechts één led tegelijk kan branden, maar dit kan worden gemaskeerd door PWM (Pulse Width Modulation) te gebruiken en de duty cycles over meerdere led-lampjes te spreiden. In het eerste ontwerp gebruikte ik 4 GPIO's (GPIOA t/m GPIOD) om 12 led-lampjes aan te sturen.

Systeemarchitectuur

Na verloop van tijd realiseerde ik me dat de ATtiny412 suboptimaal was. De chip heeft slechts 5 GPIO's en is alleen beschikbaar in through-hole/leaded-pin behuizingen, niet in QFN, waardoor hij hoger op de PCB komt te liggen.

Omdat ik deze zomer niet op de universiteit was, had ik geen middelen om PCB's zelf te assembleren en liet ik dit doen door JLCPCB. Daarnaast wilde ik, in het geval dat ik deze kaartjes zou uitdelen, geen lood gebruiken. JLCPCB ondersteunt volledige RoHS-compliance, wat dit een gemakkelijke keuze maakte.

Aangezien ik professionele assemblage gebruikte, kon ik overstappen op een veel kleiner QFN-pakket, iets wat de ATtiny412 niet aanbiedt. Na onderzoek vond ik de ATtiny816. Deze lijkt op de ATtiny412, maar heeft 17 GPIO's en een veel dunner pakket van 3 mm × 3 mm. Hierdoor kon ik zes GPIO's toewijzen aan de led-lampjes, wat resulteert in 20 Charlieplexed led-lampjes en één eenvoudige indicator-led die van een GPIO naar GND loopt. Ook stapte ik over op de NXP NTAG I2C Plus NFC-chip, omdat deze een NFC-standaard ondersteunt met een korter bereik maar een hoger vermogen.

Energiebeheer en Capaciteit

In de datasheet van de NTAG I2C Plus staat dat er niet meer dan 220 nF capaciteit op VOUT mag zitten; een grotere condensator zou ervoor zorgen dat de spanningsrail wegvalt, wat een oscillerende lus creëert waardoor het systeem nooit opstart. Ik wilde echter meer dan 220 nF, dus heb ik het volgende circuit ontworpen:

Een grote 10 µF condensator helpt VCC glad te strijken, maar zou bij het opstarten te veel stroom trekken. R3 beperkt de inschakelstroom tot slechts enkele mA. Zodra de condensator is opgeladen, zou R3 de condensator echter te veel vertragen. De MOSFET (Q1) fungeert hier als schakelaar. Na 120 ms is C3 volledig opgeladen, waarna de MCU de GATE laag trekt, waardoor de condensator een pad met lage impedantie krijgt om spanningsdips op te vangen. R2 is een pull-up weerstand om de GATE gedurende de eerste 120 ms hoog te houden. Dit creëert een circuit met de voordelen van een grote condensator zonder de specificaties van de datasheet te negeren.

Ik heb besloten om 100 $\Omega$ weerstanden op elke Charlieplexed trace te gebruiken. De totale weerstand is effectief verdubbeld omdat de stroom uit één GPIO moet vloeien, door de weerstand, door de LED en vervolgens door een tweede weerstand. Mocht 100 $\Omega$ te veel stroom doorlaten, dan kan ik de led-lampjes met een hoge frequentie PWM-en. Met de 10 µF condensator worden deze pulsen gladgestreken tot een constante stroom, wat voorkomt dat VOUT inklapt. Bij een refresh-rate van 1 kHz en een duty cycle van 20% geeft de berekening aan dat VOUT met ongeveer 0,2 V daalt.

De Antenne maken

Ik heb de afmetingen en eigenschappen van de antenne bepaald met de antenne-inductietool van STM. Ik wilde dat de antenne de volledige ruimte van de kaart in beslag nam, dus heb ik geëxperimenteerd met het aantal windingen, de breedte van de traces en de tussenruimte tot ik een werkende combinatie vond. De inductie moest dicht bij de 2,75 µH liggen om te resoneren op 13,56 MHz met de interne 50 pF condensator van de NTAG.

Omdat deze inductie iets lager is, heb ik de mogelijkheid om hem precies op de juiste frequentie af te stemmen. Als hij exact 2,75 µH was geweest, had ik een parallelle condensator kunnen toevoegen om de resonantiefrequentie te verlagen, maar er was geen manier om deze te verhogen. Ik heb een 1,5 pF condensator geplaatst zodat ik de frequentie indien nodig lager kon afstemmen.

Voor het routeren van de PCB gebruikte ik een KiPython-script (gemaakt met hulp van een LLM), aangezien KiCad geen ingebouwde tool heeft voor rechthoekige spiraalvormige antennes. Dit script genereert een eenvoudige rechthoekige spiraaltrace die overeenkomt met de waarden uit de SMT-calculator. Daarna heb ik de hoeken handmatig afgerond, wat het omsloten oppervlak slechts met enkele procenten veranderde.

Layout en Design

Esthetisch gezien wilde ik alle IC's en passieve componenten in het linker kwart van de PCB houden. Ik heb de traces voor de led-lampjes ongeveer zes keer herontworpen voordat ik bij dit design uitkwam. Hoewel kortere gemiddelde trace-lengtes mogelijk waren, wilde ik een volledige lus vermijden en het lusoppervlak minimaliseren. Bij een volledige lus zouden de traces koppelen met het NFC-veld en destructieve wervelstromen (eddy currents) creëren. Door een opening in het midden van de lus te laten, kunnen er geen stromen worden gevormd, waardoor de antenne niet wordt beïnvloed door macro-schaal RF-interferentie.

Het gebruik van verschillende kleuren voor de nets maakte het makkelijker om te begrijpen welke trace waarheen gaat. De ribbon-topologie creëert nog steeds ingesloten stroom tussen elke trace, maar door de afstand en breedte van de traces minimaal te houden, is dit effect beperkt.

Achterzijde

Op de achterzijde van de kaart zijn alle traces zichtbaar. Daarnaast heb ik een eenvoudig blokschema en een IC BOM toegevoegd. Om de traces naar de B.Silkscreen laag te kopiëren, heb ik F.Cu en B.Cu als .SVG geplot en deze handmatig uitgelijnd op de zeefdruklayer.

Een ervaren electrical engineer zal zich wellicht afvragen waarom ik geen ground plane heb gebruikt. Een ground plane zou namelijk alle flux door de antenne blokkeren, waardoor deze onbruikbaar wordt.

Fabricage en Assemblage

De kaartjes hebben dezelfde afmetingen als een creditcard en ik heb extra betaald om ze net zo dun te maken. Ik heb gekozen voor precisie-zeefdruk en een ENIG-afwerking. Hierdoor zijn de kaarten volledig RoHS-compliant, zonder lood of andere gevaarlijke stoffen.

Ik twijfelde aanvankelijk of ik er slechts een paar moest bestellen om te testen of ik direct voor een grotere oplage moest gaan. Na onderzoek in de offerte-tool van JLCPCB bleek de marginale kosten per extra kaart minimaal, dus heb ik er dertig besteld. Bij ontvangst testte ik eerst of de energie-harvesting werkte door een led-lampje over VCC en GND te plaatsen; dit werkte direct zonder dat tuning nodig was.

Programmeren

Aan de achterzijde bevinden zich drie kleine open pads: GND, VCC en UPDI. Deze volgorde voorkomt schade als de verbinding 180 graden gedraaid wordt. Elke pad is 1,8 mm in diameter met een afstand van 0,1" (2,54 mm) tussen de centra. Deze standaard breadboard-afstand stelt me in staat om een Pogo Pin Clip te gebruiken zonder extra componenten toe te voegen. Omdat visitekaartjes ruw worden behandeld en in statische portefeuilles worden gestopt, heb ik een TVS-diode geplaatst tussen UPDI en GND, zodat eventuele hoge spanningen direct naar de grond vloeien in plaats van de MCU te beschadigen.

De ATtiny816 wordt geprogrammeerd via UPDI (Unified Program and Debug Interface), wat in feite UART is in een single-wire formaat. Na diverse pogingen met een Raspberry Pi Pico en IDE-instellingen die niet werkten, heb ik de Adafruit UPDI Friend aangeschaft, waarmee het direct werkte.

De code is in sommige opzichten vergelijkbaar met een eenvoudige Arduino-sketch, maar ik heb de hoofdloop geschreven in bare-metal C. Dit zorgt ervoor dat de Charlieplexed matrix zo snel mogelijk kan loopen, waardoor flikkeringen tot een minimum worden beperkt. Daarnaast heb ik de ATtiny gedownclockt naar 1 MHz om stroom te besparen.

De NTAG I2C Plus is ironisch genoeg niet via I2C verbonden met de ATtiny. Om deze te programmeren, gebruikte ik aanvankelijk de NFC Tools Android-app, maar ontdekte dat de NXP TagWriter-app veel beter werkte voor het formatteren en schrijven van mijn contactinformatie.

Zowel de QR-code als de NFC-link leiden naar https://connect.wilsonharper.net, wat momenteel doorverwijst naar https://wilsonharper.net. Via Cloudflare kan ik dit configureren naar elke gewenste URL zonder hardwarematige wijzigingen.

Bill of Materials

Zie de volledige BOM-details in de repository.

Geleerde lessen

De dertig kaarten die ik nu heb, zouden een tijd mee moeten gaan. Voor een versie 2.0 overweeg ik om andere kleuren led-lampjes te gebruiken (zoals groen of geel) en misschien een paar dunne knoppen toe te voegen voor interactiviteit, zoals eenvoudige arcade-games.

De uitspraak "Hardware is hard" is zeer waar. Individueel is niets in dit project revolutionair of extreem ingewikkeld: NFC PCB-antennes, led-lampjes met een MCU en PCB-visitekaartjes bestaan al. Echter, voor zover ik kon vinden, heeft niemand ze gecombineerd in één esthetisch pakket (met NFC-harvesting, circuitry in de antenne én Charlieplexing). Er waren momenten waarop ik dacht dat dit boven mijn kunnen lag, maar na alles driemaal te hebben gecontroleerd, besloot ik het toch te doen. Ik ben blij dat ik die stap heb gezet.

***

© Copyright 2026 Wilson Harper.