آردوینو, پروژه آردوینو

راه اندازی ماژول RFID RC522 با آردوینو

راه اندازی ماژول RFID RC522 با آردوینو

آیا تابحال به این فکر کرده‌اید که سیستم‌های ضد سرقت نصب شده در فروشگاه‌ها چگونه کار می‌کنند؟ یا اینکه نحوه فعالیت سیستم‌های پرداخت هوشمند چگونه است؟ پاسخ به تمامی سؤالات این‌چنینی در کلمه RFID یا شناسه فرکانس رادیویی خلاصه می‌شود. همان‌طور که از نام این فناوری پیداست، RFID از امواج الکترومغناطیسی در فرکانس‌های رادیویی بهره می‌برد تا ارتباط برقرار و داده‌ها را دریافت کند. تگ‌های RFID در بسیاری از صنایع استفاده می‌شوند. از این تگ‌ها همچنین، می‌توان برای شناسایی افراد و ساخت سیستم‌های ضد سرقت سود برد. اینک در این پروژه از بلاگ بهنام رباتیک می‌خواهیم چگونگی راه اندازی ماژول RFID RC522 با آردوینو را به شما آموزش دهیم؛ پس با ما همراه باشید.

فهرست مطالب

لوازم مورد نیاز برای پروژه راه اندازی ماژول RFID RC522 با آردوینو

پین‌های ماژول RFID RC522

ماژول RC522 مجموعاً هشت پین دارد. این ماژول از پروتکل‌های ارتباطی مختلفی سود می‌برد و هر پین آنها نیز برای هر کدام از این پروتکل‌ها کاربرد خواهد داشت.

پین‌های ماژول RC522
پین‌های ماژول RC522
  • SDA (دیتا) و SCL (کلاک): پین‌های ارتباطی I2C
  • SS، SCK، MOSI و MISO: پین‌های ارتباطی I2C
  • RX و TX: پین‌های ارتباطی UART
  • IRQ: پین تداخل سیگنال از ماژول جهت شناسایی وجود تگ RFID
  • GND: پین اتصال به زمین
  • RST: پین ریست
  • VCC: پین منبع تغذیه

قسمت‌های مختلف ماژول RFID RC522

قسمت‌های مختلف ماژول RC522
قسمت‌های مختلف ماژول RC522

همان‌طور که در تصویر می‌بینید، ماژول RFID RC522 یک چیپ MFRC522 RFID دارد. فرکانس این چیپ با اسیلاتور پکیج 49S به 27.12 مگاهرتز می‌رسد. این بورد همچنین، دارای دو مدار فیلتر EMI و تطابق می‌باشد. به علاوه، یک آنتن PCB برای برقراری ارتباط و تأمین انرژی تگ استفاده شده است.

دیاگرام مدار ماژول RFID RC522

دیاگرام مدار ماژول RC522
دیاگرام مدار ماژول RC522

این مدار از حداقل قطعات لازم تشکیل شده است. همان‌طور که می‌دانید، مهمترین جزء این مدار چیپ MFRC522 است. سایر اجزاء نیز شامل فیلترهای EMI و مدار تطبیق‌دهنده می‌شوند.

RFID چگونه کار می‌کند؟

یک سیستم RFID دو بخش دارد؛ یکی خواننده RFID و دیگری تگ RFID. البته به این سیستم PCD یا PICC نیز می‌گویند.

قسمت خواننده تگ RFID یک آنتن دارد تا امواج فرکانس بالای EM را ارسال کند و از یک خواننده و گیرنده نیز بهره می‌برد. چیپ MFRC522 یک نمونه بارز از سیستمی است که توضیح دادیم. از آن جایی که ما داریم از امواج فرکانس بالا بر واحد مگاهرتز استفاده می‌کنیم، سایز آنتن باید کوچک باشد.

نحوه فعالیت ماژول RC522
نحوه فعالیت ماژول RC522

تگ RFID می‌تواند پسیو یا اکتیو باشد. تگ‌های اکتیو انرژی خود را از باتری و تگ‌های پسیو انرژی خود را از امواج EM دریافت می‌کنند. انواع مختلفی از این تگ‌ها در بازار وجود دارند که کارتی، جاکلیدی، دستبندی، برچسبی و . . . از آن جمله‌اند.

