سامانه شناسایی فرکانس رادیویی یا RFID (Radio Frequency Identification)، از میدانهای الکترومغناطیسی برای انتقال داده بصورت بیسیم استفاده میکند.
کاربردهای معمول RFID، گذرگاه ورودی برای ایمنسازی سایتها، ثبت کتاب در کتابخانه یا ردیابی اجزای تشکیلدهنده در یک فرآیند تولید میباشند. تگ های RFID پسیو تنها از یک آنتن و یک میکروتراشه تشکیل شدهاند که با نگه داشتن کارت RFID در مقابل نور سایه آنها قابل مشاهده است. برچسب یا تگهای RFID غیرفعال توسط میدان الکترومغناطیس کارتخوان RFID برای دریافت پیام از کارتخوان RFID و انتقال پیام به آن تغذیه میشوند.
ماژول کارت خوان MFRC522
کارت خوان RFID MFRC522 در فرکانس 13.56 مگاهرتز کار میکند و کارتها و برچسبهای بدون تماس MIFARE Classic (مایفر) را میخواند، که برای خواندن باید در فاصله 2 سانتیمتر از کارتخوان RFID باشد. کارت 1 کیلوبایت دارای حافظه داده 1024 است، با 16 بخش از 4 بلوک که هرکدام شامل 16 بایت داده است. ساختار بلوک 6 بایت برای داده یا کلید A و 4 بایت دسترسی و 6 بایت برای داده یا کلید B است. کارت 4 کیلوبایتی دارای حافظه داده 4096 بایت است، با 32 بخش از چهار بلوک، و 8 بخش از 16 بلوک که هرکدام شامل 16 بایت داده است. اولین بلوک یک کارت 1 یا 4 کیلوبایتی شامل موارد زیر است:
- شناسه منحصربفرد (UID) : ذخیره شده در 4 بایت بلوک 0
- کد هگز SAK: 08 و 18 برای MIFARE Classic
- نوع کارت مدار مجتمع مجاورتی (PICC) : MIFARE 1 یا 4 کیلو
کارت خوان RFID MFRC522 از باس ارتباط جانبی سریال (SPI) برای ارتباط استفاده میکند. SPI یک چارچوب کاری master- slave با سه خط دارد: master-out slave-in (MOSI)، master-in slave-out (MISO)، و کلاک سریال (SCK)، با یک خط انتخاب slave جداگانه (SS) برای هر دستگاه ( شکل 1 را مشاهده کنید).
تمامی دستگاهها دارای خطوط MOSI، MISO و SCK هستند، اما خط SS تعیین میکند کدام دستگاه با میکروکنترلر ارتباط برقرار کند. پایههای SPI آردوینو برای SS، MOSI، MISO و SCK 12،11،10 و 13 هستند. اگر بیش از یک دستگاه SPI وجود داشته باشد، میتوان از پایههای دیگر آردوینو به عنوان خط SS استفاده کرد. پایه SS در کارتخوان MFRC522 RFID برای داده سریال با SDA مشخص میشود و پایه وقفه (IRQ) به آردوینو متصل نمیشود. کارتخوان MFRC522 RFID باید بجای 5 ولت به 3.3 ولت متصل شود. در مقایسه با SPI، طرح باس I2C، از دو خط دو طرفه SCK و SDA استفاده میکند (شکل 2 را مشاهده کنید). میکروکنترلر با همه دستگاهها ارتباط برقرار میکند، اما این پیام آدرس دستگاهی است که باید با آن ارتباط برقرار شود، بهطوریکه فقط دستگاه مدنظر پاسخ میدهد. از آنجاییکه خطوط دو طرفه هستند، ارتباط I2C آهستهتر از ارتباط SPI است. هنگامیکه مقدار داده خروجی کم باشد مانند سنسورها از I2C استفاده میشود، درحالیکه ارتباط SPI برای حجم بالای داده بکاربرده میشود.
بین نامگذاری پایههای ماژولهای SPI تفاوتهایی وجود دارد، همانند CS یا SS یا LOAD، MOSI یا DATA یا DIN، و SCK یا CLK.
استفاده از کتابخانه MFRC522 طراحیشده توسط Miguel Balbao برای دستورات RFID پیشنهاد میشود. این کتابخانه در IDE آردوینو با از استفاده از روش سوم نصب میشود.
نمایش محتوای MIFARE Classic در رزولوشن 1k و 4k
اتصالات برای کارت خوان MFRC522 RFID در جدول 1 نشان داده شدهاند (شکل 3 را مشاهده کنید). کد دستورات برای نمایش محتوای یک کارت بدون تماس MIFARE Classic K 1 یا K 4 تنها به دستور mfrc522.PICC_DumpToSerial(&(mfrc522.uid)) نیاز دارد. مابقی دستورات اتصالات پایهها به آردوینو را مشخص میکند، سخت افزار را مقداردهی اولیه میکند و منتظر ارائه کارت بدون تماس به کارتخوان RFID میشود. اگر یک کارت بدون تماس ارائه و توسط کارتخوان RFID خوانده شدهباشد با دستوراتmfrc522.PICC_IsNewCardPresent() و mfrc522.PICC_ ReadCardSerial() مشخص میشود.
جدول 1 – اتصالات برای کارتخوان RFID
قطعه
|
متصل به
|
و متصل
|
---|---|---|
3.3 ولت کارت خوان RFID
|
3.3 ولت آردوینو
|
|
RST کارت خوان RFID
|
پایه 9 آردوینو
|
|
GND کارت خوان RFID
|
GND آردوینو
|
|
IRQ کارت خوان RFID
|
بدون اتصال
|
|
MISO کارت خوان RFID
|
پایه 12 آردوینو
|
|
MOSI کارت خوان RFID
|
پایه 11 آردوینو
|
|
SCK کار خوان RFID
|
پایه 13 آردوینو
|
|
SDA کارتخوان RFID
|
پایه 10 آردوینو
|
|
پایه بلند LED
|
پایه 3,4 آردوینو
|
|
پایه کوتاه LED
|
مقاومتهای 220 اهم
|
GND آردوینو
|
کد نمایش محتوای کارت بدون تماس مایفر ( MIFARE)
#include // include SPI library
#include // include MFRC522 library
int RSTpin = 9; // reset pin for MFRC522
int SDApin = 10; // serial data pin
MFRC522 mfrc522(SDApin, RSTpin); // associate mfrc522 with MFRC522 library
void setup()
{
Serial.begin(9600); // Serial output at 9600 baud
SPI.begin(); // initialise SPI bus
mfrc522.PCD_Init(); // initialise card reader
}
void loop()
{
if(!mfrc522.PICC_IsNewCardPresent()>0) return; // wait for a new card
if(!mfrc522.PICC_ReadCardSerial()>0) return; // read card content
mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); // print to Serial Monitor
}