مقدمه
در این آموزش قصد داریم با فناوری RFID بیشتر آشنا شویم و روش کار با ماژول RC522 را گامبهگام بررسی کنیم. ابتدا نگاهی خواهیم داشت به ساختار و اصول عملکرد سیستمهای RFID، سپس به سراغ راهاندازی عملی ماژول و نحوه استفاده از آن میرویم. در پایان نیز با ارائه چند نمونه کاربردی، مفاهیم آموختهشده را به صورت عملی مرور خواهیم کرد.
سرفصلهای این آموزش:
RFID چیست و مکانیزم عملکرد آن چگونه است؟
بررسی اجزای ماژول RC522 و نحوه اتصال آن
روش خواندن دادهها از تگهای RFID
نحوه نوشتن اطلاعات روی تگها و کارتها

RFID چیست؟
سامانه شناسایی از طریق امواج رادیویی یا RFID (مخفف Radio Frequency Identification) یک فناوری ارتباطی بیسیم است که امکان تبادل داده بین یک تگ (Tag) و یک دستگاه گیرنده یا «خوانشگر» را فراهم میکند. احتمالاً نمونههای این فناوری را در فروشگاهها دیدهاید؛ جایی که روی هر کالا یک برچسب نازک حاوی مدار RFID قرار دارد. هنگامی که این برچسب در میدان مغناطیسی ایجادشده توسط دستگاه قرار میگیرد، فعال شده و از طریق امواج رادیویی اطلاعاتی را مخابره میکند. سیستم با دریافت این امواج قادر به شناسایی و پردازش آن تگ میشود و سپس اقدامات لازم مانند حذف آن از موجودی را انجام میدهد.
فناوری RFID در باندهای فرکانسی مختلفی عمل میکند. سه بازه رایج آن شامل فرکانسهای 125 کیلوهرتز (LF)، 13.56 مگاهرتز (HF) و UHF (Ultra High Frequency) است که کاربردهای متنوعی را در صنایع و سیستمهای امنیتی پوشش میدهند.
معرفی ماژول RC522
یکی از ماژولهای پرکاربرد برای پیادهسازی RFID در پروژههای الکترونیکی، RC522 است. این ماژول برای خواندن و نوشتن اطلاعات روی کارتها و تگهای RFID طراحی شده و در فرکانس 13.56 مگاهرتز فعالیت میکند. علاوه بر دریافت اطلاعات از تگ، قابلیت ذخیرهسازی داده در حافظه کارت نیز از ویژگیهای این ماژول به شمار میرود.
مهمترین مشخصات فنی RC522:
قابلیت ارتباط با انواع میکروکنترلرها از طریق پروتکلهای SPI، I2C و UART (سریال)
سرعت انتقال داده تا 10 مگابیت بر ثانیه
ولتاژ تغذیه ۳.۳ ولت
ابعاد جمعوجور، تقریباً ۴ در ۶ سانتیمتر
این ماژول انتخابی مناسب برای پروژههای حضور و غیاب، کنترل دسترسی، درهای هوشمند، سیستمهای پرداخت بدون تماس و بسیاری از کاربردهای دیگر مبتنی بر RFID است.

معرفی پایه های ماژول RC522 MH RFID
ماژول RC522 MH دارای 8 پایه است. کاربرد این پایه ها به شرح زیر است:
VCC: تغذیه ماژول – 3.3V
GND: زمین
RST: ریست
IRQ: وقفه
MISO/TX/SCL: پایه های ارتباطی پروتکل SPI، سریال و I2C
MOSI: پایه ارتباطی پروتکل SPI
SCK: پایه ارتباطی پروتکل SPI
SS/RX/SDA: پایه های ارتباطی پروتکل SPI، سریال و I2C

خواندن اطلاعات تگ های RFID
در این پروژه قصد داریم اطلاعات ذخیرهشده روی یک تگ RFID را با کمک برد آردوینو بخوانیم. برای برقراری ارتباط بین آردوینو و ماژول RC522 از پروتکل SPI استفاده خواهیم کرد.
پس از شناسایی تگ توسط ماژول، دادهها در یک بافر موقت ذخیره شده و سپس از طریق Serial Monitor در محیط Arduino IDE نمایش داده میشوند. بهاینترتیب میتوانیم محتوای هر تگ را مستقیماً روی رایانه مشاهده کنیم.
در تصویر زیر، نحوه اتصال پایههای ماژول RFID به برد آردوینو نشان داده شده است. بلافاصله پس از آن نیز کد برنامهنویسی مورد نیاز برای راهاندازی پروژه ارائه شده است.

