راه اندازی ماژول RFID با آردوینو

مقدمه

در این آموزش قصد داریم با فناوری 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 به برد آردوینو نشان داده شده است. بلافاصله پس از آن نیز کد برنامه‌نویسی مورد نیاز برای راه‌اندازی پروژه ارائه شده است.

کد آردوینو – حالت تاریک
Arduino

/* 
 *  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 باشد که تنها افراد مجاز قادر به ورود یا استفاده از امکانات خواهند بود.

کد آردوینو - حالت تاریک
Arduino

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 کارت ذخیره می‌شود. با تغییر متغیر بلوک در کد، می‌توانید هر بار یک بلوک متفاوت بنویسید.
ابتدا کد زیر را بر روی آردوینو خود آپلود کنید.

کد آردوینو - حالت تاریک
Arduino

/* 
 *  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 را بزنید.

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

دانلود سورس کامل پروژه به صورت رایگان

پروژه سیستم یادآور پیامکی یادداشت شوالیه - Knight's Note حجم: 1.5 مگابایت | فرمت: ZIP | آپدیت: 1404/04/12
دانلود
این فایل، سورس کامل پروژه به صورت رایگان است. محتوای فایل شامل کد پروژه، طراحی شماتیک و PCB است.
رمز فایل: NEWJECT.COM
Scroll to Top