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 } } }