RFID / NFC تحلیل کتابخانه

تحلیل و بررسی کتابخانه MFRC522.h

نوشته شده توسط معین صابری

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

 


نصب کتابخانه MFRC522.h


اولین قدم در استفاده از یک کتابخانه، نصب آن در محیط آردوینو است. برای نصب کتابخانه، دو روش دستی و خودکار وجود دارد. در روش دستی، پس از دانلود فایل های کتابخانه، می بایست آن را در مسیر نصب آردویینو قرار دهید. اما در روش خودکار، تنها با تایپ نام کتابخانه در قسمت مدیریت کتابخانه ها، کتابخانه مورد نظر به صورت خودکار در مخازن آردوینو جستجو شده و پس از یافتن آن، نصب خواهد شد. به همین منظور، ابتدا در نرم افزار آردوینو، بر روی گزینه Tools و سپس Manage Libraries کلید کنید. با کلیک بر روی گزینه Manage Libraries، می توانید وضعیت کتابخانه های نصب شده و لیستی از کتابخانه های جدید و بروز را مشاهده کنید. این مورد در تصویر زیر، قابل مشاهده است.

MFRC522.h Library Analysis

 

مطابق فلش قرمز رنگ تصویر فوق، در کادر جستجو، با تایپ نام کتابخانه، می توان آن را یافته و سپس نصب نمود. در اینجا ما عبارت “MFRC522” را تایپ می کنیم. پس از چند لحظه، کتابخانه مورد نظر به شکل تصویر زیر، به نمایش در می آید. با کلیک بر روی گزینه install، این کتابخانه را نصب نمایید.

MFRC522.h Library Analysis

 

پس از نصب کتابخانه، نوبت به بررسی توابع و استفاده از آن می رسد. اما پیش از آن، ابتدا به بررسی توابع کلیدی و کاربردی پرداخته و در نهایت با ارائه مثال از کاربرد، به آموزش را پایان می دهیم.

توجه: کتابخانه مورد بررسی در این آموزش، ورژن ۱٫۴٫۸ است.

 


بردهای مورد پشتیبانی


کتابخانه RC522، یک کتابخانه جامع با قابلیت استفاده در طیف وسیعی از بردهای آردوینو، ESP و میکروکنترلرهای آرم است.  این کتابخانه قابلیت نوشتن و خواندن را تحت استاندارد  ISO/IEC 14443A/MIFARE داراست. از این کتابخانه می توان در بردهای زیر، استفاده نمود.

  1. آردوینو میکرو
  2. آردوینو لئوناردو
  3. آردوینو مگا
  4. آردوینو UNO
  5. آردوینو نانو
  6. آردوینو میکرو
  7. بردهای ESP8266
  8. بردهای Teensy

همچنین جدول زیر که از رفرنس دریافت شده، نحوه  سیم کشی و اتصالات در بردهای مختلف آردوینو را نمایش می دهد.

ماژول RFID  برد آردوینو Arduino
MFRC522 Uno / 101 Mega Nano v3 Leonardo / Micro Pro Micro Yun [۴] Due
Signal Pin Pin Pin Pin Pin Pin Pin Pin
RST/Reset RST ۹ [۱] ۵ [۱] D9 RESET / ICSP-5 RST Pin9 ۲۲ [۱]
SPI SS SDA [۳] ۱۰ [۲] ۵۳ [۲] D10 ۱۰ ۱۰ Pin10 ۲۳ [۲]
SPI MOSI MOSI ۱۱ / ICSP-4 ۵۱ D11 ICSP-4 ۱۶ ICSP4 SPI-4
SPI MISO MISO ۱۲ / ICSP-1 ۵۰ D12 ICSP-1 ۱۴ ICSP1 SPI-1
SPI SCK SCK ۱۳ / ICSP-3 ۵۲ D13 ICSP-3

 

همچنین برای بردهای ESP، نظیر wemos و بردهای Teensy، جدول اتصالات، مطابق آنچه که از رفرنس دریافت شده است، به شرح زیر می باشد.

ESP8266 Teensy
Wemos D1 mini ۲٫۰ ++ ۲٫۰ ۳٫۱
Signal Pin Pin Pin Pin
RST/Reset D3 ۷ ۴ ۹
SPI SS D8 ۰ ۲۰ ۱۰
SPI MOSI D7 ۲ ۲۲ ۱۱
SPI MISO D6 ۳ ۲۳ ۱۲
SPI SCK D5 ۱ ۲۱ ۱۳

پس از بررسی الزامات و نکات فنی، نوبت به تحلیل و بررسی توابع کلیدی کتابخانه می رسد. در قسمت بعدی به این موضوع می پردازیم.

 


توابع کلیدی کتابخانه


