آشنای با RFID و نحوه ی کار آن از مواردی است که در این قسمت به آن پرداخته می شود. همچنین با انجام یک پروژه سعی شده است تا مقداری از تابع های استفاده شده در کتابخانه ی RFID توضیح داده شود.
Rfid (Radio-Frequency Identification)
RFID (شناسایی مشخصات با فرکانس رادیویی) از امواج رادیویی برای خواندن و گرفتن اطلاعات استفاده می کند. این اطلاعات مشخصات خود کارت و یا داده هایی است که ما بر روی کارت ذخیره کرده ایم. تگها می توانند از فاصله ی کم خوانده شوند و لازم نیست که با ماژول تماس داشته باشند.
سیستم RFID از دو بخش تگ یا کارت و قسمت Reader تشکیل می شوند. یک فرسنده و یک گیرنده داخل تگ های RFID تعبیه شده است. تگ های RFID از دو جزء تشکیل شده اند:
- یک تراشه برای پردازش و ذخیره ی اطلاعات.
- یک آنتن برای دریافت و ارسال سیگنال.
هر تگ شامل یک سریال مخصوص به خود است که به آن UID گفته می شود.
برای خواندن اطلاعات کدگزاری شده در تگ، یک فرستنده گیرنده ی رادیویی دو طرفه سیگنالی را با استفاده از آنتن به تگ می فرستد. و اطلاعات داخل آن را می خواند.
دو نوع تگ RFID داریم، منفعل (Passive) و دارای باتری تغذیه. نوع منفعل از امواج رادیویی فرستنده برای باز پخش اطلاعات ذخیره شده استفاده می کند. تگ های باتری دار دارای یک باتری کوچک است که در آن تعبیه شده است، برای تامین انرژی بازگرداندن اطلاعات.
در این فیلم از ماژول RFID استفاده شده است. ولی آنچه که در بازار ایران یافت می شود ماژول MFRC522 می باشد. این ماژول قابلیت اتصال از طریق SPI, I2C, UART دارد. ولی در کتابخانه ی آن فقط ارتباط SPI قرار داده شده است.
MIFARE
نام یک برند تجاری است که IC های غیر تماسی برای خواندن و نوشتن داده را تولید می کند. MIFARE قابل اعتماد ترین فناوری در این زمینه می باشد. همچنین MIFARE تولید کننده اپلیکیشن NFC بر روی موبایل ها می باشد.
این کارت ها دارای حافظه هستند و می توان اطلاعاتی را بر روی این حافظه ذخیره کرد.
در تصویری که در زیر قرار گرفته می توانید مقدار حافظه ی این نوع کارت ها را در مدل های مختلف آن مشاهده کنید. همچنین مکان ذخیره کد اختصاصی هر کارت (UID) را نیز ببینید.
همانطور که در تصویر مشاهده می کنید برای MIFARE 1K تعداد 16 سکتور وجود دارد. هر سکتور خود دارای 4 بلاک است. و هر بلاک 16 بایت حافظه دارد. بلاک اول مشخصات خود کارت می باشد. هر سکتور از حافظه دارای یک کد دسترسی سه بایتی است که توسط دو کلید A و B محافظت می شن. این کد در چهارمین بلاک هر سکتور قرار داره.
پسورد پیشفرض تمام سکتور ها 0XFF می باشد. همانطور که در تصویرمی بینید آدرس هر بایت از هر بلاک هم داخل آن نوشته شده. اگر بخواهیم به هر بایت از هر بلاک این حافظه دسترسی پیدا کنیم باید از این آدرس استفاده کنیم.
شروع کار
نصب کتابخانه:
برای استفاده از RFID کتابخانه ی کاملی وجود دارد. پس زیاد به جزئیات ریز کار با آن نمی پردازیم. و فقط سعی می کنیم که توابع این کتابخانه را توضیح بدهیم.اول از همه این کتابخانه را باید نصب کنیم. بهتر است کتابخانه هایی که می خواهیم نصب کنیم، را از داخل خود نرم افزار آردوینو جستجو و نصب کنیم. هم آخرین ورژن آن را می توان نصب کرد. و هم اینکه دستور ها استاندارد و بدون اشکال می باشند.
برای دانلود به تب Sketch -> Include Library -> manage libraries میرویم. در صفحه ایکه باز می شود در قسمت بالای آن RC522 را جستجو می کنیم. بعد از انتخاب ورژن آنرا نصب می کنیم.
نصب پایه های RFID به آردوینو:
در تصویر بالا نشان داده شده است که کدام پایه را باید به کدام پین آردوینو Uno متصل کرد. دقت داشته باشید که این ماژول احتیاج به منبع تغذیه 3.3 ولت دارد.
در تصویر بعدی نحوه اتصال بار دیگر نشان داده شده است:
وقتی که این کتابخانه را نصب می کنید در فولدر آردوینو در قسمت Document کامپیوتر شما یک فولدر به اسم MFRC522 ایجاد می شود. کسایی که به زبان برنامه نویسی ++C آشنا هستند بد نیست که نگاهی به فایل های هدر و CPP این کتابخانه بیاندازند. هم با توابع آشنا می شوند و هم اینکه به چه صورتی کار می کنند. ولی چون قصد ما در اینجا آموزش زبان ++C نیست فقط به توضیحی از این توابع اکتفاء می کنیم.
در ضمن با نصب این کتابخانه مثال هایی از آن در قسمت Examples -> MFRC522 اضافه می شود که می توان از آنها هم استفاده کرد.
توضیح توابع:
اول از هم این نکته را گوش زد کنیم که متغییر هایی هم در این کتابخانه تعریف شده است و از آنها در برنامه ها استفاده می شود. پس از دیدن متغیر های عجیبی که در مثالها می بینید زیاد تعجب نکنید.
کلمه دیگری که در توابع زیاد استفاده شده است PCD می باشد که به تگهایی که حالت جاسوییچی داره می گویند.
از قسمت Example مثال Dumpinfo را باز کنید تا به بررسی خط به خط آن بپردازیم.
#include <SPI.h> #include <MFRC522.h>
اول از همه چون این ماژول با ارتباط SPI کار می کند کتابخانه ی آن را صدا زده.
بعد از آن کتابخانه ماژول MFRC522 را صدا زده است.
#define RST_PIN 9 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN);
در این جا به دو متغیر عدد ثابتی داده است. که یکی نشان می دهد از چه پینی می خواهیم برای پایه ی رست استفاده کنیم. و دیگری برای SS یا Select chip .
برای مطالعه ی بیشتر ارتباط SPI به این مطلب مراجعه کنید.
در خط آخر یک شئ برای این کلاس تعریف کرده ایم.
void setup() { Serial.begin(9600); while (!Serial); SPI.begin(); mfrc522.PCD_Init(); mfrc522.PCD_DumpVersionToSerial(); Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks...")); }
برای مطالعه ی بیشتر در مورد ارتباط سریال به این مطلب مراجعه کنید. فقط اینکه وقتی از حرف F در داخل این تابع استفاده می کنیم یعنی برای ذخیره ی موقت این رشته از فلش مموری استفاده کند.
تابع خط پنجم ماژول را نصب می کند.
خط بعدی ورژن ماژول مارا بر می گرداند. اگر ورژن ماژول مارا پیدا نکندیک اخطار به سریال می فرستد.
void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; }
این تابع وقتی که کارت جدید شناسایی کند عدد یک را بر می گرداند و اگر کارتی را شناسایی نکند عدد صفر . کلا این بخش برای این است که اگه کارتی را جلوی Reader نگه نداشته بودیم سراغ بقیه ی برنامه نرود.
if ( ! mfrc522.PICC_ReadCardSerial()) { return; }
این تابع اگر سریال کارت ما درست باشد عدد یک و در غیر ایصورت عدد صفر را بر می گرداند.
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
این تابع UID کارت ما و همچنین اگر در کارت ما داده ای هم ذخیره شده باشد آن را بر می گرداند. اگر می خواهیم اطلاعات داخل کارت را بطور کامل بخواند باید چند لحظه بیشتر کارت را جلوی ماژول نگه داریم.
PCD_PerformSelfTest();
این تابع ماژول را چک می کنه اگه عملکردش درست باشه یک و اگه نادرست صفر را بر می گرداند.
PICC_HaltA()
این تابع ماژول مارا به حالت خواب می برد.
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);</span> <span style="font-size: 10pt;">Serial.println(mfrc522.PICC_GetTypeName(piccType));
SAK:
Select Aknowledge وقتی ما دستوراتی را به ماژول می فرستیم بایتی به عنوان پاسخ به ما بر گردانده می شود. این دو تابع آن بایت را تفسیر می کند. یعنی وقتی ما از MIFARE 1KB استفاده می کنیم تابع اول عدد چهار را بر می گرداند و تابع دوم معادل آن را که MIFARE 1KB تعریف شده در کلاس، بر می گرداند.
در ادامه یک برنامه که با خواندن کارت یک LED را روشن می کند. و اگر جای LED از یک رله استفاده کنیم. می توانیم یک در باز کن بسازیم. قبل از استفاده باید UID کارت را در برنامه اضافه کنیم.
/* Produce By Sobhan Movassagh */ /* ElectronicZone.ir * یک برنامه ی ساده برای شناسایی کارت شما و باز کردن در * استفاده LED که به جای رله من از کرده ام */ #include <MFRC522.h> // Include of the RC522 Library #include <SPI.h> // Used for communication via SPI with the Module // WS2812 RGB Stick connection #define led_pin 5 #define SDAPIN 10 // RFID Module SDA Pin is connected to the UNO 10 Pin #define RESETPIN 8 // RFID Module RST Pin is connected to the UNO 8 Pin byte GoodTagSerialNumber[5] = {0xA0, 0xE7, 0x61, 0x1A}; // The Tag Serial number we are looking for int j=0; MFRC522 MyRFID_Card(SDAPIN, RESETPIN); // Init of the library using the UNO pins declared above void setup() { pinMode(led_pin, OUTPUT); // Set LED pin to an Output pin digitalWrite(led_pin, LOW); // LED Off at startup SPI.begin(); Serial.begin(115200); // Start to find an RFID Module Serial.println("Looking for RFID Reader"); MyRFID_Card.PCD_Init(); MyRFID_Card.PCD_DumpVersionToSerial();// Firmware version of the Module } void loop() { // Look for new cards if ( !MyRFID_Card.PICC_IsNewCardPresent()) { j++; delay(200); if (j==300){ digitalWrite(led_pin, LOW); j=0; } return; } // Select one of the cards if ( !MyRFID_Card.PICC_ReadCardSerial()) { Serial.println("Wrong Serial Number of Card"); return; } for(int i=0;i<4;i++){ if(GoodTagSerialNumber[i] != MyRFID_Card.uid.uidByte[i]){ Serial.println("Wrong Card"); digitalWrite(led_pin, LOW); break; } if(i == 3){ MyRFID_Card.PICC_DumpDetailsToSerial(&(MyRFID_Card.uid)); digitalWrite (led_pin , HIGH); delay(2000); } } } /* End of Code */
با اینکه این فیلم از ماژول RFID استفاده کرده است ولی طبق روال این سری آموزش ها آن را در سایت قرار می دهیم.
در ادامه می توانید فیلم آموزشی را مشاهده کنید:
ُسلامUID کارت رو چطور پیدا کنم و دقیقا در کجای برنامه قرار بدم؟؟؟
ُسلامUID کارت رو چطور پیدا کنم و دقیقا در کجای برنامه قرار بدم؟4444؟؟
سلام شما از این تابع استفاده کنید
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
وقتی کتابخانه را نصب کنید مثالهایی برای شما ایجاد می شود که در مطلب توضیح دادم از آنها استفاده کنید