بازشناسی با امواج رادیویی،RFID، یک تکنولوژی پیشرفته برای خواندن و نوشتن اطلاعات بهشکل بیسیم با استفاده از امواج رادیویی است. این تکنولوژی را میتوان نوع برتر بارکدها دانست؛ همان سیستم خواندن و نوشتن با استفاده از بارکد، در RFID هم اتفاق میافتد اما بسیار سریعتر و با دقت بالاتر.
برای استفاده از این تکنولوژی باید از ماژول RFID Reader استفاده شود که ما در این مقاله نحوه راهاندازی آن را به شما شرح خواهیم داد.
تگRFID چیست؟
تگ RFID یکی از قطعات سیستم این تکنولوژی است که به یک جسم متصل میشود. جسمی که قصد شناسایی آن وجود دارد، توسط این تگ نشانهگذاری میشود تا بتوان آن را بهوسیله ماژول RFID Reader شناسایی کرد.
تگهای RFID به دو نوع اکتیو و پسیو تقسیم میشوند؛ تگ پسیو دارای یک میکروچیب و آنتن است و منبع تغذیه مستقل ندارد، درحالی که تگ اکتیو دارای منبع تغذیه مستقل است. توان مورد نیاز در تگ اکتیو از طریق باتری تامین میشود اما در تگ پسیو این توان از طریق ماژول در آن القا میشود.
تگها دارای میکروچیب و آنتن هستند؛ توان مورد نیاز از طریق آنتن داخل تگ تامین میشود و میکروچیب وظیفه انتقال اطلاعات را برعهده میگیرد. پس از آن RFID Reader این اطلاعات را از طریق سیگنال فرستادهشده توسط آنتن دریافت میکند.
درباره تگ RFID در مقاله تگ RFID چیست؟ بیشتر بخوانید.
ماژول RFID Reader چیست؟
بهتر است پیش از راهاندازی ماژول RFID Reader، با ساختار و عملکرد آن آشنا شوید. RFID Reader را میتوان مقر پردازش و مغز سیستم RFID درنظر گرفت. این ریدرها هستند که اطلاعات را دریافت، تحلیل و جسم را شناسایی میکنند.
ماژولهای RFID Reader هم معمولا به دو دسته سیار و ثابت تقسیم میشوند. استفاده از ریدرهای ثابت راحت است، تمام تجهیزات داخلشان قرار دارد و نیازی به وصل کامپیوتر آن بورد یا دستگاههای هوشمند بلوتوثی نیست.
معرفی ماژول RFID Reader RC522
ماژول RC522 یکی از مدلهای ماژول RFID است که شرکت NXP آن را طراحی و تولید کرده است. این ماژول براساس آیسی MFRC522 ساخته شده است و برای ارتباطات چندگانه در فرکانس بالا یا ۱۳.۵۶ مگاهرتز استفاده میشود.
ماژول RC522 یک ابزار ارزان، با مصرف پایین، سایز کوچک و بسیار کاربردی است که پرتکل SPI را هم پشتیبانی میکند. این موضوع باعث میشود تا این ماژول به راحتی با تمام میکروکنترلرها مانند آردوینو و رزبری کار کند.
خرید ماژول RFID با قابلیت خواندن و نوشتن RFID
ساختار ماژول RC522
این ماژول از سه قطعه اصلی تشکیل شده است و وظیفه خواندن و نوشتن دیتا را برعهده دارد. این سه قطعه MFRC522 IC، کریستال نوسانگر ۲۷.۱۲ مگاهرتزی و یک آنتن هستند.
RFID Reader Module
این قطعه وظیفه اصلی را انجام میدهد که خواندن و نوشتن اطلاعات است. این قطعه یک میدان الکترومغناطیسی با فرکانس ۱۳.۵۶ مگاهرتزی ایجاد میکند و با تگ RFID برای خواندن و نوشتن اطلاعات ارتباط میگیرد.
این ماژول RFID Reader میتواند با سرعت حداکثر ۱۰ مگابایت بر ثانیه، اطلاعات را انتقال دهد. میتوان برنامهای نوشت تا باعث شود ریدر در زمان نزدیک شدن کارت وقفهای ایجاد کند تا ماژول به ما اطلاع دهد.
ماژول ریدر در محدوده ولتاژ ۲.۵ تا ۳.۳ ولت کار میکند اما به دلیل این که ولتاژ قابل تحمل پایههای آن ۵ ولت است، میتوان این ماژول را به انواع دستگاهها مانند آردوینو متصل کرد.
MFRC522 IC
ماژول RC522 براساس این چیپ طراحی شده است و با فرکانس ۱۳.۵۶ مگاهرتزی و و وایرلس کار میکند. توان مصرفی پایین، بازده بالا، تراشه خواندن و نوشتن کوچک و قیمت پایینی دارد.
آی سی MFRC522 از انواع تگهای RFID مانند MIFARE 1k، MIFARE 4K، MIFARE Mini پشتیبانی میکند. این آیسی تا رنج ۵۰ میلیمتر قابلیت عملکرد دارد و باتوجه به سایز آنتن میتواند تا ۵۰ میلیمتر بهراحتی کار کند.
این آیسی SPI، UART و ارتباط 12C را پشتیبانی کرده و در ارتباط SPI، تا سرعت ۱۰ مگابیت برثانیه را پشتیبانی میکند. سرعت آن در ارتباطات 12C، در حالت سریع تا ۴۰۰ پالس در ثانیه و در حالت فوقسریع، تا ۳۴۰۰ پالس در ثانیه میرسد. در ارتباط نوع UART، حداکثر سرعت ۱۲۲۸.۸ پالس بر ثانیه است.
نوسانگر کریستالی ۲۷.۱۲ مگاهرتز
این نوسانگر یک کریستال کواترز است که به پینهای OSCIN و OSCOUT نوسانگر داخلی متصل میشود و با تشدید کردن یک کریستال، فرکانس دقیق ۲۷.۱۲ مگاهرتزی ایجاد میکند.
دقت فرکانس ایجادشده بهدلیل ثابت ماندن دمای تقریبی کریستال، بسیار بالاست. فرکانس ۱۳.۵۶ مگاهرتزی دقیقا نصف فرکانس ۲۷.۱۲ مگاهرتزی تولیدشده توسط کریستال است.
آنتن
آنتن درواقع از یک سیمپیچ NFC تشکیل شده است که در فرکانس ۱۳.۵۶ مگاهرتزی عمل میکند. توسط این سیمپیچ یک میدان الکترومغناطیسی ۱۳.۵۶ مگاهرتزی ایجاد میشود و با قرار گرفتن تگ RFID در محدوده این میدان، اطلاعات خوانده و نوشته میشود.
کارت RFID و جاسوییچی یا تگ RFID
این تگ RFID در محدوده ماژول RC522 قرار میگیرد و اطلاعات را به این ماژول میفرستد. این تگها فرستندههایی بدون باتری هستند و از یک آنتن و میکروچیپ ساخته شدهاند.
میکروچیپ وظیفه ذخیره و انتقال اطلاعات، و آنتن وظیفه ارسال اطلاعات به ماژولRFID Reader را دارد. ماژول RC522 سازگار با تگهای MIFARE 1K است که یک کیلوبایت حافظه برای ذخیره اطلاعات دارند.
ما نه تنها میتوانیم این کارتها را بخوانیم و اطلاعاتشان را دریافت کنیم، بلکه میتوانیم آنها را براساس ماژول RFID Reader RC522 برنامهنویسی کنیم.
پایههای ماژول RC522
ماژول RFID Reader RC5 هشت پین اصلی دارد که نقش خروجی را برعهده دارند.
پین Vcc: این پین درواقع پین منبع توان ماژول است؛ ماژول در رنج ۲.۵ تا ۳.۳ کار میکند. از طریق این پین میتوان ماژول را به خروجی ولتاژ ۳.۳ میکروکنترلرهایی مانند آردوینو وصل کرد.
پین RST: این پین وظیفه ریست کردن و خاموش کردن ماژول را برعهده دارد. اگر مقدار پین RST به Low برسد، ماژول خاموش شده، جریانهای داخلی ماژول قطع میشوند، نوسانگر از کار میافتد و تمام ارتباطات ماژول با دستگاههای خارجی قطع میشود.
پین GND: این پین، پین اتصال به زمین ماژول است؛ پین GND به پین گراند میکروکنترلر آردوینو وصل میشود.
پین IRQ: اگر یادتان باشد گفتیم که میتوان ماژول را برنامهریزی کرد تا درزمان نزدیک شدن یک تگ آرفید، وقفهای ایجاد کند و ما را مطلع سازد. آن وقفه با استفاده از این پین IRQ اتفاق میافتد. زمانیکه تگی به محدوده ماژول وارد میشود، این پین ماژول را بهکار میاندازد و پس از خارج شدن تگ از محدوده، ماژول را وارد اسلیپ مود میکند.
پین MISO/SCL/Tx: زمانیکه ارتباط SPI ماژول فعال باشد، این پین نقش یک MISO را ایفا میکند. با فعال بودن ارتباط 12C، پین بهعنوان یک SCL و در ارتباط UART، پین بهعنوان یک Tx عمل میکند.
پین MOSI: پین Master Out Slave In بوده که مخصوص ارتباطات SPI است.
پین SCK: این پین در ارتباط SPI، نقش دریافت کلاکهای تولیدشده توسط مستر را دارد.
پین SS/SDA/Rx: این پین در زمان ارتباطات SPI، به عنوان ورودی سریال یا SS، در زمان ارتباطات 12C به عنوان پین SDA و در زمان ارتباطات UART به عنوان پین Rx عمل میکند.
راهاندازی ماژول RC522 با آردوینو: قطعههای لازم
ما تا الان اطلاعات مورد نیازتان را راجعبه تکنولوژی RFID و ماژول RFID Reader در اختیارتان قرار دادهایم. الان میتوانید با این آموزش، ماژول RC522 خودتان را با استفاده از پروژه آردوینو راهاندازی کنید.
قطعات لازم برای راه اندازی ماژول RFID RC522 با آردوینو در لیست زیر قرار دارند:
- ماژول RFID Reader و RC522
- مقاومت ۲۲۰ اهم ۱.۴ وات
- ماژول آردوینو UNO
- سیم جامپر نری-نری و سیم جامپر نری-مادگی ۴۰ رشته
- کابل USB تایپ A به تایپ B
تمام این قطعات را میتوانید از فروشگاه جم ترونیک خریداری کنید.
راهاندازی ماژول RC522 با آردوینو: اتصال پایهها
پس از فراهم کردن قطعات مورد نیاز برای راه اندازی ماژول RFID RC522 با آردوینو، نوبت به وصل کردن پایهها و پینها میرسد. ما ویژگیها و وظایف هر پین را برایتان شرح دادیم و در ادامه نحوه اتصال آنها را آموزش خواهیم داد.
- پین Vcc را به خروجی ۳.۳ ولت آردوینو وصل کنید.
- پس از آن پین GND را پین زمین آردینو وصل کنید.
- پین RST را میتوانید به تمام پینهای آردوینو وصل کنید؛ بهعنوان مثال پین ۵.
- پین IRQ با توجه به کتابخانهای که استفاده میشود، ممکن است وصل نشود. برخی از کتابخانهها این پین را پشتیبانی نمیکنند.
- پین SS را هم میتوانید به هر پین غیر از پینهای SPI وصل کنید.
- در این مرحله باید پینهای SPI ماژول را به پینهای مرتبط سختافزاری در آردوینو وصل کنید. این کار سرعت عملکرد را بالاتر میبرد.
آردوینوهای مختلفی در بازار وجود دارد و در هر یک از آنها، پینهای SPI مختلفی وجود دارد. پین SPI مناسب را باید با توجه به مدل آردوینویی که تهیه کردهاید در دیتاشیت آن شناسایی کنید.
ما در جدول پایین، پینهای SPI سه نوع پرکاربرد آردوینو را برایتان آماده کردهایم. اگر از آدروینوهای دیگری استفاده میکنید، باید قبل از اتصال پینهای SPI، آنها را در آردوینو شناسایی کنید.
برد آردوینو UNO | برد آردوینو Mega | برد آردوینو Nano | |||
MOSI | 11 | 51 | 11 | ||
MISO | 12 | 50 | 12 | ||
Cs | 10 | 53 | 10 | ||
SCK | 13 | 52 | 13 | ||
راهاندازی ماژول RFID Reader RC522: کتابخانه آردوینو و کدنویسی
پس از اتمام اتصالها و تنظیمات سختافزاری، نوبت به تنظیمات نرمافزاری آردوینو و برنامهنویسی آن میرسد. برای این کار ما از کتابخانه آردوینو MFRC522 استفاده میکنیم که جزو کتابخانههای رسمی آردوینو نیست. میتوانید آن را از گیتهاب MFRC522 دانلود کنید.
برای نصب این کتابخانه میتوانید از IDE خود آردوینو استفاده کنید یا از مسیر
Sketch -> Include Library -> Add ZIP Library
استفاده کنید و فایل زیپ را در پوشه کتابخانههای آردوینو اکسترکت کنید.
کد ماژول RC522 در آردوینو
پس از نصب کتابخانه، بهتر است نوشتن اولین کدتان را شروع کنید. مثال DumpInfo را انتخاب کرده و شروع کنید. ما یک کد نمونه برایتان قرار دادهایم.
کد نمونه:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <SPI.h> #include <MFRC522.h> #define RST_PIN 5 // 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(115200); // Initialize serial communications with the PC while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4) SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 delay(4); // Optional delay. Some board do need more time after init to be ready, see Readme mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader details Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks...")); } void loop() { // 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; } // Dump debug info about the card; PICC_HaltA() is automatically called mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); |
توجه کنید که در این کد RST_PIN به پین 5 و SS_PIN به پین 10 قرار داده شده است. شما باید این مقادیر را باتوجه به آردوینوی خودتان تغییر دهید.
پس از اینکه کد را کامپایل کردید، آن را آپلود کنید. الان نوبت آزمایش درستی کد RFID رسیده است، تگ را به ماژولی که ساختهاید نزدیک تا تغییراتی که در سریال مانیتور ایجاد میشود را مشاهده کنید.
این اطلاعات شامل UID و SAK کارت، نوع PICC و تمام مموری مپهای کارت است. UID یا شناسه یونیک، برای هر تگ منحصربهفرد است. اگر خطایی راجعبه قطع ارتباط دریافت کردید، نرخ پالس یا Baud را در کدتان به ۱۱۵۲۰۰ تغییر دهید.
نوشتن اطلاعات روی تگ RFID
پس از اینکه اطلاعات تگ را با کمک ماژول RFID Reader بهدست آوردیم و خواندیم، نوبت به نوشتن آنها و اطلاعات دلخواهمان روی تگ آر اف آی دی میرسد. برای این منظور میتوانید از کد زیر استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
#include <SPI.h> //include the SPI library #include <MFRC522.h> //include the MFRC522 RFID reader library #define RST_PIN 5 //reset pin, which can be changed to another digital pin if needed. #define SS_PIN 10 //SS or the slave select pin, which can be changed to another digital pin if needed. MFRC522 mfrc522(SS_PIN, RST_PIN); // create a MFRC522 instant. MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named 'key' to hold the card information byte data1[14] = {"Circuit-Digest"}; //The first data that needs to be written to the tag. byte data2[12] = {"Jobit-Joseph"}; //The second data that needs to be written to the tag. byte readbackblock[18]; //Array for reading out a block. void setup() { Serial.begin(115200); // 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"); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; // Prepare the security key for the read and write operations. } } void loop() { // Look for new cards if not found rerun the loop function if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // read from the card if not found rerun the loop function if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.println("card detected. Writing data"); writeBlock(1, data1); //write data1 to the block 1 of the tag writeBlock(2, data2); //write data2 to the block 2 of the tag Serial.println("reading data from the tag"); readBlock(1, readbackblock); //read block 1 //print data Serial.print("read block 1: "); for (int j = 0 ; j < 14 ; j++) { Serial.write (readbackblock[j]); } Serial.println(""); readBlock(2, readbackblock); //read block 2 //print data Serial.print("read block 2: "); for (int j = 0 ; j < 12 ; j++) { Serial.write (readbackblock[j]); } Serial.println(""); //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));//uncomment below line if want to see the entire memory dump. } //Write specific block int writeBlock(int blockNumber, byte arrayAddress[]) { //check if the block number corresponds to data block or triler block, rtuen with error if it's trailer block. 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: Error"); return 2; } //authentication byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("Authentication failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return "3" as error message } //writing data to the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print("Data write failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return "4" as error message } Serial.print("Data written to block "); Serial.println(blockNumber); } //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("Authentication failed : "); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return "3" as error message } //reading data from the block byte buffersize = 18; 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("Data read failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return "4" as error message } Serial.println("Data read successfully"); } |
ما دوباره RST_PIN را به پین ۵ تغییر دادهایم، شما باید این مقدار را بر اساس پین RST در آردوینوی خودتان تعیین کنید.
پس از اینکه این کد را بهدرستی نوشته و آپلود کردید، سریال مانیتور را باز کنید. یک تگ را به ماژول نزدیک کنید تا اطلاعات را روی آن بنویسد و سپس آن را بخواند. تغییرات ایجاد شده در ماژول را مشاهده کنید.
توضیح کدهای نوشتهشده
در خطهای اولیه کد، با استفاده از دستور #include کتابخانههای ضروری را وارد کرده و با استفاده از دستور #define پینهای SS و RST را معرفی کردهایم.
از دستور // برای توضیحی راجع به یک بخش از کد استفاده میشود.
1 2 3 4 |
#include <SPI.h> //include the SPI library #include <MFRC522.h> //include the MFRC522 RFID reader library #define RST_PIN 5 //reset pin, which can be changed to another digital pin if needed. #define SS_PIN 10 //SS or the slave select pin, which can be changed to another digital pin if needed. |
در مرحله بعدی شیهایی را برای کتابخانه RFID Reader تعیین کردهایم و دیتاهای قابل نگارش را مشخص کردهایم. همچنین آرایهای برای ذخیره اطلاعات خواندهشده تعیین کردهایم.
1 2 3 4 5 |
MFRC522 mfrc522(SS_PIN, RST_PIN); // create a MFRC522 instant. MFRC522::MIFARE_Key key; //create a MIFARE_Key struct named 'key' to hold the card information byte data1[14] = {"Circuit-Digest"}; //The first data that needs to be written to the tag. byte data2[12] = {"Jobit-Joseph"}; //The second data that needs to be written to the tag. byte readbackblock[18]; //Array for reading out a block. |
در تابع setup، ارتباطات سریال با اجزای دیگر را و کتابخانه RFID Reader را توصیف کردهایم. همچنین به یک آرایه key مقدار صفر دادهایم که برای خواندن و نوشتن دیتا استفاده شود.
1 2 3 4 5 6 7 8 9 10 11 |
void setup() { Serial.begin(115200); // 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"); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; // Prepare the security key for the read and write operations. } } |
برای نوشتن اطلاعات روی تگ، از تابع writeblock استفاده میکنیم. برای این تابع دو پارامتر تعیین میشود؛ پارامتر اول نشاندهنده شماره بلوک و پارامتر دوم نشاندهنده متن پیام است.
هربار که این تابع را فراخوانی میکنیم، همخوانی داشتن شماره بلوک با بلوک دادهها یا بلوک تریلر را بررسی میکند. اگر به بلوک تریلر مطابقت داشته باشد، پیام خطا را مشاهده خواهید کرد. اگر این شماره با شماره بلوک دادهها مطابقت داشته باشد، به آن یک کلید امنیتی نسبت میدهد و آن را احراز هویت میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
int writeBlock(int blockNumber, byte arrayAddress[]) { //check if the block number corresponds to data block or triler block, rtuen with error if it's trailer block. 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: Error"); return 2; } //authentication byte status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print("Authentication failed: "); Serial.println(mfrc522.GetStatusCodeName(status)) return 3;//return "3" as error message } //writing data to the block status = mfrc522.MIFARE_Write(blockNumber, arrayAddress, 16); //status = mfrc522.MIFARE_Write(9, value1Block, 16); if (status != MFRC522::STATUS_OK) { Serial.print("Data write failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return "4" as error message } Serial.print("Data written to block "); Serial.println(blockNumber); } |
برای خواندن اطلاعات از روی تگ RFID، از تابع readblock استفاده میکنیم. این تابع همانند تابع نوشتن است و برای آن دو پارامتر تعیین میشود. در زمان فراخواندن تابع هم مشابه با تابع نگارش عمل میکند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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("Authentication failed : "); Serial.println(mfrc522.GetStatusCodeName(status)); return 3;//return "3" as error message } //reading data from the block byte buffersize = 18; 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("Data read failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); return 4;//return "4" as error message } Serial.println("Data read successfully"); |
در تابع loop، میکروکنترلر وجود یک تگ در زمان حال را بررسی میکند. اگر تگ موجود و قابل خواندن باشد، دو آرایه برای آن تگ خواهد نوشت و سپس آنها را خوانده و در سریال مانیتور پرینت خواهد کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
void loop() { // Look for new cards if not found rerun the loop function if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // read from the card if not found rerun the loop function if ( ! mfrc522.PICC_ReadCardSerial()) { return; } Serial.println("card detected. Writing data"); writeBlock(1, data1); //write data1 to the block 1 of the tag writeBlock(2, data2); //write data2 to the block 2 of the tag Serial.println("reading data from the tag"); readBlock(1, readbackblock); //read block 1 //print data Serial.print("read block 1: "); for (int j = 0 ; j < 14 ; j++) { Serial.write (readbackblock[j]); } Serial.println(""); readBlock(2, readbackblock); //read block 2 //print data Serial.print("read block 2: "); for (int j = 0 ; j < 12 ; j++) { Serial.write (readbackblock[j]); } Serial.println(""); //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));//uncomment below line if want to see the entire memory dump. } |
کد آردوینو برای روشن و خاموش کردن LED با RFID
این عملکرد کدی ساده دارد؛ ماژول RFID Reader بهدنبال تگهای موجود خواهد گشت و پس از پیدا کردن یک تگ، شناسه یونیک آن را خواهد خواند. در صورت تطابق این شناسه با شناسه موجود داخل کد، وضعیت چراغ را عوض خواهد کرد.
برای این کار از کد زیر استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 #define LED 8 byte readCard[4]; String tag_UID = "39C3BB99"; // Replace this with the UID of your tag!!! String tagID = ""; MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance void setup() { pinMode(LED, OUTPUT);// initialize digital pin LED_BUILTIN as an output. digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW Serial.begin(115200); // Initialize serial communications with the PC SPI.begin(); // SPI bus mfrc522.PCD_Init(); // Initialise MFRC522 } void loop() { //Wait until new tag is available while (readID() { if (tagID == tag_UID) { digitalWrite(LED, !digitalRead(LED)); // Turn on or off the onboard led } } } //Read new tag if available boolean readID() { //Check if a new tag is detected or not. If not return. if ( ! mfrc522.PICC_IsNewCardPresent()) { return false; } //Check if a new tag is readable or not. If not return. if ( ! mfrc522.PICC_ReadCardSerial()) { return false; } tagID = ""; // Read the 4 byte UID for ( uint8_t i = 0; i < 4; i++) { //readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Convert the UID to a single String } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading return true; } |
توضیح کد
ابتدا ما کتابخانهها ضروری را وارد کرده و متغیرهای عمومی را تعیین کردیم. در این بخش ما پین LED را به پین ۸ آردوینو متصل کردهایم. شناسه یونیک برای هر تگ متفاوت است و شما باید آن را با استفاده از Dumpinfo به دست آورید.
1 2 3 4 5 6 7 8 9 |
#include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define LED 8 byte readCard[4]; String tag_UID = "39C3BB99"; // Replace this with the UID of your tag!!! String tagID = ""; MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance |
در مرحله بعد تابع Setup را تعیین کرده و پین D8 را بهعنوان یک خروجی برای آن تعریف کنید. سپس مقدار منطقی اولیه آن را در حالت LOW قرار دهید. سپس به SPI و MFRC522 مقادیر مناسب را اطلاق کنید.
1 2 3 4 5 6 7 |
void setup() { pinMode(LED, OUTPUT);// initialize digital pin LED_BUILTIN as an output. digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW SPI.begin(); // SPI bus mfrc522.PCD_Init(); // Initialise MFRC522 } |
تابع readID برای دریافت UID از هر تگ بهکار میرود. این تابع وجود یک تگ را بررسی کرده و در صورت وجود، شناسه آن را میخواند. سپس این شناسه را در یک متغیر بهنام tagID ذخیره میکند. این تابع درصورت موفقیت مقدار True را برمیگرداند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
boolean readID() { //Check if a new tag is detected or not. If not return. if ( ! mfrc522.PICC_IsNewCardPresent() { return false; } //Check if a new tag is readable or not. If not return. if ( ! mfrc522.PICC_ReadCardSerial()) { return false; } tagID = ""; // Read the 4 byte UID for ( uint8_t i = 0; i < 4; i++) { //readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Convert the UID to a single String } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading return true; } |
در تابع loop، در بازههای زمانی مشخص وجود یک تگ قابل خواندن را بررسی میکند. اگر تگی را پیدا کرد، شناسه آن را خوانده و آن را با شناسه مورد نظرمان مطابقت میدهد. درصورت تطابق حالت پین LED را تغییر میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void loop() { //Wait until new tag is available while (readID()) { if (tagID == tag_UID) { digitalWrite(LED, !digitalRead(LED)); // Turn on or off the onboard led } } } |
جمعبندی
ما در این مقاله سعی کردیم راهنمایی جامع راجعبه ماژول RFID Reader و طریقه راهاندازی آن با آردوینو را برای شما فراهم کنیم. ساختار داخلی ماژول RFID Reader مدل RC522 را بررسی کردیم و سپس نحوه دقیق راهاندازی آن را شرح دادیم. با خواندن این مقاله خواهید توانست تا ماژول RC522 مختص خودتان را راهاندازی و استفاده کنید.
برای خرید مقاومت در انواع مختلف با بهترین قیمت کلیک کنید.
سلام میشه برای پروژه مستر کارت ایجاد کرد؟
بله میتونید با کمی دانش الکترونیک و مهندسی این پروژه رو راه اندازی کنید
سلام میشه با این سنسور یک پروژه ی قوی معرفی کنید