در این قسمت به بررسی توابع کلیدی کتابخانه MFRC522 می پردازیم. در رابطه با توابع، در نظر بگیرید که ورودی ها از سمت چپ به راست، به ترتیب شماره های یک، دو، سه و… را به خود اختصاص می دهند. به عبارت دیگر، منظور از ورودی اول سمت چپ ترین ورودی بوده و سایر ورودی ها از ۲ به بعد، به خود شماره اختصاص می دهند.

تابع ورودی ها شرح
MFRC522(byte chipSelectPin, byte resetPowerDownPin) ورودی اول جهت پایه CS

ورودی دوم پایه جهت ریست و یا مد کم مصرف ماژول RC522

این تابع، تابع سازنده کلاس ماژول RFID است. به کمک این تابع تنظیمات اولیه جهت برقراری ارتباط با ماژول RFID صورت می گیرد.  ورودی اول این تابع برای تعیین پایه CS برد اردوینو و ورودی دوم جهت تعیین پایه ریست و یا مد کم مصرف ماژول RFID است. البته می توانید این دو ورودی را خالی بگذارید.
void PCD_WriteRegister(PCD_Register reg, byte value) ورودی اول شماره رجیستر

ورودی دوم شماره از نوع بایت

به کمک این تابع می توانید در رجیسترهای ماژول RFID، داده را به طور مستقیم بنویسید. ورودی اول شماره رجیستر و ورودی دوم داده از نوع بایت است.
void PCD_Init(byte chipSelectPin, byte resetPowerDownPin) ورودی اول جهت تعیین پایه CS ارتباط SPI

ورودی دوم جهت تعیین پایه مخصوص ریست و خاموش سازی ماژول RFID

 

این تابع جهت راه اندازی اولیه و ارتباط با ماژول RFID به کار می رود. به کمک ورودی اول پایه CS و ورودی دوم ریست/خاموش سازی ماژول تنظیم می گردد. این تابع می تواند بدون ورودی نیز فراخوانی شود. همچنین این تابع تنها با قرار دادن ورودی دوم و خالی گذاشتن ورودی اول، قابل فراخوانی است.
void PCD_Reset(); بدون ورودی به کمک این تابع می توانید ماژول RFID را ریست کنید.
void PCD_AntennaOn(); بدون ورودی به کمک این تابع می توانید آنتن ماژول را فعال کنید.
void PCD_AntennaOff(); بدون ورودی به کمک این تابع می توانید آنتن را خاموش کنید.
byte PCD_GetAntennaGain(); بدون ورودی به کمک این تابع بهره کنونی آنتن را می توانید دریافت کنید. این بهره به صورت بایت در خروجی متابع ظاهر می گردد.
void PCD_SetAntennaGain(byte mask); ورودی از نوع بایت جهت تعیین بهره آنتن به کمک این تابع می توان بهره آنتن(قدرت سیگنال) آنتن ماژول را تعیین کرد. توجه داشته باشید که ورودی به صورت mask است. به عنوان مثال عبارت ۰x02<<4 تعیین کننده عدد ۸ است. بیشینه بهره نیز ۴۸ خواهد بود.
void PCD_SoftPowerDown(); بدون ورودی به کمک این تابع می توانید ماژول را خاموش کنید. این تابع در کاهش مصرف انرژی، نقش به سزایی دارد.
void PCD_SoftPowerUp(); بدون ورودی به کمک این تابع می توانید ماژول که در حالت خاموش قرار گرفته را روشن نمایید.
bool PICC_IsNewCardPresent() بدون ورودی با فراخوانی این تابع، چنانچه کارتی تشخیص داده شود، خروجی تابع true و در غیر اینصورت خروجی false خواهد بود.
bool MIFARE_SetUid(byte *newUid, byte uidSize, bool logErrors); ورودی اول جهت ID جدید

ورودی دوم سایز ID

ورودی سوم تعین لاگ خطا بر روی سریال

به کمک این تابع می توانید بر روی تگ و یا کارت RFID، ID نوشته و یا آیدی قبلی را تغییر دهید. ورودی اول ID، ورودی دوم سایز  ID است. ورودی سوم نیز در صورتیکه true باشد، لاگ خطا بر روی سریال مانیتور ایجاد می کند.
bool PICC_ReadCardSerial() بدون ورودی به کمک این تابع می توانید شماره ID کارت را بخوانید. در صورتیکه خواندن موفقیت آمیز باشد، خروجی true خواهد شد. این تابع id خوانده شده را در متغیر uidByte کلاس ذخیره می کند. توجه داشته باشید که قبل از این تابع، حتما تابع PICC_IsNewCardPresent فراخوانی شده باشد.

 


اجرای نمونه برنامه


در این قسمت به بررسی دو نمونه برنامه می پردازیم. برنامه نخست اطلاعات ID یک کارت را خوانده و نمایش می دهد. این برنامه را در زیر مشاهده می نمایید.

#include <SPI.h>  //فراخوانی کتابخانه SPI جهت ارتباط به MCR522
#include <MFRC522.h>   //فراخوانی کتابخانه MCR522
 
