Getest: RFID Module voor Arduino

20160703_135208_HDRIn de categorie “had ik eigenlijk al langs eens mee moeten experimenteren” valt zeker het product dat ik dit weekend eens flink aan de tand gevoeld heb: een RFID Module voor Arduino en vergelijkbare apparaten. Immers, RFID (radio frequency identification) en zusje NFC (near field communication) kom je op steeds meer plekken tegen. Van mijn bankpas, OV-kaart, de personeelspas op het werk, de etiketten aan de kleren die ik bij sommige zaken koop, tot mijn telefoon (LG G4), om maar eens een paar voorbeelden te noemen.

20160702_141424_HDR-1Het setje dat ik ter beschikking gekregen heb, bestaat uit een RFID-RC522 reader, een kaart in credit card formaat en een tag in sleutelhangerformaat. De eerste stap die je moet uitvoeren (tenminste, dat is aan te raden) is het solderen van een van de twee bijgeleverde headers, de rechte of die met een hoek. Ik koos voor de header met de hoek van 45 graden, als je de reader vast wilt kunnen prikken in een breadboard zul je de andere kiezen.

Daarna heb je in totaal 7 kabels nodig om het geheel aan te sluiten op de Arduino.

Uno_RFID-RC522
Aansluitschema RFID-RC522

Daarbij moet je even opletten omdat het wellicht lijkt alsof de kabels in dezelfde volgorde van “rechts naar links” gaan, maar dat is niet zo. Als je van onder naar boven (met het zilverkleurige kristal aan de bovenkant) telt, dan is de onderste aansluiting voor 3,3 V (niet voor 5V). De GND (ground) zit niet er direct naast, maar eentje verder (je ziet GND staan op het bordje), die moet je aansluiten op een van de GND aansluitingen op de Arduino (er zijn er meer).

Dan krijg je de overige 5 aansluitingen:

  • De RST zit tussen 3.3V en GND op de RC522 (de gele kabel in het plaatje), die sluit je aan op ~9.
  • De aansluiting boven de GND sluit je niet aan, die erboven (turquoise in de afbeelding) gaat naar ~11
  • Die daarboven (groen) gaat naar ~11
  •  Die daarboven (oranje) gaat naar ~13
  • De bovenste (blauw) gaat naar ~10

Niet helemaal helder? Klik dan even op de afbeelding om goed het plaatje te bekijken.

DumpInfo
Output van DumpInfo script

De volgende stap daarna is uiteraard het vinden en installeren van de juiste library voor de RFID-RC522. De meest gebruikte is die van Michuel Balboa, dus die heb ik ook gebruikt. Na het installeren van de library heb je ook nu weer de beschikking over voorbeelden. Het voorbeeld dat je het meest inzicht geeft over de inhoud van een tag is DumpInfo. Daarmee krijg je namelijk niet alleen het UID (unieke ID van de tag), het type van de tag (PICC type: MIFARE 1KB in dit geval) maar ook de inhoud van de kaart / tag  te zien.

De twee tags die bijgeleverd worden zijn standaard leeg, daar is dus niet heel veel aan te zien. Wil je meer weten over wat je nou eigenlijk te zien krijgt in zo’n dump, dan is het handig om wat meer te weten over de MIFARE 1KB RFID kaart. De kaart maakt gebruik van 16 sectoren (in de dump genummerd 0 – 15) of 64 blokken (genummerd 0-63). Elk blok heeft ruimte voor 16 bytes aan data (te zien als kolommen genummerd 0 – 15 in de dump). De informatie die je ziet wordt in hexadecimaal formaat opgeslagen, dus daarom zul je in het algemeen in die dump alleen maar “zooi” zien, d.w.z. geen informatie waar je echt chocola van kunt maken zonder dat je de software de conversie naar leesbare tekst laat uitvoeren.

Wat je mogelijk ook zal opvallen in de dump of de screenshot hiernaast is dat er regelmatig de combinatie FF FF FF FF FF FF ziet staan. Goed gezien! Die combinatie is de standaardsleutel die gebruikt wordt bij het krijgen van toegang tot de data. Als je bv deze sketch als uitgangspunt neemt dan heb je daarmee eigenlijk alles wat je voor een eenvoudige situatie nodig hebt: je zou het unieke ID van een tag kunnen gebruiken om de Arduino bepaalde acties op te laten starten, je zou dan zoiets kunnen bouwen als de Nabaztag/tag van bijna 10 jaar geleden. Wil je specifieke info op de tag opslaan of met de Arduino vanaf de tag lezen, dan kan dat ook.

Maar ik wilde meer. Want ik had immers een LG G4 met NFC. En toen werd het wat ingewikkelder…

Screenshot_2016-07-03-07-56-13
Tag geschreven op “standaard” manier.
Screenshot_2016-07-02-21-25-29
Tag beschreven met URL + VCARD 

Er zijn een groot aantal (gratis) apps voor Android voor wat betreft het lezen en schrijven van informatie op RFID tags. Ik zou zeggen: probeer ze gerust allemaal uit, maar je kunt je ook heel wat tijd besparen. Installeer dan in ieder geval:

De eerste tool, NFC TagInfo van NXP is handig als je wilt zien welk soort tag je hebt en welke informatie op de tag staat. Een aantal van de schermen lijken op de info die het DumpInfo script geeft met als belangrijkste extra dat niet alleen de hexadecimale informatie getoond wordt, maar ook de leesbare tekst.

