Coraz częściej w życiu codziennym korzystamy z urządzeń regulujących dostęp do różnych usług za pomocą kart zbliżeniowych PICC czy różnego rodzaju breloczków (Fig. 1). Urządzenia takie nazywane są w skrócie RFID. Urządzenia te do przekazywania danych między sobą wykorzystują pole elektromagnetyczne. Aby doszło do komunikacji musimy mieć jakieś przenośne urządzenie elektroniczne (najczęściej kartę wielkości dowodu osobistego) z układem scalonym wyposarzonym w pamięć z zapisanym identyfikatorem etykiety RFID oraz urządzenie odczytujące te identyfikatory, które możemy nazwać czytnikami RFID. Większość etykiet RFID nie jest wyposażonych w żadne źródło zasilania. Ich uruchomienie następuje po zbliżeniu do czytnika RFID, który jest wyposażony w cewkę generującą pole elektromagnetyczne. Zasięg tego pola jest niewielki i z reguły nie przekracza kilka centymetrów. Wystarcza to jednak aby przekazać energię do zbliżonej etykiety, co pozwala na jej chwilowe uruchomienie. Wspomniana cewka jest jednocześnie anteną, która potrafi odebrać dane z numerem identyfikatora RFID przekazywanym z karty bądź breloka do czytnika. Układy takie doskonale nadają się np. do weryfikacji i kontroli osób wchodzących i wychodzących z pomieszczeń, otwierania zamków itp.
Współcześnie jednym z najbardzej popularnych urządzeń RFID jest moduł RC522 (Fig. 2). Jest on zbudowany na układzie NXP RC522. Jest zasilany jest napięciem 3,3 V. Komunikuje się poprzez interface I2C (SDA, SCL) i SPI (MOSI, MISO, SCK i SS/CS). Moduł może odczytywać identyfikatory RFID przypisane do kart i breloczków działających na częstotliwości 13,56 MHz i zgodnych ze standardami ISO/IEC 14443 A/MIFARE, MF1xxS20, MF1xxS70, MF1xxS50. Wbudowana antena pozwala na komunikację w zasięgu do 10 cm nawet przez niemetalowe osłony czy obudowy. Aby doszło do komunikacji pomiędzy układem z zapisaną etykietą RFID a czytnikiem, brelok lub karta muszą zostać przyłożone w sposób równoległy do anteny.
Moduł RFID RC522 jest zasilany napięciem 3,3V ale toleruje logikę 5-voltową i w większości dostępnych aplikacji nie wymaga konwertera poziomów stanów logicznych. Zmontujmy układ korzystając z tabeli połączeń Tab. 1 i schematu z Fig. 3.
| RC522 | Arduino Nano |
|---|---|
| SDA | D10 |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| IRQ | - |
| GND | GND |
| RST | D9 |
| 3,3V | 3,3V |
Zmontowany układ przedstawia Fig. 4.
Obsługa układu przez środowisko Arduino wymaga zainstalowania biblioteki MFRC522.
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
Serial.println("Odczyt kodu RFID");
}
void loop() {
if ( mfrc522.PICC_IsNewCardPresent()) {
if ( mfrc522.PICC_ReadCardSerial()) {
Serial.print("UID: ");
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();
mfrc522.PICC_HaltA();
}
}
}
Po przyłożeniu do czytnika przenośnego urządzenia RFID, w oknie monitora portu szeregowego pojawia się 4 liczbowy kod UID (Fig. 5). W oparciu o weryfikację wykrywanych kodów można zbudować pełnowartościowe urządzenie dostępowe do pomieszczeń czy mebli.
W kolejnym przykładzie wykonano drobną modyfikację pierwszego układu polegającą na dołożeniu do niego wyświetlacza LCD (Fig. 6). Będzie się na nim pojawiał odczytany kod UID.
Wykorzystamy wyświetlacz LCD 16×2. Aby ograniczyć liczbę połączeń kabelkowych, dodatkowo zastosowano konwerter sygnałów sterujących wyświetlaczem na standard I2C - LCM1602. Magistrala I2C wykorzystuje sygnał danych (SDA) i sygnał zegarowy (SCL). W mikrokontrolerze Arduino Nano są one odpowiednio przypisane do pinów A4 i A5 (Fig. 7). Wykorzystanie magistrali I2C wymaga dołączenia do skryptu obsługującego urządzenie biblioteki Wire.h. Obsługą LCD w standardzie I2C zajmie się z kolei biblioteka LiquidCrystal_I2C.h. W odróżnieniu od poprzedniego przykładu liczby kodu wyświetlane na LCD zostaną przekonwertowane z układu heksadecymalnego na dziesiętny.
#include <SPI.h>
#include <MFRC522.h> // RC522 module library
#include <Wire.h> // I2C interface library
#include <LiquidCrystal_I2C.h> // LCD I2C library
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define RST_PIN 9 // Define connection of the RST_PIN of the RFID module
#define SS_PIN 10 // Define connection of the SS_PIN of the RFID module
MFRC522 mfrc522(SS_PIN, RST_PIN); // Set up mfrc522 on the Arduino
void setup() {
lcd.begin(16, 2); // Initialization the interface to the LCD screen and specify the dimensions (width and height)
lcd.backlight(); // Turning on I2C backlight
lcd.setCursor(0, 0); // Set cursor position to the 0 collumn and 0 row
lcd.print("RFID controler"); // Write the text on LCD
delay(500);
lcd.setCursor(0, 1); // Set cursor position to the 0 collumn and 1 row
lcd.print("by Tomek Bartus"); // Write the text on LCD
SPI.begin(); // Initialization of the SPI interface
mfrc522.PCD_Init(); // Initialize Proximity Coupling Device
delay(2000);
lcd.clear(); // Clear the screen
lcd.noBacklight(); // Turning off I2C backlight
}
void loop() {
if ( mfrc522.PICC_IsNewCardPresent()) { // True, if RFID tag/card is present
if ( mfrc522.PICC_ReadCardSerial()) { // True, if RFID tag/card was read
lcd.backlight(); // Turning on I2C backlight
lcd.setCursor(0, 0); // Set cursor position to the 0 collumn and 0 row
lcd.print("UID: "); // Write the text on LCD
lcd.setCursor(0, 1); // Set cursor position to the 0 collumn and 1 row
for (byte i = 0; i < mfrc522.uid.size; i++) { // read id (in parts)
lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
lcd.print(mfrc522.uid.uidByte[i], DEC); // print uid as dec values
}
delay(1000);
lcd.clear(); // Clear the screen
lcd.noBacklight(); // Turning off I2C backlight
mfrc522.PICC_HaltA(); // Stop the reading process
}
}
}