فرقی نمی‌کند که تگ RFID چه شکلی است زیرا در آن یک چیپ و یک آنتن مخصوص وجود دارد که داده‌ها را ذخیره می‌کند. زمانی که تگ در معرض پالس الکترومغناطیس ساطع شده از خواننده RFID قرار می‌گیرد، داده‌ها منتقل می‌شوند. سپس خواننده اطلاعات را آنالیز می‌کند تا تگ را بشناسد. بر خلاف یک بارکد یا کد QR، نیازی نیست که تگ حتماً زیر نور استفاده شود؛ از این رو، تگ‌های RFID در فضاهای بسته نیز به کار می‌روند.

آشنایی با ماژول RFID RC522

ماژول RFID RC522 مبتنی بر چیپ MFRC522 است. این ماژول قیمت پایینی داشته و توسط اکثر فروشگاه‌های قطعات الکترونیکی عرضه می‌شود. فرکانس این چیپ 13.56 مگاهرتز است و از تکنولوژی‌های ISO/IEC 14443 A/MIFARE و NTAG پشتیبانی می‌کند. ولتاژ کاری ماژول RC522 بین 2.5 تا 3.3 ولت است. البته علی‌رغم اینکه حداکثر ولتاژ مناسب برای این ماژول 3.3 ولت تعیین شده ولی پین مربوطه تا 5 ولت را نیز تحمل خواهد کرد بنابراین می‌توانید آن را مستقیماً به آردوینو وصل کنید.

ماژول RC522
ماژول RC522

چیپ MFRC522 از سه پروتکل ارتباطی مختلف پشتیبانی می‌کند:

  • SPI با سرعت 10 مگابیت بر ثانیه
  • I2C با سرعت 400 کیلو باد در حالت سریع و 3400 کیلو باد در حالت فوق سریع
  • RS232 Serial UART با سرعت 1228.8 کیلو باد

همراه با هر ماژول RC522 معمولاً یک کارت RFID و یک جاکلیدی به فروش می‌رسد و هر کدام از آنها نیز 1 کیلوبایت حافظه دارند. ما علاوه بر اینکه می‌توانیم اطلاعات موجود در این تگ‌ها را بخوانیم، امکان برنامه‌نویسی آنها با ماژول RC522 را نیز داریم.

سیم‌کشی مدار پروژه راه اندازی ماژول RFID RC522 با آردوینو

برای وصل کردن ماژول RC522 به آردوینو، از رابط SPI استفاده می‌کنیم. مطابق تصویر زیر پیش بروید و اتصالات را اینگونه انجام دهید.

سیم‌کشی مدار پروژه راه‌اندازی ماژول RFID RC522 با آردوینو
سیم‌کشی مدار پروژه راه‌اندازی ماژول RFID RC522 با آردوینو

پین‌های VCC و GND ماژول به ترتیب به پین‌های 3.3 ولت و GND آردوینو وصل شده‌اند. پین ریست نیز به پین D9 و در ادامه پین‌های SS، MOSI، MISO و SCK به ترتیب به پین‌های D10، D11، D12 و D13 آردوینو متصل هستند. ضمن اینکه پین‌های SS و RST نیز قابل تنظیم می‌باشند و می‌توان آنها را به هر پین دیجیتالی از آردوینو وصل کرد.

کدنویسی پروژه راه اندازی ماژول RFID RC522 با آردوینو

پس از برقراری اتصالات، به مرحله کدنویسی می‌رسیم. برای این کار، از کتابخانه MFRC522 آردوینو استفاده می‌کنیم. از آن جایی که این کتابخانه در مخزن کتابخانه‌های سایت این شرکت وجود ندارد، می‌بایست آن را از سایت‌های دیگر دانلود کنید. پس از دانلود، برای نصب این کتابخانه، دو راه دارید؛ یکی از مسیر Sketch> Include Library> Add ZIP Library و انتخاب فایل زیپ و یا خارج کردن کتابخانه از حالت فشرده در فولدر Library آردوینو.

