RFID čtečka s vestavěnou anténou obsahuje vše potřebné pro její snadné použití. RFID zařízení (dále jako tagy) mohou mít různé podoby jako například karty, nálepky, náramky či kulaté přívěsky a také se dělí podle používaných frekvencí. Tento modul obsahuje jako řídící obvod typ MF RC522 a pracuje na frekvenci 13.56 MHz. V tomto návodu si ukážeme načtení adresy různých tagů a jejich využití v programu.

RFID čtečka 13.56 MHz

Pro propojení RFID čtečky s Arduino deskou je zapotřebí propojit celkem 7 vodičů. Propojíme SDA s pinem 10, SCK s pinem 13, MOSI s pinem 11, MISO s pinem 12, GND se zemí, RST s pinem 9 a 3.3V s pinem 3V3 na Arduinu. Modul čtečky komunikuje s Arduinem pomocí SPI protokolu a proto je nutné využít tyto vybrané piny na Arduino desce, je možné změnit pouze piny SDA a RST, přičemž jejich změnu je nutné provést také na začátku programu.

Schéma zapojení RFID čtečky 13.56 MHz

Pro správné přeložení a nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu MFRC522, návod jak na to je uveden zde. Ukázkový kód obsahuje na začátku připojení zmíněné knihovny MFRC522 a také Arduino knihovny SPI a dále definování pinů SDA a RST pro následné vytvoření instance rfid z knihovny MFRC522. V podprogramu setup je nachází zapnutí komunikace přes sériovou linku a dále inicializace komunikace přes protokol SPI a komunikace s RFID čtečkou. V nekonečné smyčce loop je vždy nejprve zkontrolován výskyt RFID tagů v okolí antény pomocí funkce rfid.PICC_IsNewCardPresent() a pokud se zde žádný tag nenachází, je ukončena smyčka loop pomocí příkazu return. Proto by měl být celý kód věnující se práci s RFID čtečkou umístěn vždy na konci loop smyčky. V případě úspěšné detekce tagu se zkontroluje jeho správné načtení funkcí rfid.PICC_ReadCardSerial() a následuje ještě kontrola, jestli načtený tag patří mezi podporované typy. Pokud se dostaneme přes tyto kontroly, je po sériové lince jako první vypsána adresa RFID tagu, která se získá pomocí volání podprogramu vypisHex, který obsahuje pouze převedení adresy do hexa (šestnáctkového) formátu. Dále následuje kontrola známých tagů, kdy se pomocí příkazu if zkontrolují všechny čtyři části adresy a pokud tyto části sedí, je o této skutečnosti vytištěna zpráva po sériové lince. Pro přidání vlastních tagů tedy stačí změnit adresy u všech částí adresy, které získáte po nahrání tohoto programu nad výpisem o neznámém RFID tagu, případně lze samozřejmě nakopírovat další kontroly tagů v úseku if {..}. Na konci smyčky loop se pak už nachází pouze příkazy pro ukončení komunikace a jejího zabezpečení.

// RFID čtečka - ukázka čtení adres tagů

// připojení knihoven SPI a MFRC522
#include <SPI.h>
#include <MFRC522.h>

// definování pinů pro SDA a RST
#define SDA_PIN 10
#define RST_PIN 9

// vytvoření instance RFID čtečky z knihovny
MFRC522 rfid(SDA_PIN, RST_PIN);

void setup() {
  // komunikace přes sériovou linku rychlostí 9600 baud
  Serial.begin(9600);
  // inicializace komunikace přes SPI
  SPI.begin();
  // inicializace komunikace s RFID čtečkou
  rfid.PCD_Init();
}

void loop() {
  // kontrola RFID tagů v okolí modulu,
  // pokud není žádný tag v okolí, volá se loop funkce od začátku,
  // celá část s RFID by tedy měla být na konci programu
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  // kontrola správného přečtení RFID tagu
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  // výpis informace o verzi RFID tagu
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.print("RFID tag typu: ");
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // kontrola podporovaných typů RFID tagu
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("Tento RFID tag neni podporovany (typ MIFARE Classic).");
    return;
  }
  // výpis adresy RFID tagu v hexa formátu
  Serial.print("Adresa RFID tagu: ");
  vypisHex(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();

  if(rfid.uid.uidByte[0] == 0x52 & rfid.uid.uidByte[1] == 0x3D & rfid.uid.uidByte[2] == 0xE5 & rfid.uid.uidByte[3] == 0xD5) {
    Serial.println("Detekovana bila karta!");
  }
  else if(rfid.uid.uidByte[0] == 0xC1 & rfid.uid.uidByte[1] == 0x07 & rfid.uid.uidByte[2] == 0x22 & rfid.uid.uidByte[3] == 0x77) {
    Serial.println("Detekovan modry privesek!");
  }
  /* ukázka přidání dalšího tagu
  else if(rfid.uid.uidByte[0] == 0x?? & rfid.uid.uidByte[1] == 0x?? & rfid.uid.uidByte[2] == 0x?? & rfid.uid.uidByte[3] == 0x??) {
    Serial.println("Detekovan novy tag ..!");
  } 
   */
  else {
    Serial.println("Detekovan neznamy RFID tag!");
  }
  Serial.println();
  // ukončení komunikace a jejího zabezpečení
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
}
// podprogram pro výpis adresy RFID tagu v hexa formátu
void vypisHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

Po nahrání programu do Arduino desky s připojenou RFID čtečkou uvidíme například takovýto výpis:

RFID tag typu: MIFARE 1KB
Adresa RFID tagu:  52 3D E5 D5
Detekovana bila karta!

RFID tag typu: MIFARE 1KB
Adresa RFID tagu:  C1 07 22 77
Detekovan modry privesek!

RFID tag typu: MIFARE 4KB
Adresa RFID tagu:  FC 61 8C 93
Detekovan neznamy RFID tag!

RFID čtečka s vestavěnou anténou je jednoduše použitelný modul, který lze například využít pro různá zabezpečovací zařízení, kdy chceme vytvořit vlastní přístupový systém či provést určité činnosti pro jednotlivé tagy. Je však důležité zmínit, že tento modul využívá prolomený zabezpečovací systém Crypto1 a nedoporučuji nikomu používat tento modul například pro zabezpečení domu či jiného cenného majetku.

Seznam použitých komponent:

http://dratek.cz/arduino/833-arduino-rfid-ctecka-s-vestavenou-antenou.html

http://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

http://dratek.cz/arduino/1227-7-ks-mini-nepajive-pole-25-kontaktu-1458405292.html

http://dratek.cz/arduino-kabelaz-propoje-rozsireni/1063-arduino-vodice-samec-samec-40-kusu.html

FB tw

Další podobné články