Het visitekaartje dat oplicht wanneer je het scant
Ik wilde een visitekaartje dat niet simpelweg een stukje papier was. Niet vanuit een diepe filosofie, maar ik dacht dat het leuk zou zijn om iemand een printplaat te overhandigen. Dus heb ik er een ontworpen: ter grootte van een creditcard, glanzend zwart, met goudkleurige kunst en mijn naam erop. Tot zover is het standaard. De twee zaken die het méér maken dan een kaartje zijn echter onzichtbaar totdat je er een telefoon bij houdt.
Het eerste is een NFC-chip. Tik het kaartje tegen een telefoon en er wordt verwezen naar kevintang.xyz — dezelfde technologie als bij een contactloze betaalpas of een ov-kaart, werkend op 13,56 MHz [1]. Er loopt een koperen spiraal die zeven keer rond de rand van de plaat is gewonden; dat is de antenne. Het grootste deel van het werk bestond uit zorgen dat deze op de juiste frequentie resoneerde. Dat deel was verwacht.
Het tweede onderdeel is waar ik niet over op kan houden. Er staat een kleine Charizard op het kaartje gedrukt, met een rode led precies op het puntje van zijn staart. Wanneer je het kaartje tegen een telefoon tikt, vat de staart vlam. Er zit geen batterij op het kaartje; geen knoopcel, geen draad, niets om op te laden. De led draait volledig op de energie die de telefoon uitzendt.
Een object dat energie leent
Dit is wat er feitelijk gebeurt, en het duurde een tijd voordat ik stopte het magisch te vinden (eigenlijk is dat nog steeds). Een NFC-telefoon luistert niet alleen naar een tag, maar zendt een sterk radioveld uit om de tag van stroom te voorzien, omdat de tag zelf geen batterij heeft. De chip in een normale NFC-sticker wordt wakker van die geleende energie, net lang genoeg om te antwoorden, en wordt direct weer donker zodra de telefoon weg is.
Wat ik pas besefte toen ik er zelf een bouwde, is dat sommige chips de resterende stroom via een pin beschikbaar stellen, zodat je ermee kunt doen wat je wilt. De datasheet van NXP vermeldt een typische 'harvested output' van ongeveer 5 milliampère bij 2 volt in een bepaalde testopstelling [2]. Dat is niet veel, maar genoeg om een led te laten branden, een sensor met een laag stroomverbruik te laten knipperen of een kleine microcontroller voor een fractie van een seconde te activeren.
De manier waarop de tag antwoordt is vreemder dan het klinkt: de tag zendt zelf nooit een signaal uit. In plaats daarvan reageert hij door per moment te variëren in hoeveel van het veld van de telefoon hij absorbeert. De telefoon voelt die kleine trekjes aan zijn eigen signaal en leest deze als enen en nullen. De analogie die ik vaak gebruik is die van een spiegel. Een spiegel produceert geen licht, maar reflecteert een bron. Een passieve NFC-tag produceert geen eigen radiosignaal, maar reflecteert dat van de telefoon en flikkert dit om in een bericht. De telefoon levert alle energie; het kaartje bepaalt alleen wat er wordt teruggestuurd.
(Dit is overigens het onderscheid tussen NFC en RFID waar ik vroeger vaak over struikelde: NFC is geen concurrent van RFID, maar een specifieke vorm voor korte afstanden op 13,56 MHz — bewust met een kort bereik, zodat het kaartje alleen communiceert met het apparaat dat je er bewust tegenaan houdt.)
Ik had NFC altijd gezien als een manier om de telefoon iets te laten doen: een link openen, koffie betalen, inchecken. Maar dit draait het om. De tik zorgt ervoor dat het kaartje iets doet. Voor de halve seconde dat je telefoon in de buurt is, is het kaartje een actief apparaat — een inert rechthoekje glasvezel dat in je hand tot leven komt omdat je er een batterij bij hebt gebracht. Wanneer je dat eenmaal hebt ervaren, kijk je anders naar NFC-taps. Je leest niet de tag; je voedt de tag.
Het is geen gloednieuw idee — U.S. Bank bracht een paar jaar geleden een creditcard uit waarvan het logo oplicht tijdens een contactloze betaling, en die was zo populair dat ze door de voorraad heen raakten [3] — maar het is zeldzaam en voelt elke keer als een klein wonder. Het wijst naar een hele categorie objecten: dingen die geen batterij nodig hebben, omdat ze alleen 'levend' hoeven te zijn op het moment dat je ze aanraakt met een telefoon die je toch al vastheeft.
Het kaartje is een programma
Ik heb de hele printplaat als code ontworpen, wat ik aanbeveel aan iedereen die, net als ik, het frustrerend vindt om sporen met een muis te verslepen. KiCad, de gratis PCB-tool, heeft een Python API, waardoor het hele kaartje door een script wordt gegenereerd. Elke verbinding, de antennespoel, de positie van elke letter: alles is berekend. Wil je dat de spoel een extra winding heeft? Pas een getal aan, draai het script opnieuw, en klaar. De printplaat is reproduceerbaar zoals een computerprogramma dat is, wat voor een hardware-beginner enorm geruststellend is; er is geen kostbaar, handgetekend artefact waar ik bang ben om aan te komen.
Ik kon het niet laten om een paar grapjes toe te voegen voor wie het kaartje zou omdraaien. De achterkant is vormgegeven als een component-datasheet — het dichte referentiedocument dat bij elk hardwareonderdeel wordt geleverd — inclusief de werkelijke resonantieberekeningen voor de antenne, gedrukt in de zeefdruk. Ook zijn er twee echte, blootgestelde testpunten aanwezig waarmee een nieuwsgierige engineer met een meter mijn berekeningen kan controleren.
Op de voorkant, waar een chipkaart normaal gesproken een klein gouden vierkantje contactpunten heeft, staat bij mij alleen een tekening van zo'n vierkantje — diezelfde footprint van acht pads is in de plaat geprint, maar er zit niets onder. De echte NFC-chip is verborgen op de achterkant; wat eruitziet als de chip is een afleidingsmanoeuvre. Iedereen die wel eens een printplaat heeft ontworpen, ziet dit direct; iedereen die dat niet heeft gedaan, ziet gewoon een chipkaart. Het is er voor wie goed kijkt.
Daarna heb ik het naar een fabriek gestuurd. Dit is het werkelijk verbazingwekkende deel van moderne hardware: ik uploadde mijn bestanden naar JLCPCB en voor ongeveer vijfenzeventig dollar produceerden zij tien exemplaren en soldeerden ze de chip en de led op elk kaartje [4]. Tien geassembleerde printplaten, per post, voor de prijs van een luxe diner. Een paar dagen later arriveerde een klein blauw doosje met tien prachtige kaartjes.
Problemen met het beschrijven
Ik tikte het eerste kaartje tegen mijn telefoon. De led knipperde — dus er was stroom, de antenne werkte en het elektrische gedeelte was in orde — maar er gebeurde niets. Geen link. Het kaartje had stroom, maar geen bericht.
Dat is te verwachten: een lege chip moet je voorzien van een URL. Dus ik opende NFC Tools, de standaardapp die iedereen hiervoor gebruikt, hield het kaartje tegen mijn iPhone en kreeg de melding: "NFC tag not supported."
Ik had een beginnersfout gemaakt bij de keuze van de chip. De chip die ik had gekozen, de NTAG I²C Plus [2], is niet echt een eenvoudige sticker-tag. Het is een 'bridge chip' — ontworpen om in een apparaat te zitten en via een draad met een microcontroller te communiceren, waarbij de NFC-functie een extraatje is. Het is precies deze chip die me de pin voor energievangst geeft voor de led, en dat is waarom ik hem koos. Maar hij wordt blanco geleverd, zonder de NDEF-formattering die een consumenten-app vertelt waar een URL-record thuishoort. NFC Tools gebruikt de high-level NDEF-route van iOS, die mijn blanco chip als 'niet ondersteund' beschouwde in plaats van hem te formatteren.
Ik dacht: prima, ik probeer het met een Android-toestel; die NFC-stack is vaak toleranter. Ik viste mijn reserve-telefoon op, wilde de app installeren en ontdekte dat mijn goedkope prepaid Android-toestel helemaal geen NFC-radio had. Het model ondersteunt officieel NFC, maar de versie van mijn provider had de chip weggelaten om een dollar te besparen. De telefoon kan simpelweg geen NFC. Er is geen app voor ontbrekende hardware.
De gewone iPhone-app weigerde, en mijn Android kon het niet. Tien prachtige kaartjes, maar geen manier om er één woord op te zetten.
Een eigen sleutel schrijven
Ik kwam eruit toen ik besefte dat de consumenten-apps niet faalden omdat de chip niet beschreven kon worden, maar omdat ze stopten bij de high-level NDEF-check. Daaronder reageert deze chip op dezelfde basisgeheugencommando's als veelvoorkomende NFC-tags. Hij is compatibel waar het erop aankomt. De apps waren als uitsmijters die identiteitsbewijzen controleerden bij de deur; de chip binnenin zou mijn bestelling echter gewoon hebben aangenomen.
En iOS staat het blijkbaar toe om ruwe commando's naar een tag te sturen — mits je bereid bent zelf de app te schrijven. Apple's Core NFC-framework heeft een low-level modus waarin je direct met de tag communiceert in plaats van iOS te vragen dit voor je te interpreteren [5]. Dus ik schreef een zeer kleine iPhone-app — ongeveer zestig relevante regels code — die precies één ding doet: een NFC-sessie openen en de schrijfcommando's handmatig versturen. Eerst de kleine header die verklaart "ik ben een URL-tag", daarna mijn webadres, vier bytes per keer weggeschreven in het geheugen van de chip, waarbij elk commando werd bevestigd voordat het volgende volgde.
Ik installeerde de app op mijn telefoon, tikte tegen een kaartje en zag hoe hij de pagina's telde: schrijven, schrijven, klaar. Daarna vergrendelde ik de telefoon, tikte opnieuw tegen het kaartje zoals een vreemde zou doen, en er verscheen een banner met de optie om mijn website te openen. Het werkte. Het heeft sindsdien op elk kaartje gewerkt.
Er is één eigenaardigheid: ik moet het kaartje precies tegen de bovenrand van de telefoon houden, anders mislukt het schrijven. De koppeling is krap, en ik ben er vrij zeker van dat de oorzaak die brandende led is — deze verbruikt een deel van de stroom die de chip nodig heeft om zijn werk te doen, waardoor er minder marge is dan bij een gewone tag. Een leuk probleem om te hebben. Het staat op de lijst voor de volgende revisie: iets minder gloed, iets meer bereik, en beslissen hoe ik tegen die afruil aankijk.
De essentie
Wat dit me opnieuw heeft geleerd, is dat het moeilijkste deel van een hardwareproject vaak de software aan het einde is: de laatste centimeter tussen "het object bestaat fysiek" en "het object doet wat het moet doen". De elektronica waren schoolvoorbeeld. De antenneberekeningen werkten in één keer. Wat me bijna versloeg, was een compatibiliteitsvinkje in een app die mijn chip nog nooit had gezien.
Maar dat is niet waar ik aan denk als ik het kaartje vasthoud. Ik denk aan de gloed. Het is een plat stuk glasvezel zonder stroombron, dat tot leven komt omdat je er met een telefoon naar zwaait. Ik begon met het doel een visitekaartje te maken dat een website opent, wat een leuk feesttrucje is. Ik eindigde echter met een grotere interesse in die paar milliwatts aan geleend licht — want datzelfde trucje, een object dat ontwaakt op stroom die het niet zelf bezit, is het zaadje voor honderd andere dingen die ik nu wil bouwen.
Hoe dan ook. Als we elkaar ontmoeten en ik geef je een zwart kaartje: tik ertegen. En kijk naar de staart.
***
Bronverwijzingen
[1] Near-field communication — Wikipedia (NFC werkt op 13,56 MHz) [2] NT3H2111/NT3H2211 NTAG I²C plus datasheet — NXP Semiconductors (energie-harvesting output, typisch ~5 mA) [3] U.S. Bank Shopper Cash Rewards Visa launch — Business Wire (LED-kaart die oplicht tijdens contactloze betalingen) [4] JLCPCB — PCB fabricage en assemblage service [5] sendMiFareCommand — Apple Developer documentatie (het versturen van native commando's naar een NFC-tag)
Groetjes,