How to Arduino: Što je RFID i kako radi?

How to Arduino: Što je RFID i kako radi?

Arduino i RFID

Kako pomoću Arduina i RFID-a otvoriti vrata s magnetskom karticom



Ako niste imali priliku vidjeti uživo, sigurno ste često gledali u filmovima kako glumci otvaraju blindirana vrata pomoću magnetske kartice koju vječito ukradu od nekog zaposlenika. Upravo o takvoj tehnologiji govorimo, to je RFID. RFID, ili punim imenom „Radio-frequency identification“, tehnologija je koja pomoću magnetskog polja komunicira između prijemnika i predajnika, naravno, bežičnim putem. U našem slučaju kao mozak operacije koristimo Arduino MFRC522 kao čitač RFID-a i, naravno, kartice i tagove.

 

Sklop spreman za testiranje

Magnetska kartica može biti u obliku kreditne kartice ili privjeska koji se naziva tag. U njima se nalazi antena, kao i čip na kojem su pohranjeni podaci, i svaki put kada se kartica/tag prisloni na čitač kartica, on očitava njezin serijski broj. Programerski gledano, sve funkcionira vrlo jednostavno i svodi se na ispitivanje je li prislonjena kartica na popisu dopuštenih. Ako je, vrata će se otvoriti, inače ništa.

Gdje se primjenjuje RFID? Ne biste vjerovali, no posvuda je oko nas. Dimenzije predajnika mogu biti tako malene da stanu pod kožu životinja. Najčešće se koristi za identifikaciju robe i životinja jer se samim prislanjanjem čitača na predajnik može dobiti informacija. Možda ste primijetili kako nove kreditne kartice imaju opciju beskontaktnog plaćanja, a sada vam je jasno kako to funkcionira.

Morate imati na umu da domet bežične komunikacije čitača i predajnika varira o frekvenciji i može dosegnuti i 1 m! Zato danas postoje neki novčanici koji blokiraju RFID komunikaciju kako greškom ne bi došlo do kontakta ili zlouporabe. Pametne i korisne stvarčice nam često olakšavaju život, ali ne zaboravite da s njima treba biti oprezan!

 

Provjeravanje potrebno je provjeriti jesmo li dobro spojili čitač

1. Korak 
Spajanje čitača s Arduinom

Naš RFID čitač MFRC522 sadrži 8-pinski konektor, od kojih se 7 spaja s Arduinom. Dva priključka služe za spajanje napajanja. Kako je čitač male potrošnje, može se spojiti na napajanje Arduina. Oprez! Čitač traži napajanje od 3.3 V! Priključke je potrebno zalemiti za čitač jer dođu nezalemljeni, a drugačije se ne može ostvariti kontakt. U ovom tutorialu nećemo raditi s električnom bravom, ali ćemo zato sve dobro pripremiti kako bi ostalo vama na izbor na koji način ćete otvarati vrata ili koristiti ovaj sklop. Naša preporuka je elektromagnetska brava.

 

electric door lock

 

To je zapravo uređaj koji sadrži zavojnicu, a kada njome prolazi struja, pretvara se u elektromagnet i uvlači/izvlači metalni klin. Sve brave funkcioniraju na foru metalnog klina. Za to ćete trebati vanjsko napajanje i relej pomoću kojega će se ta brava uključivati. Umjesto elektromagnetske brave možete staviti LED-icu, koja će signalizirati uključivanje brave ili pomicanje poluge pomoću servo motora.

 

arduino rfid shema 

Napomena za Arduino Mega:

Ako koristite Arduino Mega verziju, morate promijeniti pinove na koje se spaja RFID čitač jer je kod Mege u pitanju drugačiji mikrokontroler i pinovi za komunikaciju nisu na istim mjestima. Tako ćete, na primjer, za Uno/Nano pin 10 na Megi morati koristiti 53. Naravno, govorimo o digitalnim pinovima.

microbit narukvica



2. Korak
Izrada programa

Programski kod je uistinu jednostavan, a sve se svodi na ispitivanje je li očitana kartica na popisu dopuštenih, ako je, poslat će se impuls na tranzistorsku sklopku kako bi relej uključio elektromagnetsku bravu. Ako kartica nije na popisu dopuštenih, ispituje se opet. Postupke možete ispisivati na Arduinov serial monitor ili LCD zaslon ako želite korisniku dati na znanje koja se operacija izvodi.

 

Spajanje Koristili smo eksperimentalnu pločicu iako nije potrebna za ovaj projekt

Odbijanje ili prihvaćanje kartica možete signalizirati i pomoću LED-ica, npr. zelena će zasvijetliti ako je kartica na popisu dopuštenih, a crvena ako nije. Za čitač ćemo ubaciti biblioteku u kojoj se nalaze funkcije koje ćemo koristiti u kodu, poput čitanja podataka s kartice. Biblioteku možete preuzeti s naše Vidilab Github stranice.