#define SS_PIN 10    //انتخاب پایه ۱۰ به عنوان چیپ سلکت ارتباط SPI
#define RST_PIN 9    //
MFRC522 mfrc522(SS_PIN, RST_PIN);   //ایجاد یک شی از کلاس کتابخانه RC522
 
void setup() 
{
  Serial.begin(9600);   
  SPI.begin();      // راه اندازی ارتباط SPI
  mfrc522.PCD_Init();   // راه اندازی ارتباط با ماژول RFID

}
void loop() 
{
 
  if ( ! mfrc522.PICC_IsNewCardPresent())    //بررسی وجود کارت در نزدیکی  ماژول چنانچه کارتی وجود نداشته باشد برنامه متوقف می شود
  {
    return;
  }
 
  if ( ! mfrc522.PICC_ReadCardSerial())      //خواندن اطلاعات کارت چنانچه خواندن موفقیت آمیز نباشد برنامه متوقف می شود.       
  {
    return;
  }
 //نمایش UID در سریال مانیتور
  Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {                   //توجه مقادیر کمتر از ۰x10 به عنوان خطا شناسایی شده و به جای آن صفر قرار می دهیم.
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");   //خواندن اطلاعات کارت از آرایه uidByte که در کلاس پیشتر تعریف شده در صورتیکه مقدار با خطا همراه باشد صفر قرار می  دهیم
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
}

 

در ادامه، به کمک برنامه زیر، مقدار UID کارت و یا تگ را تغییر می دهیم. از آنجاییکه با تغییر UID دیگر نمی توانید از کارت در دستگاه ها دیگر استفاده کنید، لذا از این رو دقت نظر لازم را در نظر داشته باشید.

#include <SPI.h>  //فراخوانی کتابخانه SPI
#include <MFRC522.h>  //فراخوانی کتابخانه MCR522
#define RST_PIN   9     // انتخاب پایه ریست جهت ریست ماژول در مواقع لزوم
#define SS_PIN    10    //انتخاب پایه چیپ سلکت ارتباط SPI
MFRC522 mfrc522(SS_PIN, RST_PIN);   // ساختن یک نمونه از کلاس کتابخانه و تعیین مقادیر
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}   //تعیین مقدار جدید UID جهت نوشتن بر روی کارت   
void setup() {
  Serial.begin(9600);  
  delay(1000);
  SPI.begin();         // راه اندازی باس spi
  mfrc522.PCD_Init();  //راه اندازی اولیه ماژول RFID
  Serial.println(F("change RFID UID "));
  Serial.flush();
}

void loop() {
 byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {   //نوشتن ID جدید در کارت
  Serial.println("Wrote new UID to card.");
  Serial.flush();
  }
 delay(1000);
}

 


لوازم متناسب با کتابخانه



جمع بندی


در این آموزش به تحلیل و بررسی کتابخانه RFID ماژول MFRC522 پرداختیم. ماژولMCRF522 یک ماژول فوق العاده کاربردی در پروژه های مبتنی بر فناوری RFID است. به کمک این ماژول می توانید کارت های RFID مطابق با فرکانس کاری ماژول را بخوانید. در کنار این می توانید بر روی کارت، UID جدید و دلخواه بنویسید. در این آموزش به تحلیل و بررسی توابع کلیدی این کتابخانه کاربردی پرداختیم. در ابتدا نحوه نصب آن را مورد بررسی قرار دادیم. سپس در ادامه بردهای مورد پشتیبانی و نحوه اتصالات را از نظر گذراندیم. پس از این مرحله، ضمن معرفی توابع کلیدی و کاربردی، به تشریح و نحوه استفاده از توابع پرداختیم. در نهایت با ارائه دو مثال از نحوه خواندن اطلاعات کارت و نوشتن UID بر روی آن، به بحث حاتمه می دهیم.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۵ دیدگاه

  • سلام وقت بخیر.
    برای دسترسی به تمامی توابع و آشنایی با کاربرد هرکدوم برای اینکه امکان استفاده راه تر از اونها باشه سایت یا منبعی رو معرفی کنید.
    ممنون

    • سلام
      در این آموزش سعی شده که کلیدی ترین توابع مورد تحلیل قرار گیرد. برای دسترسی به کلیه توابع، می بایست صفحه گیت هاب کتابخانه را بررسی کنید. برای بررسی صفحه گیت هاب کتابخانه روی لینک زیر کلیک کنید.
      لینک صفحه گیت هاب کتابخانه
      در این صفحه، فایل های اصلی کتابخانه در پوشه src قرار گرفته اند. در این پوشه، فایل ها با پسوند h. لیست کامل توابع را در خود قرار می دهند. همچنین در فایل ها با پسوند cpp. کدها و نحوه پیاده سازی توابع مشاهده می شود. چنانچه در این زمینه ابهامی وجود داشت، درکامنت بعدی مورد را مطرح نمایید.