Met NFC TagWriter en NFC Tools (Pro of gewoon) kun je ook informatie schrijven naar de tags. Mooi hierbij is dat je keuze hebt uit een groot aantal verschillende soorten informatie die je beschikbaar hebt op je telefoon, zoals je contactinformatie die in VCARD informatie op de tag kan worden geschreven, of een URL, een verwijzing naar een online bestand of locatie, een telefoonnummer, of taken die je wilt dat je telefoon uitvoert als de tag er tegen gehouden wordt.

Screenshot_2016-07-03-07-58-49
Tag beschreven met URL + VCARD 
Screenshot_2016-07-03-13-33-50
Schrijven van acties vanuit NFC Tools Pro

Die informatie kon ik ook zonder problemen naar de tag schrijven. Maar het probleem dat dan optrad was dat het script dat ik gebruikte om de informatie te dumpen op de Arduino het opeens niet meer deed. Ik kreeg alleen maar authenticatiefouten in plaats van dat ik de data te zien kreeg. De enige manier om het probleem op te lossen was door er de kopie van een wel nog werkende kaart overheen te schrijven.

Het heeft nogal wat tijd gekost voordat ik enig idee had van wat er aan de hand was. Wat blijkt: de tag is niet corrupt, het heeft ook niet alleen te maken met oud versus nieuw (nieuwe Android-telefoon versus relatief oud type RFID-tag), het heeft er mee te maken dat de libraries voor de RFID-RC522 reader niet de geschikte ondersteuning aan boord hebben voor iets dat heet “NDEF Messages”. NDEF staat daarbij voor NFC Data Exchange Format. De tags hebben er wél ondersteuning voor en laten zonder problemen informatie op die manier schrijven, de apps op de Android telefoon hebben er ook allemaal ondersteuning voor en lezen de informatie probleemloos terug, maar de library voor de RFID-RC522 reader kan er niets mee.

Eerste, meest vervelende, verklaring zou kunnen zijn dat de RFID-RC522 reader geen ondersteuning heeft voor NDEF Messages. Er zijn andere libraries die wél expliciet ondersteuning hebben voor de NDEF Messages. Maar die zijn haast zonder uitzondering gericht op de PN532. Zie bijvoorbeeld deze library behorende bij de Adafruit uitvoering van de PN532. Die is met z’n 40 USD ook wel even een stuk duurder. Ook deze library gaat uit van de PN532. In beide gevallen zit er een check in de library voor die specifieke chip. Geen idee of ik die library aan kan passen voor de RC522, maar eigenlijk heb ik daar sowieso simpelweg geen tijd voor.

Na lang zoeken kwam ik uiteindelijk déze library tegen. En warempel, die is gebaseerd op de RC522 én heeft ondersteuning voor NDEF Messages. Nou ja, een beetje. Er zaten wat foutjes in de library, zo heb ik in RC522_RFID_Utilities.cpp alle regels met Serial.println(mfrc522->GetStatusCodeName(readStatus)); er in moeten verwijderen/in opmerkingen moeten veranderen om de code te laten compileren. Daarmee lukte het om de data op de tag, nadat deze via NDEF Messages door mijn telefoon geschreven was, te dumpen naar het scherm:

COM12_key
Tag beschreven met URL + VCARD

Dat is op zichzelf al goed nieuws omdat het betekent dat de hardware wél gewoon in staat is om de de NDEF Messages te lezen, het probleem zit hem in de library. Overigens, ook met de aanvullende library wordt de info als Hexadecimale code gedumpt (zie de afbeelding hiernaast) , dus niet zoals bij NFC TagInfo van NXP in de vorm van herkende records of zelfs maar leesbare informatie (zie de afbeeldingen hierboven). Het schrijven van nieuwe informatie naar een tag in de vorm van NDEF Messages lukte me niet met deze library.

De library voor de PN532 heeft wel code voor het schrijven en lezen van zulke code. En er zijn inmiddels goedkopere versies van readers op basis van de PN532 beschikbaar. Voldoende reden voor mij dus om ook nog verder te testen met die hardware en library. De hardware daarvoor komt er aan.

Conclusie

De RFID-RC522 is een goedkope RFID-lezer en schrijver die je op een Arduino, EPS8266 of Raspberry Pi kunt aansluiten om tags te lezen. Lang niet alle kaarten die je nu gebruikt kun je zomaar lezen. Het is dus niet zo dat je hiermee zomaar de info op je bankpas of OV-chipkaart kunt lezen. Maar je kunt zelf wel data op de tags zetten en die later weer lezen en dan op basis daarvan de Arduino acties laten uitvoeren.

Wil je de tags ook gebruiken in combinatie met je smartphone, dan wordt het wat ingewikkelder omdat de apps op Android bijna allemaal gebruik maken van NDEF Messages en de meest gebruikte library voor de RFID-RC522 kan die informatie dan niet lezen (of schrijven).  De PN532 is daar mogelijk een betere oplossing voor, maar die moet ik nog testen.

Disclosure
logo-prototype-shopDit bericht is onderdeel van een serie berichten die ik maak op basis van componenten / producten die gratis aan mij beschikbaar gesteld worden door de prototype-shop.nl.
Ik heb zelf de keuze gehad welke producten ik test. Voor mij staat hierbij hetzelfde uitgangspunt centraal als wanneer ik ze wél zelf koop: ik moet het interessant vinden om ermee aan de slag te gaan, het moet niet iets zijn dat al door iedereen anders ook al getest is, ik moet er wel nog iets aan toe kunnen voegen.
Behalve de afspraak dat ik bij deze berichten een link opneem naar de prototype-shop.nl, zijn er geen andere afspraken gemaakt, de inhoud van deze berichten komt volledig voor mijn rekening.
Het volgende bericht in deze serie kun je volgende week maandag verwachten.