U tipu podataka byte definirat ćemo dvodimenzionalno polje imena kartice:

byte kartice[][4]= {{0xC6,0xFD,0xC5,0x32},{0x80,0x74,0xB8,0x73}};

Zašto dvodimenzionalno polje? Ono je potrebno samo ako ćete koristiti više od jedne kartice. Prva dimenzija [] definira broj kartica i po sintaksi se ne mora pisati ako je serijski broj unutar kartice pun jer kompajler automatski prepozna broj, koji je u ovom slučaju 2. Druga dimenzija [4] definira broj serijskih kodova unutar jedne kartice. Analogno tome možete dodati N broj kartica. Broj serijskih kodova zapisuje se u heksadekadskom zapisu, koji se u Arduino programskom jeziku piše uz dodavanje 0x...

Za šetanje kroz dvodimenzionalno polje koriste se dvije for petlje.

for(i=0;i<n;i++){ <="" p="">

for(j=0;j<4;j++){

Serial.print(kartice[i][j],HEX);

Broj N nam predstavlja broj kartica koji je prethodno definiran.

*Prva for petlja kreće se kroz kartice, prva, druga, itd. Druga for petlja služi za kretanje kroz serijske brojeve kodova.*

Ali kako ću saznati serijski broj kartice? Uh, dobro pitanje. Serijski broj možemo saznati samo pomoću očitavanja kartice na čitaču, a za to ćemo imati jednu petlju u zadatku koja će služiti za ispitivanje kartice i ispisivat će njezin serijski broj u heksadekadskom zapisu, a taj broj lako ubacimo u našu listu dopuštenih kartica.

Dodat ćemo varijablu „očitana_kartica“ tipa int, tj. cjelovitog broja, koja će poprimati vrijednosti 0 ili 1 ovisno o tome je li kartica očitana ili ne.

Također, analogno dodajemo varijablu „dopušteno“ tipa int koja će nam signalizirati je li kartica dovedena na čitač na popisu kartica kojima je dopušten pristup.

Ako je kartica očitana, ispitat će se je li ta kartica na popisu. Ako je, pristup će biti odobren i elektromagnetska brava će otvoriti vrata i upaliti LED-icu, a ako nije, pristup će biti odbijen i upalit će se crvena LED-ica.

Još nam samo preostaje da napišemo funkciju koja će očitavati serijski broj kartice kada se ona nasloni na čitač.

Za tu funkciju dodat ćemo još jednu varijablu „trenutna_kartica[4]“ tipa byte koja predstavlja jednodimenzionalno polje od četiri člana. Naravno, moramo negdje skladištiti trenutno očitanu karticu kako bismo je mogli usporediti s onima koje se nalaze na popisu kartica s dozvoljenim pristupom. Koristimo funkciju iz biblioteke za očitavanje serijskog broja i pohranjujemo ga u varijablu trenutna_kartica uz pomoć for petlje.

Kako se ono krećemo kroz jednodimenzionalno polje? E, pa ovako... trenutna_kartica[4] predstavlja polje od četiri člana s indeksima od 0 do 3. trenutna_kartica[0], trenutna_kartica[1], trenutna_kartica[2] i trenutna_kartica[3]. Pomoću for petlje u svakom krugu mijenjamo pomoćnu varijablu u rasponu 0 - 3 i samim time je koristimo kao indeks u 1D polju. U prvom krugu za i=0 pristupamo trenutna_kartica[i], što je prvi član polja. U sljedećem krugu i=1, itd. Ne zaboravimo da moramo postaviti krajnju vrijednost za varijablu „i“, a uvjet je „i<4“, inače ćemo dobiti beskonačnu petlju!

U programu postoji vremenska odgoda (delay) od 1000 ms kod paljenja LED-ica pri dopuštenom ili nedopuštenom pristupu. Ta odgoda pauzira cijeli program na 1000 ms i samim time povećava vremenski interval koji utječe na čitačevu brzinu očitavanja broja kartica/tagova. Ako želite u kratkim intervalima očitavati kartice, preporučujemo smanjiti vremensku odgodu ili upotrijebiti neki alternativni način.

 

Programski kod:

#include

#include

#define RSTPIN 9

#define SSPIN 10

MFRC522 rc(SSPIN, RSTPIN);

int ocitana;

byte kartice[][4]={{0xC6,0xFD,0xC5,0x32},{0x80,0x74,0xB8,0x73}};

int N=2;

byte trenutna_kartica[4];

void setup() {

Serial.begin(9600);

SPI.begin();

rc.PCD_Init(); //inicijalizacija čitača

rc.PCD_DumpVersionToSerial(); //ispis detalja

pinMode(6,OUTPUT);

pinMode(7,OUTPUT);

}

void loop() {

ocitana = getid();

if(ocitana){

int dopusteno=0;

for(int i=0;i<n;i++){< p="">

if(!memcmp(trenutna_kartica,kartice[i],4)){

dopusteno++;

}

}

if(dopusteno)

{Serial.println(«\nDopusten pristup!»);

digitalWrite(6,HIGH);

delay(1000);

digitalWrite(6,LOW);

delay(100);

}

else {

Serial.println(«Nedopusten pristup!\n»);

digitalWrite(7,HIGH);

delay(1000);

digitalWrite(7,LOW);

delay(100);

}

}

}

int getid(){

if(!rc.PICC_IsNewCardPresent()){

return 0;

}

if(!rc.PICC_trenutna_karticaSerial()){

return 0;

}

Serial.println(«Serijski broj kartice/taga: «);

for(int i=0;i<4;i++){

trenutna_kartica[i]=rc.uid.uidByte[i];

Serial.print(trenutna_kartica[i],HEX);

}

rc.PICC_HaltA();

return 1;

}



3. Korak

Testiranje


Za testiranje smo koristili nekoliko magnetskih kartica i tagova. Tagovi su malo praktičniji jer se mogu zakvačiti za ključeve i samim time se olakšava njihova upotreba, dok je magnetskim karticama malo kompliciranije rukovati jer ćete ih često držati u novčaniku. Naš čitač nije najnoviji na tržištu, no može poslužiti svrsi. Kako radimo s frekvencijom od 13.56 MHz, udaljenost pri kojoj čitač očitava naše magnetske kartice i tagove iznosi maksimalno 1 cm.

Naravno, tu udaljenost možete povećati ako koristite snažnije čitače i veće frekvencije, ali za nas će ovo biti sasvim dovoljno. Mogli bismo reći da je brzina očitavanja instantna, a greške u očitavanju nismo uočili. Na internetu smo pronašli i RFID tagove u obliku mini naljepnica, koje su toliko tanke da se ni ne primijete kada ih zalijepite negdje.

 

Testiranje očitavanje serijskih brojeva

Koliko kartica možemo pohraniti u memoriju?

Iako smo objasnili kako i zašto se serijski brojevi kartice/taga spremaju u obliku polja, nameće se pitanje koliko kartica možemo pohraniti u bazu kartica s dopuštenom autorizacijom. Odgovor na ovo pitanje je relativan jer nemaju sve pločice istu količinu memorije za pohranu koda. Ukratko, kod svakog prenošenja koda na Arduino pločicu dobit ćete u donjem okviru poruku o trenutnom procesu, pa tako i o količini ukupne i iskorištene memorije.

Količinu memorije koju zauzima dvodimenzionalno polje u kojem se pohranjuju serijski brojevi kartice možemo lako izračunati; memorija = N*4*4*. N predstavlja broj kartica, a 4 broj polja u drugoj dimenziji i broj elemenata u svakom polju te druge dimenzije.

Bez brige, nećete imati toliko kartica koliko stane u memoriju jedne Mega pločice, koja je maksimum što se može izvući iz Arduina.

Jeste li znali?

Vjerojatno i sami posjedujete neke magnetske kartice, a da ni ne znate. One se često koriste na privatnim parkirnim rampama ili kao vrste pokaza u javnom prijevozu poput ZET-a i HŽ-a. Neke od njih možda nećete moći očitati pomoću našeg sklopa jer naš čitač i kartice rade pri frekvenciji od 13.56 MHz. Ako se želite poigrati s tim karticama, morat ćete koristiti čitač i kartice prilagođene toj frekvenciji, kao npr. 125 KHz.

U Kini je otvorena prva samoposlužna trgovina u kojoj nema trgovaca, a kako onda radi? Svaki proizvod na sebi ima mali tag u obliku naljepnice i kada odabrane artikle stavite na površinu blagajne, RFID čitač očita njihove serijske kodove i automatski vam izračuna cijenu. Nemojte misliti da se nešto može ukrasti u takvim trgovinama jer je u njima sve automatizirano i opremljeno kamerama, što znači da ulazna vrata otvara računalo, a mislim da ne želite završiti zarobljeni u jednoj takvoj trgovini.

To je tipičan primjer gdje napretkom tehnologije računalo zamjenjuje čovjeka u obavljanju nekih zadaća. Iako se većini ljudi kod nas neće svidjeti ovakva tehnologija, barem više ne bi imali loših iskustava sa živčanim prodavačima.

Ocijeni sadržaj
(0 glasova)

// možda će vas zanimati

Newsletter prijava


Kako izgleda naš posljednji newsletter pogledajte na ovom linku.

Copyright © by: VIDI-TO d.o.o. Sva prava pridržana.