اگر میخواهید راه اندازی ماژول RFID RC522 با آردوینو را یاد بگیرید، به جای درستی آمدهاید، زیرا با خواندن این مقاله به خواسته خود خواهید رسید.
حتما شما هم کمد باشگاهها و استخرهای قدیمی را که مجبور بودید با کلید در آن ها را باز کنید، به یاد میآورید. اما امروزه با تکنولوژی جدید، کلید و قفل دیگر معنایی ندارد. زیرا با تكنولوژی شناسایی با امواج راديويی كه به اختصار با نام RFID شناخته شده است، تنها کافی است کارت مربوط به کمد خود را جلوی یک چشمی نگه دارید و سپس در کمد را بهراحتی باز کنید! البته این تنها کارایی این ماژول نیست. اگر میخواهید راه اندازی ماژول RFID را آغاز کنید و با نحوه عملکرد آن بیشتر آشنا شوید، به خواندن این مقاله ادامه دهید.
تكنولوژی RFID چيست و چگونه كار میكند؟
سيستم RFID از دو بخش اصلی تشكيل شده است: يک تگ كه به شی يا وسيلهای كه قصد شناسايی آن را داريم، متصل میشود و يک دستگاه کدخوان (Reader/Writer) كه به نام پرسشگر-بازخوان (interrogator/Reader) نيز شناخته میشود.
کدخوان از يک ماژول فركانس راديويی و یک آنتن تشكيل شده است كه یک ميدان الكترومغناطيسی با فركانس بالا توليد میكند. از طرفی، تگ معمولا بهصورت يک المان غيرفعال (Passive) است، به اين معنا كه باتری ندارد. اما به جای باتری، يک ميكروچيپ و آنتن دارد. میکروچیپ اطلاعات را ذخيره و پردازش میكند و آنتن به منظور دريافت و ارسال سيگنال مورد استفاده قرار میگیرد.
برای خواندن اطلاعات كدگذاری شده يک تگ، لازم است آن را در نزديكی دستگاه کدخوان RFID قرار داد (البته لازم نيست كه در ديد مستقيم آن باشد). با این کار، دستگاه کدخوان يک ميدان الكترومغناطيسی توليد میكند. این میدان الکترومغناطیسی باعث عبور الكترونها از آنتن تگ میشود و به این شکل توان الكتريكی لازم را به چيپ تگ میدهد.
سپس، چيپ فعال شدهی تگ به عنوان پاسخ، اطلاعات ذخيره شده خود را از طريق يک سيگنال راديويی ديگر به کدخوان ارسال خواهد كرد. تغييرات ايجاد شده در موج الكترومغناطيسی با دستگاه کدخوان آشكار میشود و پس از تفسير آن، ديتای لازم به كامپيوتر يا يک ميكروكنترلر ارسال میشود.
مرور سخت افزاری – ماژول خواندن و نوشتن RFID RC522
پیش از راه اندازی ماژول RFID RC522 با آردوینو ، شما را با این ماژول و پین های آن آشنا خواهیم کرد.
ماژول RFID RC522 كه براساس تراشه MFRC522 ساخته شده، محصول شرکت NXP است و يكی از ارزان قيمتترين ابزارهای پيادهسازی RFID به حساب میآید. اين ماژول معمولا به همراه يک تگ كارتی و يک تگ سرکلیدی كه دارای حافظه يک كيلوبايتی است، ارائه میشود. اما بهترین ویژگی این ماژول، قابلیت نوشتن تگ آن است. زیرا با این قابلیت شما میتوانید پیامهای محرمانه خود را در آن ذخیره کنید.
ماژول RFID RC522 برای توليد ميدان الكترومغنايسی با فركانس 13.56MHz طراحی شده است و از میدان مغناطیسی تولید شده برای برقراری ارتباط با تگهای RFID استفاده میكند (براساس استاندارد تگ ISO 14443A ).
یکی دیگر از قابلیتهای این ماژول، امکان برقراری ارتباط با يک ميكروكنترلر از طريق SPI با 4 پين با سرعت حداكثر 10Mbps است. پشتیبانی پروتكل ارتباطی I2C و UART نيز از جمله امکانات این ماژول میباشد.
به علاوه، این ماژول دارای يک پين وقفه است که اهمیت بسیاری دارد. زیرا با اتصال این پین، دیگر لازم نیست دائما از ماژول RFID بپرسید كه “آيا كارتی در نزدیکی ماژول وجود دارد یا نه؟”. خود ماژول در زمانیكه يک كارت در مجاورت کدخوان قرار گرفته باشد، به شما اطلاع خواهد داد.
ولتاژ كاری ماژول بين 2.5 تا 3.3 ولت است، اما خوشبختانه پایههای آن تحمل ولتاژ 5 ولت را دارد. بنابراین، شما بهراحتی میتوانید آن را بدون نیاز به مبدل سطح ولتاژ، به آردوینو یا هر میکروکنترلری که با 5 ولت کار میکند، متصل کنید. مشخصات كامل این ماژول را میتوانید در جدول زیر مشاهده کنید:
رنج فركانسی | 13.56MHz ISM Band |
پروتکل ارتباطی | SPI / I2C / UART |
ولتاژ تغذيه | 2.5V to 3.3V |
ماكزيمم جريان كاری | 13-26mA |
مينيمم جريان كاری (جریان خاموشی) | 10µA |
منطق ورودیها | 5V Tolerant |
برد | 5cm |
پينهای ماژول RFID RC522
ماژول RFID RC522 دارای 8 پين خروجی است. این پینها را میتوانید در تصویر زیر ببینید:
پین Vcc توان الكتريكی ماژول را تامين میكند و اندازه ولتاژ آن میتواند بين 2.5 تا 3.3 ولت باشد. شما میتوانيد این پین را به خروجی 3.3 ولت آردوينو متصل كنيد. اما همیشه به یاد داشته باشید که اتصال این پین به 5 ولت به احتمال زیاد باعث خرابی ماژول شما میشود!
پین RST پين ورودی برای ريست و خاموش كردن ماژول است. هنگامیكه اين پين دارای مقدار منطقی Low باشد، خاموشی کامل اتفاق میافتد. در اين وضعيت همه مدارات داخلی از جمله اسيلاتور خاموش میشود. اما در لبه بالارونده، ماژول ريست خواهد شد.
پین GND پين زمين است و باید به زمين آردوينو متصل میشود.
پین IRQ پين وقفه است که با نزدیک شدن يک تگ RFID به ماژول، میکروکنترلر را مطلع میکند.
پین MISO/SCL/TX با فعال بودن ارتباط SPI به عنوان یک Master-In-Slave-Out عمل میکند و زمانیکه ارتباط I2C فعال باشد، به عنوان كلاک سريال عمل میكند. اگر ارتباط UART ماژول فعال شده باشد، اين پين به عنوان خروجی داده ارتباط سریال عمل میكند.
پین MOSI ورودی SPI به ماژول RC522 است.
پین SCK در ارتباط SPI، کلاکی را که توسط مستر تولید میشود، دریافت میکند.
پین SS / SDA / Rx با فعال بودن ارتباط SPI، به عنوان ورودی سيگنال عمل میكند. وقتی ارتباط I2C فعال باشد، به عنوان پین داده عمل میكند و وقتی ارتباط UART فعال باشد، به عنوان دریافت کننده داده عمل خواهد كرد. اين پين معمولا با يک مربع در اطراف آن علامتگذاری شده است. از اين علامت میتوان به عنوان مبنايی برای تشخيص ساير پينها استفاده کرد.
سيم كشی – راه اندازی ماژول RFID RC522 با آردوینو
اكنون كه اطلاعات لازم در مورد ماژول RFID را در اختيار داريم، زمان آموزش راه اندازی ماژول RFID RC522 با آردوینو فرا رسيده است. اما پیش از آن میتوانید قطعات لازم برای این پروژه را تهیه کنید:
- ماژول RFID RC522
- مقاومت 220 اهم 1.4
- ماژول آردوینو UNO
- سیم جامپر نری-نری 40 رشته
- سیم جامپر نری-مادگی 40 رشته
- کابل USB نوع A به نری نوع B
در مرحله اول، پين VCC و GND ماژول را به ترتيب به خروجی 3.3 ولت و زمين آردوينو سيم كشی کنید. پين RST ماژول را میتوانید به هر پين ديجيتال آردوينو متصل کنید. اما در اين پروژه، ما این پین را به پين شماره 5 متصل میكنيم.
پين IRQ را متصل نکنید، زیرا كتابخانه آردوينو كه قرار است در این پروژه استفاده کنیم، این پین را پشتيبانی نمیكند.
اكنون نوبت اتصال پينهای ارتباط SPI است. از آنجایی که ماژول RC522 ديتای زيادی ارسال میكند، برای افزايش كارايی، بهتر است آن را به پينهای سخت افزاری SPI آردوينو متصل کنید. زیرا سرعت این پینها بیشتر از پینهایی است که میتوانید به صورت نرم افزاری پیاده سازی کنید.
به یاد داشته باشید كه بردهای آردوينو ممكن است پينهای SPI مختلفی داشته باشند. به همین دلیل با توجه به نیاز خود باید در هر برد از پین های متفاوتی استفاده کنید. به عنوان مثال، پينهای ديجيتال برد آردوينو UNO/Nano V3.0 عبارتند از:
- 13 (SCK)
- 12 (MISO)
- 11 (MOSI)
- 10 (SS)
اما اگر از برد Mega استفاده میکنید، اين پينهای ديجيتال مسلما متفاوت خواهند بود! در این برد شما باید از پینهای دیجیتال زیر استفاده کنید:
- 50 (MISO)
- 51 (MOSI)
- 52 (SCK)
- 53 (SS)
در جدول زیر میتوانید پینهای ارتباط SPI را برای سه برد آردوینو مشاهده کنید:
CS | SCK | MISO | MOSI | |
10 | 13 | 12 | 11 | Arduino Uno |
10 | 13 | 12 | 11 | Arduino Nano |
53 | 52 | 50 | 51 | Arduino Mega |
درصورتیکه از برد آردوينوی ديگری استفاده میكنيد، لازم است شماره پينها را از دیتاشیت آن پیدا کنید و مطابق آن عمل نمایید.
زمانیکه همه اتصالات را انجام دادید، نوبت برنامه نویسی و بارگذاری کد بر روی آردوینو است.
كد آردوينو- خواندن تگ RFID
ارتباط با ماژول RFID RC522، کمی دشوار است، اما خوشبختانه کتابخانهای با نام RFID RC522 وجود دارد که خواندن و نوشتن تگهای RFID را آسان کرده است. البته شاید بد نباشد که بدانید این قابلیت را مدیون Miguel Balboa سازنده این کتابخانه هستیم.
برای دانلود این کتابخانه میتوانید به سایت GitHub repo مراجعه کنید یا تنها بر روی لینک زیر کلیک کنید:
و اما برای نصب این کتابخانه، ابتدا نرم افزار آردوینو را باز كنيد و به Sketch > Include Library > Add .ZIP Library برويد. سپس فايل rfid-master.zip را كه قبلا دانلود کردهاید، انتخاب كنيد.
زمانیکه کتابخانه را نصب کردید، از قسمت File>Examples>MFRC522 مثال DumpInfo را انتخاب كنيد.
اين مثال هيچ ديتايی بر روی تگ نمینويسد، بلکه به شما میگويد كه آيا موفق به خواندن تگ شده است يا نه و علاوه بر این اطلاعاتی راجع به آن نمايش میدهد. این مثال پیش از اینکه بخواهید از تگ جدیدی استفاده کنید، بسیار مفید است. در مرحله بعدی، به ابتدای كد برويد و مطمئن شويد كه RST_PIN بهدرستی مشخص شده باشد. در پروژه، ما از پين شماره 5 استفاده میکنیم، بنابراين آن را به 5 تغيير دهید.
پس از بررسی های لازم، كد را آپلود و سریال مانیتور را باز کنید. به محض اینکه تگ را به ماژول نزديک كنيد، به احتمال زیاد اطلاعاتی شبيه شكل زير دريافت خواهيد كرد. حواستان باشد پیش از نمایش کامل اطلاعات، تگ را تکان ندهید.
همه اطلاعات مفيد تگ از جمله شناسه يكتا یا Unique ID (UID) آن، اندازه حافظه و كل ديتای حافظه يک كيلوبايتی آن بر روی سریال مانیتور نمايش داده میشود.
لايههای حافظه كلاسيک يک كيلوبايتی MIFARE
حافظه 1K تگ به 16 سکتور (بخش) دسته بندی شده (بخشهای 0 تا 15) و هر سکتور نيز خود به 4 بلوک تقسيم شده است (بلوک 0 تا 3). هر بلوک توانايی ذخيره سازی 16 بايت ديتا را دارد ( از 0 تا 15). فرمول این تقسیم بندی به شکل زیر خواهد بود:
16 sectors x 4 blocks x 16 bytes of data = 1024 bytes = 1K memory
همانطور که در تصویر زیر مشاهده میکنید، كل حافظه يک كيلوبايتی به همراه بخشها، بلوکها و ديتا در تمامی قسمتهای رنگی مشخص شده است:
بلوک سوم هر سکتور Sector Trailer ناميده میشود و حاوی اطلاعاتی با نام Access Bits است که برای ایجاد قابلیت دسترسی خواندن و نوشتن ساير بلوکهای سکتور مورد استفاده قرار میگیرد. اين موضوع، بدين معنا است كه تنها سه بلوک هر سکتور (يعنی بلوک 0، 1 و 2) برای ذخيره سازی ديتا قابل استفاده هستند. بنابراين شما تنها 48 بايت از 64 بايت هر سکتور را برای ذخيرهسازی ديتا خواهید داشت. بهعلاوه، بلوک 0 سکتور 0 كه به نام Manufacturer Block/Manufacturer Data شناخته میشود، حاوی اطلاعات كارخانه سازنده IC و UID تگ است. این بلوک را میتوانید در قسمت رنگی تصویر زیر مشاهده کنید:
هشدار!
نوشتن ديتا بر روی بلوک Manufacturer کار خطرناکی است. زیرا ممکن است باعث بسته شدن دائمی كارت شود.
كد آردوينو- نوشتن تگ RFID
اگر با موفقیت اطلاعات تگ را خواندهاید، اکنون زمان انجام پروژه بعدی یعنی نوشتن اطلاعات دلخواه بر روی تگ RFID است.
ابتدا کد زیر را اجرا کنید:
#include <SPI.h> //include the SPI bus library
#include <MFRC522.h> //include the RFID reader library
#define SS_PIN 10 //slave select pin
#define RST_PIN 5 //reset pin
MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object.
MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named 'key', which will hold the card information
//this is the block number we will write into and then read.
int block=2;
byte blockcontent[16] = {"Last-Minute-Engg"}; //an array with 16 bytes to be written into one of the 64 card blocks is defined
//byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block.
//This array is used for reading out a block.
byte readbackblock[18];
void setup()
{
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device)
Serial.println("Scan a MIFARE Classic card");
// Prepare the security key for the read and write functions.
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library
}
}
void loop()
{
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
Serial.println("card selected");
//the blockcontent array is written into the card block
writeBlock(block, blockcontent);
//read the block back
readBlock(block, readbackblock);
//uncomment below line if you want to see the entire 1k memory with the block written into it.
//mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
//print the block contents
Serial.print("read block: ");
for (int j=0 ; j<16 ; j++)
{
Serial.write (readbackblock[j]);
}
Serial.println("");
}
//Write specific block
int writeBlock(int blockNumber, byte arrayAddress[])
{
//this makes sure that we only write into data blocks. Every 4th block is a trailer block for the access/security info.
int largestModulo4Number=blockNumber/4*4;
int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector
if (blockNumber > 2 && (blockNumber+1)%4 == 0){Serial.print(blockNumber);Serial.println(" is a trailer block:");return 2;}
Serial.print(blockNumber);
Serial.println(" is a data block:");
//authentication of the desired block for access
byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print("PCD_Authenticate() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return 3;//return "3" as error message
}
//writing the block
status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16);
//status = mfrc522.MIFARE_Write(9, value1Block, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_Write() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return 4;//return "4" as error message
}
Serial.println("block was written");
}
//Read specific block
int readBlock(int blockNumber, byte arrayAddress[])
{
int largestModulo4Number=blockNumber/4*4;
int trailerBlock=largestModulo4Number+3;//determine trailer block for the sector
//authentication of the desired block for access
byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print("PCD_Authenticate() failed (read): ");
Serial.println(mfrc522.GetStatusCodeName(status));
return 3;//return "3" as error message
}
//reading a block
byte buffersize = 18;//we need to define a variable with the read buffer size, since the MIFARE_Read method below needs a pointer to the variable that contains the size...
status = mfrc522.MIFARE_Read(blockNumber, arrayAddress, &buffersize);//&buffersize is a pointer to the buffersize variable; MIFARE_Read requires a pointer instead of just a number
if (status != MFRC522::STATUS_OK) {
Serial.print("MIFARE_read() failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
return 4;//return "4" as error message
}
Serial.println("block was read");
}
با اجرای این کد، خروجی آن بر روی سريال مانیتور به صورت زیر خواهد بود:
توضيح كد
اين كد با فراخوانی كتابخانههای MFRC522 و SPI آغاز میشود. سپس شماره پين آردوينو را كه ماژول RFID RC522 به آن متصل شده است، تعريف و شی مربوط به کدخوان را ایجاد میکند.
#include <SPI.h>//include the SPI bus library
#include <MFRC522.h>//include the RFID reader library
#define SS_PIN 10 //slave select pin
#define RST_PIN 5 //reset pin
MFRC522 mfrc522(SS_PIN, RST_PIN); // instatiate a MFRC522 reader object.
MFRC522::MIFARE_Key key;//create a MIFARE_Key struct named 'key', which will hold the card information
اكنون باید بلوكی كه میخواهید در آن ديتا ذخيره شود، تعریف کنید. در اين پروژه سکتور 0 بلوک 2 را انتخاب کنید. به یاد داشته باشید که هرگز بلوک 3 هيچ سكتوری را برای ذخيره سازی ديتا انتخاب نكنيد، زیرا نوشتن ديتا در بلوک ‘sector trailer’ ، این بلوک را غیر قابل استفاده میکند.
//this is the block number we will write into and then read.
int block=2;
در مرحله بعد، يک آرايه 16 بايتی به نام blockcontent[16] برای نگهداری پيام مورد نظر كه قصد ذخيره سازی آن را داريد، تعريف کنید. اما اگر به جای پیام، عدد صفر قرار دهید، بلوک مربوطه پاک خواهد شد.
byte blockcontent[16] = {"Last-Minute-Engg"}; //an array with 16 bytes to be written into one of the 64 card blocks is defined
//byte blockcontent[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //all zeros. This can be used to delete a block.
سپس، يک آرايه 18 بايتی به نام readbackblock[18] برای نوشتن و خواندن ديتا تعريف کنید. اما مگر نباید با توجه به مقدار حافظهای که برای خواندن پیام در نظر گرفتیم، یک آرایه 16 بایتی تعریف کنیم؟ خیر. دلیل این موضوع این است که در روش خواندن ديتا MIFARE_Read در كتابخانه MFRC522 به یک بافر با حداقل 18 بايت برای نگهداری 16 بايت يک بلوک نياز داریم.
//This array is used for reading out a block.
byte readbackblock[18];
در تابع Setup، ارتباط سريال با كامپيوتر و همچنين شی MFRC522 و كتابخانه SPI را راه اندازی کنید. برای امنيت خواندن و نوشتن ديتا باید از یک کلمه عبور استفاده کنید. در اينجا همه شش بايت كلمه رمز بهصورت 0xFF تنظیم شده است.
با توجه به اينكه كارتها نو هستند و قبلا رمزی برای آنها تعريف نشده، مقدار آنها 0xFF است. اما اگر کارتی در اختیار دارید که قبلا توسط فرد دیگری پروگرام شده است، باید رمز عبور آن را بدانید تا بتوانید به کارت دسترسی داشته باشید. به علاوه، پس از دسترسی به این رمز، باید آن را در ‘key’ ذخيره کنید.
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card (in case you wonder what PCD means: proximity coupling device)
Serial.println("Scan a MIFARE Classic card");
// Prepare the security key for the read and write functions.
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF; //keyByte is defined in the "MIFARE_Key" 'struct' definition in the .h file of the library
}
اما در تابع loop، ابتدا بفهمید آیا کارتی در نزدیکی کدخوان وجود دارد یا نه. اگر كارتی در نزدیکی کدخوان وجود داشت، از آن برای خواندن و نوشتن ديتا استفاده کنید.
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
Serial.println("card selected");
اكنون نوشتن ديتا بسيار ساده خواهد بود. كافی است تابع ()writeBlock را فراخوانی کنید. برای اين تابع باید دو پارامتر تعريف کنید، پارامتر اول شماره بلوكی است كه میخواهید در آن ديتا بنویسید و پارامتر دوم متن پيام مورد نظر شما خواهد بود.
//the blockcontent array is written into the card block
writeBlock(block, blockcontent);
برای اینکه مطمئن شوید ديتا به درستی در كارت نوشته شده است، میتوانيد با استفاده از تابع ()readBlock ديتا را مجددا از كارت بازخوانی كنيد. اين تابع نيز به دو پارامتر نياز دارد. يكی از پارامترها شماره بلوک و ديگری آرايهای برای ذخيره ديتای خوانده شده است. برای خواندن محتوای كل يک كيلوبايت حافظه نیز میتوانيد از تابع ()PICC_DumpToSerial استفاده كنيد.
//read the block back
readBlock(block, readbackblock);
//uncomment below line if you want to see the entire 1k memory with the block written into it.
//mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
در مرحله آخر، محتوای آرايه readbackblock را به كمک يک حلقه for بر روی سريال مانیتور پرينت کنید.
//print the block contents
Serial.print("read block: ");
for (int j=0 ; j<16 ; j++)
{
Serial.write (readbackblock[j]);
}
Serial.println("");
سيستم كنترل دسترسی قفل درب با استفاده از ماژول RFID RC522
علاوه بر پروژه راه اندازی ماژول RFID RC522 با آردوینو ، به شما نشان خواهیم داد که چگونه با استفاده از ماژول RFID RC522 یک سیستم کنترل دسترسی قفل درب بسازید. برای این پروژه به قطعات دیگری احتیاج خواهید داشت که لیست آنها را برای شما فراهم کردهایم:
در اين پروژه UI هر تگی كه به اندازه كافی به كد خوان RFID نزديک شده باشد، اسكن میشود. اگر اين ID با آن مقداری كه از پيش در حافظه آردوينو ذخيره شده است (Master tag)، مطابقت داشته باشد، به تگ مربوطه دسترسی لازم داده میشود. اما اگر تگ جدیدی را اسکن کنیم، امکان دسترسی به آن مسدود خواهد شد.
شمای این پروژه به شكل زير خواهد بود:
اين پروژه را میتوانید برای بازكردن درب، سوئيچ كردن يک رله، روشن كردن يک LED و يا هر كاربرد ديگری كه مد نظر شما است، بهكار بگیرید. اگر با ال سی دی كاراكتری 2×16 آشنایی ندارید، میتوانيد آموزش زیر را مطالعه کنید.
معرفی ماژول ال سی دی کاراکتر 2×16 و آموزش راه اندازی آن با آردوینو
پیش از اینکه به آپلود كد در آردوينو و اسكن تگها بپردازیم، بهتر است ابتدا نگاهی به مدار این پروژه بیاندازیم:
شما میتوانید طبق این تصویر، اتصالات لازم را انجام دهید. اما پس از آن، كد زیر را آپلود کنید.
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
String MasterTag = "20C3935E"; // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7)
void setup()
{
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
void loop()
{
//Wait until new tag is available
while (getID())
{
lcd.clear();
lcd.setCursor(0, 0);
if (tagID == MasterTag)
{
lcd.print(" Access Granted!");
// You can write any code here like opening doors, switching on a relay, lighting up an LED, or anything else you can think of.
}
else
{
lcd.print(" Access Denied!");
}
lcd.setCursor(0, 1);
lcd.print(" ID : ");
lcd.print(tagID);
delay(2000);
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
}
//Read new tag if available
boolean getID()
{
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return false;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return false;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
//readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return true;
}
اين کد بسیار ساده است. ابتدا باید كتابخانههای لازم را فراخوانی کنید. سپس، پينهای آردوينو و شیهای LCD و MFRC522 و همچنين master tag را تعریف کنید.
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
String MasterTag = "20C3935E"; // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7)
در تابع setup، شما باید ارتباط SPI، LCD و شی MFRC522 را مقداردهی اولیه کنید. در ادامه نیز، پيام خوشآمدگويی را بر روی صفحه LCD چاپ کنید.
void setup()
{
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
در تابع loop، منتظر بمانید تا تگ جديدی اسكن شود. پس از آنكه تگ جديدی پیدا شد، ID آن را با master tag مقايسه کنید. در صورتیکه ID این تگ جدید با master tag مطابقت داشته باشد، دسترسی لازم داده میشود، در غیر این صورت امکان دسترسی وجود نخواهد داشت.
void loop()
{
//Wait until new tag is available
while (getID())
{
lcd.clear();
lcd.setCursor(0, 0);
if (tagID == MasterTag)
{
lcd.print(" Access Granted!");
// You can write any code here like opening doors, switching on a relay, lighting up an LED, or anything else you can think of.
}
else
{
lcd.print(" Access Denied!");
}
lcd.setCursor(0, 1);
lcd.print(" ID : ");
lcd.print(tagID);
delay(2000);
lcd.clear();
lcd.print(" Access Control ");
lcd.setCursor(0, 1);
lcd.print("Scan Your Card>>");
}
}
یکی از بخشهای بسیار مهم در این پروژه، برنامه مربوط به تابع ()getID است. هنگامیكه این برنامه، كارت جديد را اسکن میکند، محتوای 4 بايتی UID داخل یک حلقه for به يک رشته به هم پيوسته تبديل میشود.
boolean getID()
{
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return false;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return false;
}
tagID = "";
for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
//readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Stop reading
return true;
}
با وجود اینکه راه اندازی ماژول RFID RC522 با آردوینو میتواند پیچیدگیهای خود را داشته باشد، اما به هر حال با رعایت نکات ضروری، میتوانید به خوبی از عهده این کار بر بیایید. البته همیشه به یاد داشته باشید که تلاش ما ارائه بهترین آموزشها بوده است. به همین دلیل اگر با مشکلی مواجه شدید، آن را با ما به اشتراک بگذارید تا بتوانیم در مسیر یادگیری همراه شما باشیم.
۵۴ دیدگاه. Leave new
سلام
کد اول، چرا وارنینگ میده؟؟؟
سلام دوست عزیز،
لطفا متن وارنینگ رو بهمون بدید تا بتونیم بررسی کنیم.
سلام
با خطا روبه رو شدم
قسمت خطا در خط آخر کد هستش مشکل چیه؟
سلام و درود خدمت شما
اگر کد رو صحیح و کامل کپی کنید، هیچ خطایی دریافت نمیکنید.
موفق باشید
سلام
چگونه باید رله را به کد ها اضافه کنم به طوری که با تشخیص کارت درست رله فعال بماند تا زمانی که یک کارت نادرست تشخیص داده شود
سلام علی عزیز،
برای اتصال رله، اول توجه کن که رله نباید مستقیما به آردوینو متصل بشه. بلکه پین آردوینو با یک مقاومت حدود ۱ کیلو اهم به بیس یک ترانزیستور مثل bc547 یا ۲n2222 وصل میشه و
بوبین (سیمپیچ) رله بین کلکتور ترانزیستور و ولتاژ تغذیه مثبت قرار میگیره. امیتر هم زمین میشه.
بهتره یک دیود هرزگرد هم موازی معکوس سیمپیچ قرار بدی تا ترانزیستور بر اثر انرژی ذخیره شده در سلف رله، در دراز مدت آسیب نبینه.
تغییرات کد بسیار سادهست. شما فقط کافیه در کد پروژهای که انتهای مقاله هست، داخل شرطی که صحیح بودن آی دی تگ رو بررسی میکنیم (خط ۳۸ کد)،
پایهای که به بیس ترانزیستور وصل کردی رو یک کنی و در قسمت else همین شرط، اون پایه رو صفر بکنی.
سلام ممنون از پشتیبانی خوب شما
من یک سوال دیگه داشتم اگه بخواهیم ۳ بار کارت اشتباه را اسکن کنیم دستگاه به مدت ۳۰ ثانیه قفل شود
خیلی سپاسگذارم
سلام مجدد، خواهش میکنم، انجام وظیفهست
باید یک متغیر تعریف کنی و مقدار اولیه رو صفر قرار بدی. داخل else متغیر رو یک واحد زیاد کنی تا تعداد اشتباهات رو بشماره.
بعدش هم با یک if مقدار متغیر رو بررسی کنی و اگر مساوی یا بزرگتر ۳ بود، ابتدا متغیر رو صفر کن، بعد از اون هم، یک تاخیر (delay) ۳۰ ثانیهای قرار بده.
بهتره توی شرط، وقتی کارت درست اسکن میشه هم متغیر رو صفر کنی تا فقط در صورتی قفل بشه که ۳ بار پشت سر هم کارت اشتباه نزدیک میشه.
با سلام
ضمن تشکر از برنامه های خوب و پشتیبانی عالی
ممکن هست که راه اندازی ماژول rc522 را با بسکام در سایت قرار بدین
سلام محمود عزیز،
خواهش میکنم، انجام وظیفه ست.
متاسفانه این موضوع رو در برنامه نداریم.
ببخشید من با example DumpInfo اومدم ماژولم رو امتحان کنم اما بعد اینکه کد رو زدم و کارت رو نزدیک اوردم هیچ اتفاقی نیوفتاد فکر میکنم مشکل از Firmware هست چون نوشته :
Firmware Version: 0x0 = (unknown)
WARNING: Communication failure, is the MFRC522 properly connected?
Scan PICC to see UID, SAK, type, and data blocks…
درضمن من از اردوینو MEGA2569 استفاده میکنم
سلام نیمای عزیز،
لطفا دوباره چک کن که در برنامه، RST_PIN و SS_PIN رو درست مطابق پینهایی که این پایهها رو متصل کردی، قرار بدی. همچنین پینهای SPI رو مطابق اطلاعات مقاله، برای آردوینو Mega متصل کرده باشی. از وصل بودن سیمها و محکم بودن اتصالات هم مطمئن شو.
سلام
وقتتون بخیر
ببخشید یه سوال داشتم
چه جوری میشه کارت های دیگری هم ذخیره کرد؟
سلام معین عزیز، وقت شما هم بخیر،
برای اینکه کد آخر با دو یا چند کارت کار کنه، باید ابتدا آی دی کارتها رو بخونیم و بعد برای هر یک از کارتها متغیر MasterTag رو تعریف کنیم و آی دی کارتها رو درونش بنویسیم
مثلا MasterTag1, MasterTag2
و در نهایت داخل شرط
if (tagID == MasterTag)
متغیر tagID رو با همه MasterTagها مقایسه و نتیجه رو OR کنیم.
به این شکل:
if ((tagID == MasterTag1)||(tagID == MasterTag2))
سلام خداقوت مهندس
واقعا مطلب خوبی بود
فقط یک سوال کد: byte readCard[4]
را چرا تعریف کردید ؟برای چی هست؟
ممنون میشم جواب بدید
سلام امیر حسین عزیز،
ممنون از شما
این متغیر برای تست و بررسی کد بوده، نیاز به تعریفش نیست.
sketch_oct۱۹b.ino:25:44: error: initializer-string for array of chars is too long [-fpermissiveسلاام. مهندس جان این اارور دلیلش چیه
سلام و درود به شما،
این ارور بیانگر اینه که مقدار اولیه داده شده به string طولانیه.
اگر بهمون بگی که ارور، مربوط به چه برنامهای و چه خطی از کد هست، بهتر میتونیم راهنمایی کنیم.
سلام
خیلی مفید بود ممنون.
یه سوال:
آیا میشه با همین روش و با استفاده از همین ماژول روی کارت بانکی هم کار کرد؟
سلام حسین عزیز،
خیر کارتهای بانکی معمولا از نوار مغناطیسی برای ذخیره اطلاعات استفاده میکنند که متفاوت از RFID هست.
سلام چطور میشه ماژول رله رو به پروژه وصل کرد و کدش چیه؟
سلام و درود به شما،
لطفا دو مقاله زیر رو مطالعه کنید:
https://roboeq.ir/blog/%D9%85%D8%A7%DA%98%D9%88%D9%84-%D8%B1%D9%84%D9%87-5-%D9%88%D9%84%D8%AA-%DB%8C%DA%A9-%D9%83%D8%A7%D9%86%D8%A7%D9%84%D9%87/
https://roboeq.ir/blog/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D9%85%D8%A7%DA%98%D9%88%D9%84-%D8%B1%D9%84%D9%87-5-%D9%88%D9%84%D8%AA-%D8%AF%D9%88-%DA%A9%D8%A7%D9%86%D8%A7%D9%84%D9%87/
سلام خسته نباشیدسوال مناینه چطور میتونیم به ماژول بگیم که اول کد تگ بخونه بعد با زدن دکمه اونو ذخیره کنه
حالا اونو قرارش بده با master از سری های بعد با نشون دادن تگ قفل ما باز بشه یعنی برای ماژول امکان ذره تگ جدید بدیم
میشه؟!
سلام و درود حسین عزیز،
لطفا پروژهای که در انتهای مقاله هست را مطالعه کن.
آیا میتوان uidتگ ها تغییر داد با همین ماژول
یا اونارو کپی کرد
چطوری؟
ممنون میشم توضیحی بدید
اگر تگی داشته باشی که قابلیت نوشتن uid داشته باشه میتونی با همین کتابخانه RFID RC522 ، روی آن بنویسی، اما همچین تگی تا جایی که ما اطلاع داریم به سختی در بازار قابل تهیه است.
با سلام و وقت بخیرممنون از اطلاعات خوبتون مشکل من این هستش که وقتی تگ رو نزدیک مازول میکنم چیزی در سریال مانیتور من نمایش نمیده یا اگر هم میده uid کارت نیست
Scan a MIFARE Classic card
Firmware Version: 0x0 = (unknown)
WARNING: Communication failure, is the MFRC522 properly connected?
Scan PICC to see UID, SAK, type, and data blocks…
فقط همین رو نمایش میده و گاهی اوقات هم هیچی نمایش نمیده .چراغ rc522 قرمز میشه کد هم اپلود میشه و درسته همه چی فقط تو نمایش مشکل دارم
سلام و درود برشما دوست عزیز
پیشنهاد میکنیم کد اول مقاله رو هم چک کنید. اگر اون کد هم جواب نداد احتمالا مشکل از اتصالات هست و اگر جواب داد امکان اینکه تگ شما با این کتابخانه سازگاری نداشته باشد وجود داره.
موفق باشید:)
سلام مجدد. دستور ذخیره کردن تگ چیه؟
سلام و درود فراوان
پیشنهاد ما به شما دوست عزیز مطالعهی دوباره این آموزش است، چراکه فرایند خواندن و نوشتن تگ را مرحله به مرحله برای شما عزیزان بصورت کاملا و دقیق توضیح دادهایم.
ممنونیم از همراهیتان
سلام مجدد
شما چه طور id تگ و کارت را خوانده اید؟ (در قسمت اضافه کردن ال سی دی کاراکتری)
سلام و درود برشما دوست عزیز
ID تگ رو در بخش اول مقاله تحت عنوان “خواندن تگ RFID” خوندیم و تصویری که از سریال مانیتور قرار دادیم هم میتونید ببینید که ID تگ نمایش داده شده:
Card UID: 20 C3 93 5E
سلام ممنون از آموزش خوبتون
من میخواستم از قسمت writeماژول استفاده کنم به این صورت که به جای اینکه بخوام کارت و متغیر تعریف کنم بیام و مقدار یک کارت رو بخونم و ذخیره کنم و همون رو روی کارت های دیگه write کنم، ممنون میشم راهنمایی کنید که آیا روی کارت های خود ماژول میشه اینکارو کرد یا باید کارت خام باشه و این به چه صورت میشه.
سلام و درود برشما حسین عزیز
متوجه منظورتون از “کارت خود ماژول” نشدیم. این ماژول صرفا انتقال اطلاعات رو انجام میده و خودش حافظه خاصی نداره.
سلام و عرض تشکر بابت مطلب خوبی که ارسال نمودید.
ماژول رله قرار دادم و قفل زبانه ای، ولی خطا میندازه و چراغ روی آردوینو، چشمک زن میشه و کلا هنگ میکنه با یه بار عمل کردن ولی بدون اتصال قفل زبانه ای درست عمل میکنه و رله قطع و وصل میشه…
پرسیدم… گفتن بخاطر ولتاژ برگشتی بوبین قفل زبانه ای هست… چیکار باید کرد برای رفع مشکل؟
درود برشما دوست عزیز
خوشحالیم بابت رضایت و همراهی شما 🙂
قفلهای زبانهای معمولاً جریان نسبتاً بالایی نیاز دارند، بنابراین اینکه تغذیه اونها رو چطور تامین میکنید مهم هست. برای مثال اگر تغذیه آردوینو و قفل رو یکی کردید باید توجه داشته باشید که جریان لحظهای بالای قفل در هنگام وصل شدن میتونه ولتاژ تغذیه رو کاهش بده و باعث ریست شدن آردوینو بشه.
بهترین روش این هست که تغذیه آردوینو و قفل کاملاً از هم ایزوله باشه یعنی این دو تغذیه به هم هیچ اتصالی نداشته باشند و حتیالامکان سیمهاشون با فاصله باشند. (حتی در زمین).
سلام وقتتون بخیر
بسیار عالی و قابل فهم
ان شاا… موفق و پیروز باشید.
در پناه خدا
سلام و درود برشما دوست عزیز
خوشحالیم که مطالب آکادمی برای شما سودمند بوده و بینهایت سپاسگذاریم بابت همراهیتون 🙂
سلام
ممنون بابت اموزش ها
میشه لطف کنید برای رله توی خط ۳۸ که توی یکی از نظر ها گفتید
هر طور میخام پایه رو مشخص کنم ارور میدهد میشود شما بگویید چی تایپ کنم
سلام و درود برشما علی عزیز
فرض کنیم شما میخواهید پایه دیجیتال شماره ۸ رو خروجی کنید و صفر و یکش کنید. برای این کار ابتدا داخل تابع setup این خط رو مینویسم تا این پایه خروجی بشه.
pinMode(8, OUTPUT);
سپس هر جایی بخواهیم این پایه رو ۱ کنیم مینویسیم
digitalWrite(8, HIGH);
و هر جا بخواهیم صفرش کنیم مینویسیم
digitalWrite(8, LOW);
سلام
ببخشید میشه اتصالات رو بگید به کدوم پین ها باید متصل شود؟
درود برشما دوست عزیز
نحوه برقراری اتصالات بطور کامل در مقاله توضیح داده شده و شما از تصویر شماتیک مدار (داخل مقاله) نیز میتوانید کمک بگیرید.
سلام ببخشید من هر کاری کردم ماژول عارف آیدیم یو آیدی تگ رو نخوند چیکار باید بکنم فرکانسها هم درسته
سلام و درود خدمت شما دوست عزیز
اگر که آموزش رو با دقت دنبال کردهاید و از اتصالات و آپلود صحیح کدتون اطمینان دارید احتمال داره که ماژول از تگ شما پشتیبانی نکنه.
سلام من میخواستم که به جای استفاده از پروتکل spi از i2c یا uart استفاده کنم چون هم راحت تره هم پین های مورد نیازش کم تره
حالا باید برای اینکار نحوه تعریف ابجکت رو تغییر بدم یا کد خاصی داره ؟
خواهشا برای هر دو پروتکل یعنی هم i2c و هم uart رو بگید
خیلی ممنون از سایت خوبتون
سلام علی عزیز
داخل این لینک اطلاعات مفیدی برای راهاندازی با uart و i2c موجود هست که می توانید از آن کمک بگیرید:
https://forum.arduino.cc/t/rc522-rfid-rc522-switching-spi-to-uart-interface-or-i2c-possible/425741/12
سلام وقتتون بخیر چطور می تونم شناسه چند تگ رو به RFID اضافه کنم ؟ کد دستوری یه تگ رو زدم ولی نمیدونم چطوری بهش اضافه کنم
byte readCard[4];
String MasterTag = “DAF7583”;
String tagID = “”;
این کد دستوری یکی از تگ هام هست می خوام B9EBD514 رو هم بهش اضافه کنم
سلام و درود فراوان خدمت شما حمید عزیز
آی دی هر تعداد تگی دارید رو به عنوان متغیر اضافه کنید. مثلا با نامهای MasterTag1، MasterTag2 و..
String MasterTag1 = “DAF7583”;
String MasterTag2 = ” B9EBD514”;
…
سپس داخل loop، آی دی تگ خوانده شده را با همه MasterTagها مقایسه میکنیم.
if ((tagID == MasterTag1) | (tagID == MasterTag2))
{
..
سلام و درود
ممنون از مطالب عالیتان
یک سئوال داشتم نحوه نوشتن در بلوک ۳ که فرمودید برای قابلیت خواندن و نوشتن بقیه بلوک هاست چگونه است
درود بر شما دوست عزیز
همانطور که داخل مقاله هم توضیح دادیم از بلوک ۳ نباید برای ذخیرهسازی دیتا استفاده شود. با این حال در توضیحات کد، ذکر کردیم که چطور بلوک ۲ انتخاب شده و به همین روال میتوانید بلوکهای دیگر را انتخاب کنید.
موفق باشید 🙂
سلام چطور میتونم ۲۴ عدد rc522 به میکرو وصل کنم و رید کنم؟ لطفا نمونه مٍثال بههم بدین ممنون
درود برشما دوست عزیز
چالش اصلی اتصال این تعداد ماژول، محدودیت تعداد پایه اردوینو است. میتونید با استفاده از مالتی پلکسر و شیفت رجیستر محدودیت پایهها رو حل کنید. در مورد برنامه هم در مثال ReadUidMultiReader همین کتابخانه، راهاندازی ۲ ماژول انجام شده. می توانید ازش ایده بگیرید و کد رو برای تعداد بیشتر اسکیل کنید.