Bố cục bộ nhớ MIFARE Classic 1K
MIFARE Classic 1K là một loại thẻ RFID được sử dụng phổ biến trong các ứng dụng thẻ thông minh và hệ thống điều khiển truy cập. Nó có dung lượng bộ nhớ 1 kilobyte (1024 bytes) và được chia thành các khối (blocks) và phân đoạn (sectors).
Dung lượng bộ nhớ: MIFARE Classic 1K có tổng cộng 16 phân đoạn, mỗi phân đoạn chứa 4 khối, mỗi khối chứa 16 byte. Do đó, tổng dung lượng bộ nhớ là 16 phân đoạn x 4 khối x 16 byte = 1024 byte.
Phân đoạn (Sectors): Mỗi phân đoạn chứa 4 khối dữ liệu và một khối chứa thông tin định danh (trailer block). Số thứ tự của phân đoạn được đánh từ 0 đến 15.
Khối (Blocks): Mỗi khối có kích thước 16 byte. Trong mỗi phân đoạn, có 3 khối dữ liệu và 1 khối trailer block. Khối trailer chứa thông tin định danh, quản lý quyền truy cập và khóa.
Truy cập và bảo vệ dữ liệu: Mỗi khối có thể được bảo vệ bằng một khóa (key). Chỉ những người có khóa chính (key A hoặc key B) mới có thể truy cập và ghi dữ liệu vào khối. Quyền truy cập và quản lý khóa được quản lý thông qua khối trailer.
Phân chia quyền truy cập: Mỗi khối có thể được chia thành 2 phần với các quyền truy cập khác nhau, bao gồm quyền đọc, ghi và xóa.
Thông tin định danh (UID): Mỗi thẻ MIFARE Classic 1K có một số ID duy nhất (UID) 4 byte được sử dụng để xác định thẻ.
Tổng quan về phần cứng
Module RFID RC522 là một module sử dụng công nghệ RFID để đọc và ghi thông tin từ các thẻ RFID. Nó được sử dụng phổ biến trong các dự án Arduino và các ứng dụng liên quan đến nhận dạng và theo dõi.
Module RFID Arduino bao gồm một chip đọc RFID MFRC522 và các thành phần khác như anten và các linh kiện điện tử. Chip MFRC522 có khả năng đọc và ghi dữ liệu từ các thẻ RFID tiêu chuẩn, bao gồm các loại thẻ MIFARE và các loại thẻ tương thích.
Module RFID RC522 kết nối với Arduino thông qua giao tiếp SPI (Serial Peripheral Interface) hoặc I2C và UART.
Để sử dụng module RFID RC522, cần có thư viện hỗ trợ cho Arduino như thư viện MFRC522, giúp dễ dàng giao tiếp và điều khiển module. Thông qua thư viện này, bạn có thể đọc thông tin từ thẻ RFID, xác minh chúng và thực hiện các hoạt động như đọc mã số, ghi dữ liệu, kiểm tra trạng thái và điều khiển anten.
Thông số kỹ thuật
Frequency Range | 13.56 MHz ISM Band |
Host Interface | SPI / I2C / UART |
Operating Supply Voltage | 2.5 V to 3.3 V |
Max. Operating Current | 13-26mA |
Min. Current(Power down) | 10µA |
Logic Inputs | 5V Tolerant |
Read Range | 5 cm |
Sơ đồ chân Module RFID RC522
- SDA (Serial Data): Dùng để truyền và nhận dữ liệu giữa module RFID RC522 Arduino.
- SCK (Serial Clock): Dùng để đồng bộ hóa truyền thông SPI giữa module RFID RC522 và Arduino.
- MOSI (Master Output Slave Input): Dùng để truyền dữ liệu từ Arduino tới module RFID RC522.
- MISO (Master Input Slave Output): Chân đầu vào của Arduino nối với chân MISO trên module RFID RC522. Dùng để nhận dữ liệu từ module RFID RC522 về Arduino qua giao thức SPI.
- IRQ (Interrupt Request): Chân ngắt không được sử dụng trong một số ứng dụng của module RFID RC522. Nếu sử dụng, chân này được sử dụng để xác định xem module RFID RC522 có sự kiện cần xử lý hay không.
- GND (Ground): Chân đất kết nối với chân GND trên Arduino.
- RST (Reset): Chân đặt lại (reset) module RFID RC522. Khi chân này được kích hoạt, module sẽ được đặt lại về trạng thái ban đầu.
- 3.3V: Nguồn cấp 3.3V cho module.
Supplies
————————————————————–
- Arduino UNO development board
- USB 2.0 Cable Type A/B
- LCD Display 16×2 with I2C interface
- RFID reader RC522
- RFID tags or cards
- Red LED
- Geen LED
- Two 330 Ohm resistors
- MB120 Breadboard
- Cables
————————————————————–
- Carte de développement Arduino UNO
- Câble USB 2.0 type A/B
- Afficheur LCD 16×2 avec l’interface I2C
- Lecteur RFID RC522
- Badges ou cartes RFID
- LED rouge
- LED verte
- Deux résistances de 330 Ohm
- Platine d’essai MB120
- Câbles
—————————————————————
Code: Đọc thẻ RFID
Sau khi bạn đã cài đặt thư viện thành công, vào phần Ví dụ và chọn MFRC522 > DumpInfo.
Đoạn code này dùng để đọc và hiển thị thông tin thẻ RFID lên cổng Serial.
Định nghĩa chân kết nối RST_PIN là chân số 5 trên Arduino.
Tiếp hành nạp Code vào Arduino Uno, đưa thẻ đến module RFID Arduino, bạn sẽ nhận được giá trị như sau. Lưu ý, không di chuyển thẻ cho đến khi tất cả các thông tin được hiển thị.
Step 2: Libraries / Bibliothèques
The libraries you will need to download are listed above. To open the “Library manager”, go to the top menu then click on Tools => Manage Libraries
——————————————————————————————————-
Les bibliothèques qu’il faut télécharger, vous allez les trouver ci-dessus. Pour ouvrir le “Gestionnaire de bibliothèque”, Allez au menu du haut ensuite cliquez sur Outils => Gérer les bibliothèques
Cài đặt thư viện MFRC522
Mở Arduino IDE trên máy tính của bạn. Trong menu chính của Arduino IDE, chọn “Sketch” -> “Include Library” -> “Manage Libraries…”.
Một cửa sổ “Library Manager” sẽ hiển thị. Trong ô tìm kiếm, gõ “MFRC522” và nhấn Enter.
Thư viện “MFRC522” sẽ xuất hiện trong kết quả tìm kiếm. Nhấn vào nút “Install” bên cạnh thư viện để tiến hành cài đặt.
Yassine View All
Automation and Electrical Engineer, Electronics amateur trying to share my little projects.
hi friend.i try make project rfid with nano and i2c lcd. before this i use mega all work fine.but when use nano lcd blank and coding not work. verify coding all good. upload also good.if i remove i2c lcd coding all work fine (FRID can read tag).does nano not support rfid codi + i2c lecd code?
i use :arduino nanoRFID – mfrc522i2c LCD 16x2arduino IDE 2.0.4
here my code:
* Read a card using a mfrc522 reader on your SPI interface * Pin layout should be as follows (on Arduino Uno): * MOSI: Pin 11 / ICSP-4 * MISO: Pin 12 / ICSP-1 * SCK: Pin 13 / ISCP-3 * SS/SDA: Pin 10 * RST: Pin 9 */ #include
#include
#include
#include#define SS_PIN 10 #define RST_PIN 9 RFID rfid(SS_PIN,RST_PIN); LiquidCrystal_I2C lcd(0x27,16,2); // SDA=A4 , SCL=A5 int led = 7; int power = 8; int serNum[5]; int cards[][5] = { {5,117,21,219,190} }; bool access = false; void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); lcd.init(); // initialize the lcd lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("HAI...."); lcd.setCursor(0,1); lcd.print("SMART PARKING."); pinMode(led, OUTPUT); pinMode(power, OUTPUT); digitalWrite(led, LOW); delay(10000); lcd.clear(); } void loop(){ if(rfid.isCard()){ if(rfid.readCardSerial()){ Serial.print(rfid.serNum[0]); Serial.print(" "); Serial.print(rfid.serNum[1]); Serial.print(" "); Serial.print(rfid.serNum[2]); Serial.print(" "); Serial.print(rfid.serNum[3]); Serial.print(" "); Serial.print(rfid.serNum[4]); Serial.println(""); for(int x = 0; x < sizeof(cards); x++) { for(int i = 0; i < sizeof(rfid.serNum); i++ ) { if(rfid.serNum[i] != cards[x][i]) // IF CARD SAME WITH STORE ID { access = false; break; } else { access = true; } } if(access) break; } } if(access){ Serial.println("Welcome!"); lcd.setCursor(0,0); lcd.print("Welcome!"); digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); digitalWrite(power, HIGH); delay(1000); digitalWrite(power, LOW); } else { Serial.println("Not allowed!"); lcd.setCursor(0,0); lcd.print("Not allowed!"); digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); delay(500); digitalWrite(led, HIGH); delay(500); digitalWrite(led, LOW); } } rfid.halt(); }
type or paste code here
type or paste code here
Các linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Uno R3 | Shopee | Cytron | |
RFID RC522 | Shopee | Cytron | |
Dây cắm (Đực – Cái) | 10 – 20 | Shopee | Cytron |
Step 3: Source Code / Code Source
To know the UID of your tag or your card, you first need to upload the program ‘DumpInfo.io’, to find this file, go to the top menu of the Arduino IDE then click on File => Examples => MFRC522 => DumpInfo. This program returns the UID in hexadecimal, then you convert it to decimal and then you replace mine with yours 🙂
For more details, you can watch this vidéo : https://youtu.be/tQ5MZ7sGGNE
——————————————————————————————————————————
Pour connaitre le UID de votre bagde ou de votre carte, vous devez d’abord téléverser le programme ‘DumpInfo.io’; pour trouver ce fichier, allez au menu du haut de l’IDE Arduino, cliquez sur Fichier => Exemples => MFRC522 => DumpInfo. Ce programme renvoie l’UID en héxadécimal, vous le convertissez ensuite en décimal et vous remplacez ensuite le mien par le votre 🙂
Pour plus de détails, vous pouvez regarder cette vidéo : https://youtu.be/tQ5MZ7sGGNE
Components and supplies
RIFD Reader RC522
Single Turn Potentiometer- 10k ohms
Arduino UNO
Jumper wires (generic)
Breadboard (generic)
Standard LCD – 16×2 White on Blue
Project description
Code
RFID Reader Write with LCD
arduino
This the actual RFID lock
1//All Credit Technic 1510 2// 3// 4// 5// 6#include
7#include
8#include9#define SS_PIN 10 10#define RST_PIN 9 11MFRC522 mfrc522(SS_PIN, RST_PIN); 12LiquidCrystal lcd(6 , 7, 5, 4, 3, 2); 13 14 15void setup() 16{ 17 18 SPI.begin(); 19 mfrc522.PCD_Init(); 20 lcd.begin(16, 2); 21 lcd.print(“Scan RFID Card”); 22 23 24} 25void loop() 26{ 27 28 if ( ! mfrc522.PICC_IsNewCardPresent()) 29 { 30 return; 31 } 32 33 if ( ! mfrc522.PICC_ReadCardSerial()) 34 { 35 return; 36 } 37 38 lcd.clear(); 39 lcd.begin(16, 2); 40 lcd.print(“UID tag :”); 41 String content= “”; 42 byte letter; 43 for (byte i = 0; i < mfrc522.uid.size; i++) 44 { 45 lcd.setCursor(0, 1); 46 lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “); 47 lcd.print(mfrc522.uid.uidByte[i], HEX); 48 content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “)); 49 content.concat(String(mfrc522.uid.uidByte[i], HEX)); 50 } 51lcd.clear(); 52lcd.begin(16, 2); 53 lcd.print(“Message : “); 54 content.toUpperCase(); 55 if (content.substring(1) == “E0 28 E9 87”) //Plz change to your cards UID 56 { 57 lcd.setCursor(0,1); 58 lcd.print(“Authorized”); 59 60 delay(3000); 61 lcd.clear(); 62 setup(); 63 } 64 65 else { 66 lcd.setCursor(0, 1); 67 lcd.print(” Access denied”); 68 delay(3000); 69 lcd.clear(); 70 setup(); 71 } 72} 73
RFID Reader (Data Reader)
arduino
Please use this to find your cards ID. THIS ALSO CHANGES THE UID So you can have a different one
1//All credit to Technic1510 2// 3// 4// 5// 6// 7#include
8#include
9 10#define RST_PIN 9 // Configurable, see typical pin layout above 11#define SS_PIN 10 // Configurable, see typical pin layout above 12 13MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance 14 15/* Set your new UID here! */ 16#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} 17 18MFRC522::MIFARE_Key key; 19 20void setup() { 21 Serial.begin(9600); // Initialize serial communications with the PC 22 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 23 SPI.begin(); // Init SPI bus 24 mfrc522.PCD_Init(); // Init MFRC522 card 25 Serial.println(F(“Warning: this example overwrites the UID of your UID changeable card, use with care!”)); 26 27 // Prepare key – all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. 28 for (byte i = 0; i < 6; i++) { 29 key.keyByte[i] = 0xFF; 30 } 31} 32 33// Setting the UID can be as simple as this: 34//void loop() { 35// byte newUid[] = NEW_UID; 36// if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { 37// Serial.println(“Wrote new UID to card.”); 38// } 39// delay(1000); 40//} 41 42// But of course this is a more proper approach 43void loop() { 44 45 // Look for new cards, and select one if present 46 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { 47 delay(50); 48 return; 49 } 50 51 // Now a card is selected. The UID and SAK is in mfrc522.uid. 52 53 // Dump UID 54 Serial.print(F(“Card UID:”)); 55 for (byte i = 0; i < mfrc522.uid.size; i++) { 56 Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “); 57 Serial.print(mfrc522.uid.uidByte[i], HEX); 58 } 59 Serial.println(); 60 61 // Dump PICC type 62// MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); 63// Serial.print(F(“PICC type: “)); 64// Serial.print(mfrc522.PICC_GetTypeName(piccType)); 65// Serial.print(F(” (SAK “)); 66// Serial.print(mfrc522.uid.sak); 67// Serial.print(“)\ \ 68”); 69// if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI 70// && piccType != MFRC522::PICC_TYPE_MIFARE_1K 71// && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { 72// Serial.println(F(“This sample only works with MIFARE Classic cards.”)); 73// return; 74// } 75 76 // Set new UID 77 byte newUid[] = NEW_UID; 78 if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { 79 Serial.println(F(“Wrote new UID to card.”)); 80 } 81 82 // Halt PICC and re-select it so DumpToSerial doesn’t get confused 83 mfrc522.PICC_HaltA(); 84 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { 85 return; 86 } 87 88 // Dump the new memory contents 89 Serial.println(F(“New UID and contents:”)); 90 mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); 91 92 delay(2000); 93} 94
RFID Reader (Data Reader)
arduino
Please use this to find your cards ID. THIS ALSO CHANGES THE UID So you can have a different one
1//All credit to Technic1510 2// 3// 4// 5// 6// 7#include
8#include
9 10#define RST_PIN 9 // Configurable, see typical pin layout above 11#define SS_PIN 10 // Configurable, see typical pin layout above 12 13MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance 14 15/* Set your new UID here! */ 16#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF} 17 18MFRC522::MIFARE_Key key; 19 20void setup() { 21 Serial.begin(9600); // Initialize serial communications with the PC 22 while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) 23 SPI.begin(); // Init SPI bus 24 mfrc522.PCD_Init(); // Init MFRC522 card 25 Serial.println(F(“Warning: this example overwrites the UID of your UID changeable card, use with care!”)); 26 27 // Prepare key – all keys are set to FFFFFFFFFFFFh at chip delivery from the factory. 28 for (byte i = 0; i < 6; i++) { 29 key.keyByte[i] = 0xFF; 30 } 31} 32 33// Setting the UID can be as simple as this: 34//void loop() { 35// byte newUid[] = NEW_UID; 36// if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { 37// Serial.println(“Wrote new UID to card.”); 38// } 39// delay(1000); 40//} 41 42// But of course this is a more proper approach 43void loop() { 44 45 // Look for new cards, and select one if present 46 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { 47 delay(50); 48 return; 49 } 50 51 // Now a card is selected. The UID and SAK is in mfrc522.uid. 52 53 // Dump UID 54 Serial.print(F(“Card UID:”)); 55 for (byte i = 0; i < mfrc522.uid.size; i++) { 56 Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “); 57 Serial.print(mfrc522.uid.uidByte[i], HEX); 58 } 59 Serial.println(); 60 61 // Dump PICC type 62// MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); 63// Serial.print(F(“PICC type: “)); 64// Serial.print(mfrc522.PICC_GetTypeName(piccType)); 65// Serial.print(F(” (SAK “)); 66// Serial.print(mfrc522.uid.sak); 67// Serial.print(“)\ \ 68”); 69// if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI 70// && piccType != MFRC522::PICC_TYPE_MIFARE_1K 71// && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { 72// Serial.println(F(“This sample only works with MIFARE Classic cards.”)); 73// return; 74// } 75 76 // Set new UID 77 byte newUid[] = NEW_UID; 78 if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) { 79 Serial.println(F(“Wrote new UID to card.”)); 80 } 81 82 // Halt PICC and re-select it so DumpToSerial doesn’t get confused 83 mfrc522.PICC_HaltA(); 84 if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { 85 return; 86 } 87 88 // Dump the new memory contents 89 Serial.println(F(“New UID and contents:”)); 90 mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); 91 92 delay(2000); 93} 94
RFID Reader Write with LCD
arduino
This the actual RFID lock
1//All Credit Technic 1510 2// 3// 4// 5// 6#include
7#include
8#include9#define SS_PIN 10 10#define RST_PIN 9 11MFRC522 mfrc522(SS_PIN, RST_PIN); 12LiquidCrystal lcd(6 , 7, 5, 4, 3, 2); 13 14 15void setup() 16{ 17 18 SPI.begin(); 19 mfrc522.PCD_Init(); 20 lcd.begin(16, 2); 21 lcd.print(“Scan RFID Card”); 22 23 24} 25void loop() 26{ 27 28 if ( ! mfrc522.PICC_IsNewCardPresent()) 29 { 30 return; 31 } 32 33 if ( ! mfrc522.PICC_ReadCardSerial()) 34 { 35 return; 36 } 37 38 lcd.clear(); 39 lcd.begin(16, 2); 40 lcd.print(“UID tag :”); 41 String content= “”; 42 byte letter; 43 for (byte i = 0; i < mfrc522.uid.size; i++) 44 { 45 lcd.setCursor(0, 1); 46 lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “); 47 lcd.print(mfrc522.uid.uidByte[i], HEX); 48 content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “)); 49 content.concat(String(mfrc522.uid.uidByte[i], HEX)); 50 } 51lcd.clear(); 52lcd.begin(16, 2); 53 lcd.print(“Message : “); 54 content.toUpperCase(); 55 if (content.substring(1) == “E0 28 E9 87”) //Plz change to your cards UID 56 { 57 lcd.setCursor(0,1); 58 lcd.print(“Authorized”); 59 60 delay(3000); 61 lcd.clear(); 62 setup(); 63 } 64 65 else { 66 lcd.setCursor(0, 1); 67 lcd.print(” Access denied”); 68 delay(3000); 69 lcd.clear(); 70 setup(); 71 } 72} 73
Downloadable files
Connection Diagram
Connection Diagram
Comments
Only logged in users can leave comments
Techinc1510
0 Followers
•
0 Projects
Table of contents
Intro
24
|
Read more
I used for this project an RC522 RFID module.
The LCD display has an I2C module attached.
You can modify the code so it can display anything you want in what language you want. In the photo, I wrote in Romanian but how I said, you can modify the code.
What’s inside. You can make it more organised.
If you have any questions, please let me know.
RFID là gì? Hướng dẫn sử dụng Module RFID RC522 với Arduino
Module RFID RC522 Arduino không còn quá xa lạ với các bạn, nó được ứng dụng rất nhiều trong các ứng dụng như mở khoá cửa tự động, các giải pháp thanh toán,…và rất rất nhiều ứng dụng khác. Đây là một bài viết sẽ giúp bạn hiểu rõ hơn về RFID và nguyên lý hoạt động của chúng. Qua đó mình sẽ giới thiệu cách ứng dụng RFID RC522 vào một dự án hệ thống khóa cửa thông minh.
Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.
Introduction: RFID Tag/card Verification System : Arduino UNO + RFID RC522 + LCD 16×2 I2C + LEDs
In this project, the RC522 RFID (Radio Frequency IDentification) module was tested, if the correct badge (or card) that was scanned, “valid badge” will be displayed on the LCD screen and the green LED will light up for a few seconds , if not, “invalid badge” will be displayed on the LCD screen and the red LED will light up for a few seconds.
——————————————————————————————————————————–
Dans ce projet, le module RFID (en français: Identification par Radiofréquence) RC522 a été testé, si c’est le bon badge (ou la bonne carte) qui lui a été présenté, “badge valide” sera affiché sur l’écran LCD et la LED verte sera allumée pendant quelques secondes, sinon, “badge non valide” sera affiché sur l’écran LCD et la LED rouge sera allumée pendant quelques secondes.
Sơ đồ đấu nối Module RFID RC522 với Arduino Uno
RC522 Module | Arduino |
VCC | 3.3V |
GND | GND |
RST | |
MISO / SCL / Tx | 12 |
MOSI | 11 |
SCK | 13 |
SS / SDA / Rx | 10 |
RFID là gì? Nguyên lý hoạt động của Module RFID RC522
RFID là viết tắt của “Radio Frequency Identification”, có nghĩa là nhận dạng bằng tần số radio. Đây là một công nghệ sử dụng sóng radio để truyền và nhận dạng thông tin từ một thẻ hoặc một thiết bị RFID. Hệ thống RFID bao gồm ít nhất hai thành phần chính: một thẻ RFID (hay còn gọi là tag RFID) và một đầu đọc RFID (hay còn gọi là reader RFID).
Thẻ RFID thường được gắn vật lên vật thể, nó chứa một anten để thu phát sóng radio và một chip chứa thông tin cần được nhận dạng. Đầu đọc RFID sử dụng sóng radio để truyền đi và nhận lại thông tin từ thẻ RFID. Khi thẻ RFID được đặt trong phạm vi hoạt động của đầu đọc RFID, thông tin từ thẻ sẽ được truyền đến đầu đọc RFID để xử lý và xác định thông tin nhận dạng.
Code: Đọc và ghi dữ liệu từ thẻ RFID sử dụng module RC522
Đoạn code bên dưới có chức năng đọc và ghi dữ liệu từ module RFID RC522 bằng Arduino Uno.
#include
//include the SPI bus library #include
//include the RFID reader library #define SS_PIN 10 //slave select pin #define RST_PIN 5 //reset pin MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object. MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named ‘key’, which will hold the card information //this is the block number we will write into and then read. int block=2; byte blockcontent[16] = {“Last-Minute-Engg”}; //an array with 16 bytes to be written into one of the 64 card blocks is defined //byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block. //This array is used for reading out a block. byte readbackblock[18]; void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device) Serial.println(“Scan a MIFARE Classic card”); // Prepare the security key for the read and write functions. for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; //keyByte is defined in the “MIFARE_Key” ‘struct’ definition in the .h file of the library } } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.println(“card selected”); //the blockcontent array is written into the card block writeBlock(block, blockcontent); //read the block back readBlock(block, readbackblock); //uncomment below line if you want to see the entire 1k memory with the block written into it. //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //print the block contents Serial.print(“read block: “); for (int j=0 ; j<16 ; j++) { Serial.write (readbackblock[j]); } Serial.println(“”); } //Write specific block int writeBlock(int blockNumber, byte arrayAddress[]) { //this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info. int largestModulo4Number=blockNumber/4*4; int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector if (blockNumber > 2 && (blockNumber+1)%4 == 0){Serial.print(blockNumber);Serial.println(” is a trailer block:”);return 2;} Serial.print(blockNumber); Serial.println(” is a data block:”); //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(“PCD_Authenticate() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return “3” as error message } //writing the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print(“MIFARE_Write() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return “4” as error message } Serial.println(“block was written”); } //Read specific block int readBlock(int blockNumber, byte arrayAddress[]) { int largestModulo4Number=blockNumber/4*4; int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(“PCD_Authenticate() failed (read): “); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return “3” as error message } //reading a block byte buffersize = 18;//we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size… status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize);//&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number if (status != MFRC522::STATUS_OK) { Serial.print(“MIFARE_read() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return “4” as error message } Serial.println(“block was read”); }
Sau khi nạp code và tiến hành quét thẻ thì thông tin hiển thị sẽ như thế này.
Giải thích Code
#include
//include the SPI bus library #include
//include the RFID reader library
Khai báo và
include
các thư viện cần thiết để sử dụng module RFID Arduino.
#define SS_PIN 10 //slave select pin #define RST_PIN 5 //reset pin
Định nghĩa các chân kết nối với module RFID RC522 trên Arduino Uno.
MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object. MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named ‘key’, which will hold the card information
Khởi tạo đối tượng mfrc522 để sử dụng các phương thức của module RFID.
//this is the block number we will write into and then read. int block=2; byte blockcontent[16] = {“Last-Minute-Engg”}; //an array with 16 bytes to be written into one of the 64 card blocks is defined //byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block. //This array is used for reading out a block. byte readbackblock[18];
Khai báo một cấu trúc MIFARE_Key để lưu trữ thông tin định danh của thẻ.
void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device) Serial.println(“Scan a MIFARE Classic card”); // Prepare the security key for the read and write functions. for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; //keyByte is defined in the “MIFARE_Key” ‘struct’ definition in the .h file of the library } }
Hàm
setup()
được gọi một lần khi Arduino khởi động. Nó khởi tạo các cài đặt ban đầu cho module RFID RC522 và khóa truy cập (key) cho việc đọc và ghi dữ liệu.
void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.println(“card selected”); //the blockcontent array is written into the card block writeBlock(block, blockcontent); //read the block back readBlock(block, readbackblock); //uncomment below line if you want to see the entire 1k memory with the block written into it. //mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //print the block contents Serial.print(“read block: “); for (int j=0 ; j<16 ; j++) { Serial.write (readbackblock[j]); } Serial.println(“”); }
Hàm
loop()
được lặp lại liên tục sau khi khởi động. Nó kiểm tra xem có thẻ RFID Arduino nằm trong phạm vi hoạt động của module hay không. Nếu có, nó tiến hành ghi dữ liệu vào khối và đọc lại khối đó. Sau đó, nội dung của khối được in ra trên cổng Serial.
//Write specific block int writeBlock(int blockNumber, byte arrayAddress[]) { //this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info. int largestModulo4Number=blockNumber/4*4; int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector if (blockNumber > 2 && (blockNumber+1)%4 == 0){Serial.print(blockNumber);Serial.println(” is a trailer block:”);return 2;} Serial.print(blockNumber); Serial.println(” is a data block:”); //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(“PCD_Authenticate() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return “3” as error message } //writing the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print(“MIFARE_Write() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return “4” as error message } Serial.println(“block was written”); }
Hàm
writeBlock()
: Hàm này được sử dụng để ghi dữ liệu vào một khối cụ thể trên thẻ RFID. Trước khi ghi dữ liệu, hàm xác thực quyền truy cập vào khối và sau đó thực hiện việc ghi dữ liệu vào khối đó.
//Read specific block int readBlock(int blockNumber, byte arrayAddress[]) { int largestModulo4Number=blockNumber/4*4; int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector //authentication of the desired block for access byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(“PCD_Authenticate() failed (read): “); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return “3” as error message } //reading a block byte buffersize = 18;//we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size… status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize);//&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number if (status != MFRC522::STATUS_OK) { Serial.print(“MIFARE_read() failed: “); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return “4” as error message } Serial.println(“block was read”); }
Hàm
readBlock()
: Hàm này được sử dụng để đọc dữ liệu từ một khối cụ thể trên thẻ RFID. Trước khi đọc dữ liệu, hàm xác thực quyền truy cập vào khối và sau đó thực hiện việc đọc dữ liệu từ khối đó.
Quick guide to wire and use the RC522 RFID module with Arduino
Hello everybody and welcome to this quick tutorial, today we gonna use a Mifare RC522 RFID module with an Arduino Uno and an optional LCD i2c screen.
IMPORTANT: Don’t forget that the module is powred with 3.3v from Arduino and you can use the other pins normally but for better use, you should use a level shifter (5v to 3.3v) to not damage the component over time. I didn’t know about this so my RC522 is kinda broken, I couldn’t use it the proper way.
In case it’s your first time using LCD i2c Screen here’s a tutorial: Arduino LCD I2C simple use and direct write from serial monitor
The RFID-RC522 will permit you to read RFID Tags, identify their IDs, you can use it in door lock projects, garages, safes…. For the tags there are two types, here I only used one as shown in the video, it’s not” re-writable”, it has a fix ID. There are other versions that are re-writable which means you can modify the Tag data, and it could be very interesting project in case you want to make a credit system to grant access for only few times… or store data.
This is not a tutorial that I’m proud of, now I check after couple of years it needs a revisit, and a proper project, but this will get you started and push through your school project as I did before.
Wiring:
This wiring will do the work but won’t last for long, as I had trouble using a dodgy version of a level shifter. The LCD i²c screen is optional.
For better use as mentioned you should wire the pins from the module with a level shifter then with the Arduino Uno.
As you can see it’s technically pretty simple to use, I’ll try one when I receive it. You have HV pins for High voltage (5v) from Arduino and LV pins for low Voltage for the Module.
Libraries
You’ll need the RFID library, this is the one I used to not confuse you: Download here, but you can use some other ones that are better like MFRC522…If you’re using LCD i²c you’ll need a library also: Download here.
Codes:
The first code is a simple reading of the TAG’s code, every TAG has its “own” code, and it displays it on the serial monitor and the LCD if wired as well.
Code 1:
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
//Code for reading RFID Tag/Card with RFID-RC522 and show it’s ID on the lcd i2c display //SurtrTech Youtube channel #include
#include #define SS_PIN 10 //SDA pin #define RST_PIN 9 //Reset pin #define I2C_ADDR 0x27 //I2c Address #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); RFID rfid(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); lcd.print(“Hello”); //Showing hello on the screen of 3s delay(3000); lcd.clear(); void loop() { if (rfid.isCard()) { //Waiting for a Tag/Card to be near the RFID antenna if (rfid.readCardSerial()) { //If there is a RFID card lcd.clear(); //Clearing lcd screen from previous value Serial.println(” “); //Showing the ID on the serial monitor Serial.println(“RFID card ID is:”); for(int i=0;i<5;i++) Serial.print(rfid.serNum[i],HEX); Serial.print(“, “); Serial.println(” “); Serial.println(“RFID card ID in HEX is:”); for(int i=0;i<5;i++) Serial.print(rfid.serNum[i]); Serial.print(“, “); delay(500); //Delay of 500ms so we don’t have multiple reading at once lcd.setCursor (0,0); // Printing the Hexadecimal value of the ID on the LCD lcd.print(“Card ID is: “); lcd.setCursor(0,1); lcd.print(rfid.serNum[0],HEX); lcd.setCursor(2,1); //You can see that the position is incremented by 2 because everynumber occupy 2 cases lcd.print(rfid.serNum[1],HEX); lcd.setCursor(4,1); lcd.print(rfid.serNum[2],HEX); lcd.setCursor(6,1); lcd.print(rfid.serNum[3],HEX); lcd.setCursor(8,1); lcd.print(rfid.serNum[4],HEX); |
Code 2:
The second code I didn’t use it on camera, because the module barely worked on the first one, so the second code is for giving access to cards or not, you should use the first code to know the cards ID then add them on the code.
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
//Code for reading RFID Tag/Card and giving access or not to it //SurtrTech Youtube channel #include
#include #define SS_PIN 10 //SDA pin #define RST_PIN 9 //Reset pin #define I2C_ADDR 0x27 //I2c Address #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 int serNum[5]; int cards[][5] = { {35,231,84,0,144}, // Authorized Card ID, You can add others if you want after the last comma like {x1,x2,x3,x4,x5},{y1,y2,y3,y4,y5}, }; bool access = false; LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); RFID rfid(SS_PIN, RST_PIN); void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); lcd.begin (16,2); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); lcd.print(“Hello”); //Showing hello on the screen of 3s delay(3000); lcd.clear(); lcd.print(“Please place”); lcd.setCursor(0,1); lcd.print(“your card”); void loop() { if (rfid.isCard()) { //Waiting for a Tag/Card to be near the RFID antenna if (rfid.readCardSerial()) { //If there is a RFID card lcd.clear(); //Clearing lcd screen from previous value for(int x = 0; x < sizeof(cards); x++){ for(int i = 0; i < sizeof(rfid.serNum); i++ ){ //These two loops are for comparing the card ID with authorized ID’s we set before if(rfid.serNum[i] != cards[x][i]) { access = false; //If one number is different from the authorized card, access become false break; } else { access = true; if(access) break; delay(300); if(access){ //If acces is given do the following instructions, I just show a simple message, you can turn on a LED lcd.clear();// Or activate a relay to unlock a real door or something… lcd.setCursor(0,0); lcd.print(“Access granted”); else{ lcd.clear(); lcd.setCursor(0,0); lcd.print(“Access denied”); delay(5000);//After 5s we show the first message again to be on standby lcd.clear(); lcd.print(“Please place”); lcd.setCursor(0,1); lcd.print(“your card”); |
Categories
Keywords searched by users: rfid lcd i2c arduino
Categories: Tóm tắt 69 Rfid Lcd I2C Arduino
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/