زمانی که کتابخانه نصب شد، می‌توانیم آن را با یک کد آزمایشی تست کنیم. برای انجام این کار، مثال DumpInfo را از کتابخانه MFRC522 اجرا نمایید. کد آزمایشی را می‌توانید در ادامه ببینید.

				
					#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN         9          // 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));
}
				
			

زمانی که کد در نرم‌افزار Arduino IDE آپلود و اجرا شد، سریال مانیتور را باز کنید تا هر تگ نزدیک ماژول RC522 را ببینید. زمانی که تگ نزدیک ماژول می‌شود، خواننده اطلاعات آن را دریافت و سریال مانیتور نشان می‌دهد.

خروجی پروژه راه‌اندازی ماژول RFID RC522 با آردوینو
خروجی پروژه راه‌اندازی ماژول RFID RC522 با آردوینو

داده‌های پخش شده حاوی تمامی اطلاعات لازم در مورد کارت حاوی UID، Card SAK، نوع PICC و نقشه‌های حافظه‌ای است. UID یا شناسه منحصربفرد یک تگ به خصوص است. چنان‌چه شما در مسیر نزدیک کردن کارت به ماژول RC522 با خطا مواجه شدید، دلیل آن پایین بودن سرعت بادریت سریال می‌باشد. برای حل این مشکل، بادریت را در کدها به 115200 برسانید سپس خواهید دید که نوع PICC به 1 کیلوبایت MIFARE تغییر خواهد کرد. این یعنی تگ مدنظر ما یک چیپ MIFARE با مموری 1 کیلوبایتی دارد.

مرحله وارد کردن داده در تگ RFID در پروژه راه اندازی ماژول RFID RC522 با آردوینو

حالا که داده‌های پیش‌فرض تگ RFID را دستخوش تغییراتی کرده‌ایم، بد نیست ببینیم چگونه می‌توانیم در کارت داده وارد کنیم. برای انجام این کار، ابتدا کد زیر را وارد کنید.

				
					#include <SPI.h>      //include the SPI library
#include <MFRC522.h>  //include the MFRC522 RFID reader library
#define RST_PIN 9  //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");
}
				
			

وقتی کد وارد شد، سریال مانیتور را باز کنید. سپس یک تگ RFID را به نزدیک ماژول RC522 ببرید. در این مرحله، خودِ ماژول دو نوع داده را در تگ ایجاد کرده و بعد آنها را می‌خواند. در مرحله بعد، این داده‌ها در سریال مانیتور، به شکل تصویر زیر قابل مشاهده خواهند بود.

نوشتن داده در کارت RFID
نوشتن داده در کارت RFID

توضیحات کد پروژه راه اندازی ماژول RFID RC522 با آردوینو

در خطوط اول کدهای پروژه راه اندازی ماژول RFID RC522 با آردوینو، کتابخانه‌های لازم را گنجانده‌ایم و شاهد اسامی پین‌های ریست و SS هستیم. از آن جایی که داریم از پروتکل SPI استفاده می‌کنیم، کتابخانه SPI و سپس کتابخانه MFRC522 را برای خواننده RFID قرار داده‌ایم. پین‌های دیجیتالی و SS را می‌توان به هر پین دیجیتالی وصل کرد بنابراین کاربران می‌توانند مطابق نیاز خود، آنها را تغییر دهند.

				
					#include <SPI.h>      //include the SPI library
#include <MFRC522.h>  //include the MFRC522 RFID reader library
#define RST_PIN 9  //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 RC522 با آردوینو، برای کتابخانه، خواننده RFID هدف مشخص و داده‌های لازم برای نوشته شدن را اعلام کرده‌ایم. به علاوه، آرایه‌ای برای توقف داده‌های خوانده شده از تگ ایجاد شده است.

				
					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()، ارتباطات سریال، SPI و کتابخانه خواننده RFID را آورده‌ایم. به علاوه، برای فعالیت‌های خواندن و نوشتن، آرایه کلید را با داده‌های خالی حذف کرده‌ایم.

				
					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() است. زمانی که این تابع به کار می‌رود، عدد ارائه شده بررسی می‌گردد تا ببیند آیا با عدد موجود در حافظه همخوانی دارد یا خیر. سپس بلوک دیگری Access Bit را نگه می‌دارد تا دسترسی به بلوک‌های باقی مانده برای خواندن و نوشتن کنترل شود. برای مثال، بلوک شماره 3، یکی از همین موارد است.