/*
* RFID , read tags
* by Hanie kiani
* https://electropeak.com/learn/
*/
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
//*****************************************************************************************//
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Read personal data on a MIFARE PICC:")); //shows in serial that it is ready to read
}
//*****************************************************************************************//
void loop() {
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
//some variables we need
byte block;
byte len;
MFRC522::StatusCode status;
//-------------------------------------------
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
Serial.println(F("**Card Detected:**"));
//-------------------------------------------
mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card
//mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); //uncomment this to see all blocks in hex
//-------------------------------------------
Serial.print(F("Name: "));
byte buffer1[18];
block = 4;
len = 18;
//------------------------------------------- GET FIRST NAME
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Authentication failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(block, buffer1, &len);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Reading failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//PRINT FIRST NAME
for (uint8_t i = 0; i < 16; i++)
{
if (buffer1[i] != 32)
{
Serial.write(buffer1[i]);
}
}
Serial.print(" ");
//---------------------------------------- GET LAST NAME
byte buffer2[18];
block = 1;
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Authentication failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
status = mfrc522.MIFARE_Read(block, buffer2, &len);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("Reading failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//PRINT LAST NAME
for (uint8_t i = 0; i < 16; i++) {
Serial.write(buffer2[i] );
}
//----------------------------------------
Serial.println(F("\n**End Reading**\n"));
delay(1000); //change value if you want to read cards faster
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}
شناسایی تگ های RFID
با افزودن یک بخش ساده به کد برنامه، میتوان یک کد شناسایی خاص (UID) را بهعنوان معیار تعریف کرده و آن را در برنامه آردوینو ثبت کرد (کافیست مقدار آن را در خط اول جایگزین مقدار پیشفرض کنید).
در این حالت، اگر تگی با همان کد تعریفشده روبهروی ماژول قرار گیرد، برد آردوینو آن را به عنوان تگ معتبر شناسایی کرده و LED سبز (متصل به پین دیجیتال ۷) روشن خواهد شد. در صورتی که کد شناسایی مطابقت نداشته باشد، LED قرمز (متصل به پین ۸) فعال میشود که نشاندهنده عدم تطابق است.
این مکانیزم ساده میتواند پایهای برای پروژههای پیشرفتهتر مانند سیستمهای کنترل دسترسی یا قفلهای هوشمند RFID باشد که تنها افراد مجاز قادر به ورود یا استفاده از امکانات خواهند بود.

if(data == (" ...identified tag... "))
{
digitalWrite(8, HIGH);
delay(3000);
digitalWrite(8, LOW);
}
else
{
digitalWrite(7, HIGH);
delay(3000);
digitalWrite(7, LOW);
}
نوشتن اطلاعات روی تگ های RFID
برای نوشتن اطلاعات روی کارت ، ابتدا باید از قابلیت نوشتن کارت خود اطمینان حاصل کنید. کارت UHF نوعی کارت RFID است که با فرکانس بالا کار می کند و توانایی ذخیره اطلاعات را دارد ، بنابراین شما برای نوشتن اطلاعات مورد نظر خود روی کارت به این کارت های RFID احتیاج دارید. از مدار مشابه قبلی استفاده کنید و کد زیر را روی صفحه خود بارگذاری کنید
کد
این کد پس از شناسایی کارت و نمایش UDI کارت، از شما اطلاعاتی میخواهد که شما میخواهید روی کارت ذخیره کنید. این اطلاعات میتواند شامل حروف، اعداد یا رشتههای دیگر باشد.
سپس این اطلاعات در بلوک 1 کارت ذخیره میشود. با تغییر متغیر بلوک در کد، میتوانید هر بار یک بلوک متفاوت بنویسید.
ابتدا کد زیر را بر روی آردوینو خود آپلود کنید.
/*
* RFID , read tags
* by Hanie kiani
* https://electropeak.com/learn/
*/
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Write personal data on a MIFARE PICC "));
}
void loop() {
// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
Serial.print(F("Card UID:")); //Dump 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.print(F(" PICC type: ")); // Dump PICC type
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
byte buffer[34];
byte block;
MFRC522::StatusCode status;
byte len;
Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial
// Ask personal data: Family name
Serial.println(F("Type Family name, ending with #"));
len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
for (byte i = len; i < 30; i++) buffer[i] = ' '; // pad with spaces
block = 1;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("PCD_Authenticate() success: "));
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 2;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
// Ask personal data: First name
Serial.println(F("Type First name, ending with #"));
len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces
block = 4;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
block = 5;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() success: "));
Serial.println(" ");
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
}
سپس سریال مانیتور نرم افزار آردوینو را باز کنید. متن مورد نظر خود را در پنجره سریال تایپ کرده و در انتهای متن کاراکتر # را وارد کنید و سپس کلید Send را بزنید.

اگر عملیات نوشتن روی کارت با موفقیت انجام شود، پیام زیر به شما نمایش داده خواهد شد.

دانلود سورس کامل پروژه به صورت رایگان
رمز فایل: NEWJECT.COM