KKM: PN532 NFC + RFID

KKM: PN532 NFC + RFID-Uncategorized

Početnik si s Dasduinom. Ili s elektronikom? Za oko ti je zapeo određeni modul, ali ne znaš kako ga koristiti? Bez brige, tu je KKM! Kako Koristiti Module (KKM) je serija blog tutorijala tvrtke soldered na kojoj ćeš pronaći sve što ti treba kako bi započeo rad sa svojim omiljenim modulom. Tutorijali obuhvaćaju: tehničke karakteristike, princip rada, upute kako povezati modul s Dasduinom te osnovni kod. Sve ostalo prepuštamo tebi na maštu.

UVOD

U ovom tutorijalu upoznat ćemo se sa PN532 modulom koji nam omogućuje NFC i RFID komunikaciju.
RFID komunikaciju smo već spominjali prije u tutorijalu za RDM6300 modul, te znamo da s njom možemo čitati kodove s kartica, a u nastavku ćemo vidjeti što je drukčije kod NFC komunikacije te kako koristiti modul.

KAKO RADI?

RFID je vrsta jednosmjerne komunikacije koja nam omogućuje da s kartice ili taga pročitamo kod koji je spremljen u čipu koji se nalazi na kartici (tagu). NFC se ne razlikuje puno od RFID komunikacije, no jedna od bitnijih razlika je što s ovom vrstom komunikacije možemo osim čitanja UID koda kartice i pisati/čitati poruke na karticu(tag).
Ovaj modul radi kao i svaki RFID ili NFC modul. Na pločici ima ugrađenu antenu koja je označena s bijelom linijom oko ruba pločice, te prilikom korištenja moramo paziti da sve linije za komunikaciju ili napajanje idu okomito na antenu kako ne bi imali smetnje. Kartice i tagovi također imaju antene i čipove unutar sebe, a pomoću njih se napajaju i komuniciraju sa RFID/NFC modulom. Kada karticu dovoljno približimo modulu ona se aktivira( preko antene čip u njoj dobije napajanje) te RFID/NFC modul može komunicirati s njom.
PN532 modul daje nam mogućnost čitanja RFID i NFC kartica, kao i pisanje i čitanje poruka na NFC kartice što ćemo vidjeti u primjerima koda.

KAKO POVEZATI?

Modul je vrlo praktičan za povezivanje s mikrokontrolerom jer podržava I2C, HSU ( High Speed UART) i SPI komunikaciju, te možemo birati koja komunikacija nam bolje odgovara za određenu upotrebu. Za izbor komunikacije potrebno je pomaknuti prekidače koji se nalaze na modulu. U primjeru ćemo proći kroz sva tri načina spajanje modula i dati primjer koda za sve tri komunikacije, a zatim ćemo proći pisanje i čitanje poruka na NFC karticu. Za SPI komunikaciju koristimo 8 pinski header( spaja se 6 pinova) , te spajamo potrebne pinove s mikrokontrolerom kako je prikazano u primjeru. Za I2C i HSU komunikaciju se koristi 4 pinski header na kojemu imamo GND, VCC, TXD(SDA) i RXD(SCL) pinove, te kako možemo primijetiti za HSU i I2C se koriste isti pinovi( oznake za HSU su sa stražnje strane, a za I2C s prednje strane modula).
Za početak ćemo proći HSU i SPI komunikaciju s jednostavnim primjerom koda za očitavanje UID koda s RFID kartica, a nakon toga testiramo NFC komunikaciju, te ćemo za tu primjenu modul sa Dasduinom povezati preko I2C komunikacije.

ARDUINO KOD

Za korištenje modula trebamo preuzeti biblioteku s linka. Kada preuzmemo zip datoteku potrebno ju je raspakirati i dodati sve mape (ima ih 6) u Arduino library mapu. Ako ne znate gdje se nalazi Arduino library mapa pogledajte tutorijal kako instalirati novu biblioteku.

RFID

HSU (HIGH SPEED UART)

Modul dolazi podešen za HSU komunikaciju ( obje sklopke trebaju biti u položaju 0), pa ćemo prvi primjer napraviti s tom vrstom komunikacije između modula i Dasduina. Modul spojimo prema shemi, te na Dasduino prebacimo dani kod i trebali bi moći pročitati UID kod s kartice ili taga ovisno što koristimo.

//uključujemo biblioteku SoftwareSerial koja softverski implementira serijsku komunikaciju na određenim pinovima
#include <SoftwareSerial.h>
 
//uključujemo biblioteku za softverski HSU(High-speed UART) i biblioteku za PN532 modul
#include <PN532_SWHSU.h>
#include <PN532.h>
 
SoftwareSerial SWSerial( 10, 11 );//(RX,TX) Konstruktor za našu biblioteku SoftwareSerial u kojem definiramo pinove na koje spajamo modul
//Konstruktori za biblioteke koje služe za komunikaciju s modulom
PN532_SWHSU pn532swhsu( SWSerial );//Konstruktor za High speed UART
PN532 nfc( pn532swhsu ); // konstruktor za PM532 biblioteku
 
void setup(void) {
 Serial.begin(115200);////Inicijalizacija serijske komunikacije( brzina 115200 bauda)
 Serial.println("Hello!");//ispisujemo pozdravnu poruku na Serial monitor
 nfc.begin();//Inicijalizacija komunikacije s modulom
 uint32_t versiondata = nfc.getFirmwareVersion(); //tražimo od modula verziju Firmwarea i spremamo u varijablu versiondata
 //ako nismo dobili verziju firmwarea od modula ispisujemo na Serial monitor da nije pronađen modul i ostajemo u beskonačnoj while petlji
 if (! versiondata) {
 Serial.print("Modul PN532 nije pronadjen..Provjerite kako je spojen");
 while (1);
 }
 //ako je komunikacija s modulom uspostavljena ispisujemo verziju firmwarea
 Serial.print("Pronadjen modul PN5"); Serial.println((versiondata>>24) & 0xFF, HEX);
 Serial.print("Firmware ver. "); Serial.print((versiondata>>16) & 0xFF, DEC);
 Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
 //konfiguriramo modul
 nfc.SAMConfig();
 //Ispisujemo poruku da treba prisloniti karticu
 Serial.println("Prislonite karticu ili tag ...");
}
 
void loop(void) {
 boolean success;
 uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 }; // buffer u koji spremamo kod s kartice
 uint8_t uidLength; // zapisujemo duljinu UID koda (4 ili 7 byta)
// tražimo od modula da pročita karticu( u varijablu success sprema dali ima ili nema kartice, a ako ima u varijablu uid sprema kod s kartice
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
 
//ako je modul pročitao karticu ispisujemo kolike je duljine kod na kartici( 4 ili 7 byta) te nakon toga i kod kartice
 if (success) {
 Serial.println("Pronadjena kartica!");
 Serial.print("Duljina UID koda: ");Serial.print(uidLength, DEC);Serial.println(" bytes");
 Serial.print("UID Kod: ");
 // u HEX obliku ispisujemo kod s kartice
 for (uint8_t i=0; i < uidLength; i++)
 {
 Serial.print(" 0x");Serial.print(uid[i], HEX);
 }
 Serial.println("");
 
 delay(1000);// pauza od jedne sekunde do ponovnog očitavanja
 }
// ako kartica nije pronađena ispisujemo poruku da čekamo karticu
 else
 {
 Serial.println("Vrijeme isteklo.. Cekam karticu");
 delay(500);// pauza od pola sekunde da ne ispisuje konstantno poruku ako nema kartice
 }
}