اگر شماره بلوک داده شده با داده‌های بلوک همخوانی نداشته باشند، تابع خطا تشخیص خواهد داد. در سمت دیگر، اگر داده مسدود شده باشد، تابع تگ RFID را با یک کلید امنیتی تأیید می‌کند تا اگر تأییدیه موفقیت‌آمیز بود، داده در بلوک مربوطه ایجاد می‌شود.

				
					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 RC522 با آردوینو، از تابع readBlock() استفاده شده است. این تابع شبیه writeBlock() می‌باشد به طوری که وقتی به کار می‌رود، بلوک را به منظور تطبیق داده‌ها بررسی و سپس آن را تأیید می‌کند. چنان‌چه تأییدیه موفقیت‌آمیز بود، داده‌ها از تگ RFID خوانده خواهند شد.

				
					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 کدهای پروژه راه اندازی ماژول RFID RC522 با آردوینو، میکروکنترلر بررسی می‌کند که آیا تگ وجود دارد یا خیر. چنان‌چه تگ RFID وجود داشت و قابل خواندن بود، تابع مربوطه دو نوع آرایه داده‌ای را در تگ ایجاد می‌کند و سپس نتایج را در سریال مانیتور نشان می‌دهد.

				
					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 RC522 با آردوینو

برای روشن و خاموش کردن چراغ LED در پروژه راه اندازی ماژول RFID RC522 با آردوینو، مطابق تصویر زیر، یک چراغ LED را به پین D8 آردوینو و در کنار یک مقاومت محدودکننده قرار دهید.

خاموش و روشن کردن چراغ LED در پروژه راه‌اندازی ماژول RFID RC522 با آردوینو
خاموش و روشن کردن چراغ LED در پروژه راه‌اندازی ماژول RFID RC522 با آردوینو

کدهای لازم برای خاموش و روشن کردن چراغ LED در پروژه راه اندازی ماژول RFID RC522 با آردوینو

کدهای این بخش از پروژه راه اندازی ماژول RFID RC522 با آردوینو نیز بسیار ساده‌اند. خواننده تگ RFID بررسی می‌کند که آیا کارتی در محدوده وجود دارد یا خیر. اگر وجود داشت، خواننده UID را شناسایی می‌کند تا اگر با UID موجود در کد یکسان بود، آردوینو چراغ LED را روشن کند.

				
					#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;
  }
				
			

توضیحات کد این بخش از پروژه راه اندازی ماژول RFID RC522 با آردوینو

در ابتدا کتابخانه‌های مورد نیاز، متغیرهای لازم و یک مثال برای کتابخانه RFID ایجاد شده است.

				
					#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
				
			

در اینجا پین LED به پین D8 آردوینو وصل شده است. عبارت tag_UID برای هر تگ RFID منحصربفرد می‌باشد و معمولاً جای خود را به عدد شاخص هر کارت یا تگ می‌دهد. شما می‌توانید با استفاده از مثال DumpInfo، عدد شاخص هر تگ را به دست بیاورید.

در تابع setup()، پین D8 را به عنوان خروجی و حالت اولیه آن را روی LOW در نظر گرفته‌ایم. سپس ارتباط SPI و مثال MFRC522 را آغاز کرده‌ایم.

				
					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های تگ‌ها استفاده می‌شود. این تابع بررسی می‌کند که آیا تگ مجاز است یا خیر. سپس UID به یک رشته تبدیل می‌گردد و در یک متغیر به نام tagID ذخیره می‌گردد. در نهایت اگر فرآیند خواندن به‌درستی انجام شد، صحت تابع readID نمایش داده می‌شود.

				
					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، خودِ آردوینو به مرور زمان تگ مجاز و در دسترس را بررسی می‌کند. چنان‌چه تگ مجاز تشخیص داده شد و عدد UID با UID موجود مطابقت داشت، LED روشن خواهد شد.

				
					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
    }
  }
}
				
			

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *