MFRC-522 RFID অ্যাক্সেস কন্ট্রোল ডিভাইস

আগের দুটি ভিন্ন ভিন্ন টিউটোরিয়ালে আমরা ১২৫ কিলোহার্জ আরএফআইডি রিডার ও কার্ডভিত্তিক একটি অ্যাটেনডেন্স লগার অ্যাক্সেস কন্ট্রোল ডিভাইস তৈরী করেছিলাম। কিন্তু আরএফআইডি ট্যাগ যে সবসময় ১২৫ কিলোহার্জের হবে তা নয়। ১৩.৫৬ কিলোহার্জের কার্ডও বাজারে পাওয়া যায়। এই টিউটোরিয়ালে আমরা ১৩.৫৬ মেগাহার্জের আরএফআইডি (যা MFRC-522 নামে পরিচিত ) দিয়ে একটি অ্যাক্সেস কন্ট্রোল ডিভাইস তৈরী করব। যেটা দিয়ে ১৩.৫৬ মেগাহার্জের যেকোনো আরএফআইডি ট্যাগের নাম্বার পড়া যাবে এবং শুধুমাত্র পূর্বনির্ধারিত কয়েকটি নাম্বারের কার্ড দেখালেই একটি ডোরলক খোলা যাবে।

প্রয়োজনীয় যন্ত্রপাতি পরিমান প্রোডাক্ট লিংক
Arduino UNO-R3 1 http://bit.ly/2KhV84M
MFRC-522 RFID Module 1 http://bit.ly/2KAX2NO
LCD Display 16X2 with Header 1 http://bit.ly/2wDHSWc
Breadboard 1 http://bit.ly/2IjyUPg
Male to male jumper 13 http://bit.ly/2IkA1hy
Male to female jumper 10 http://bit.ly/2rIu6w2
Variable resistor-103 1 http://bit.ly/2IefR9e
DC 12V Solenoid Electric Door Lock 1 http://bit.ly/2zNGl1z
12V Door Lock Driver 1 http://bit.ly/2nmGu2X
DC socket breakout board 1 http://bit.ly/2rEFk5f
12V 700mA Power Adapter 2 http://bit.ly/2IbMpog
Soldering iron 1 http://bit.ly/2tpXpF3
Solder lead 1 http://bit.ly/2K496f8

সার্কিটঃ

আরএফআইডি রিডারের সাথে প্রদত্ত হেডারটি রিডারের সাথে সল্ডার করে নিতে হবে। তারপর আরডুইনো এবং রিডারের মধ্যে এই কানেকশনটি সম্পন্ন করুন।

MFRC-522 RFID Module Arduino UNO-R3
RST 9
SDA 10
MOSI 11
MISO 12
SCK 13
3.3V 3.3V
GND GND

তারপর আরডুইনোর সাথে এলসিডির নিচের কানেকশনটি সম্পন্ন করতে হবে।

Arduino UNO- R3 LCD
GND VSS,K, 2nd pin of the POT
5V VDD,A, 1st pin of the POT
V0,3rd pin of the POT
GND RW
7 RS
6 E
5,4,3,2 D4,D5,D6,D7

ডোরলক ড্রাইভারের সাথে ডোরলক কানেক্ট করুন।

তারপর ড্রাইভারের সাথে আরডুইনোর কানেকশন দিন।

Arduino UNO-R3 Doorlock driver
8 SIG
GND GND

ডিসি সকেট ব্রেকআউট বোর্ডের সাথে ডোরলক ড্রাইভারের নিম্নলিখিত কানেকশনটি সম্পন্ন করুন।

Doorlock driver DC socket breakout board
12V VCC
GND GND

এবার ডিসি সকেট ব্রেকআউট বোর্ডে একটি ১২ ভোল্ট অ্যাডাপটার দিয়ে পাওয়ার দিন।

আরডুইনোতে পাওয়ার দেবার জন্য ইউএসবি কেবল দিয়ে ল্যাপটপের সাথে কানেক্ট করা যাবে অথবা অপর একটি ১২ ভোল্ট অ্যাডাপটার ব্যবহার করা যাবে। লক্ষ্য করুন, এই এক্সপেরিমেন্টে ডোরলক এবং আরডুইনোর পাওয়ার সোর্স আলাদা।

কোডঃ

প্রথমে এই লিংক থেকে MFRC-522 এর আরডুইনো লাইব্রেরি ডাউনলোড করুন এবং ইন্সটল করুন। তারপর নিচের কোডটি কম্পাইল করুন এবং আরডুইনোতে আপলোড করুন।

/*
 MFRC-522 RFID door lock
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 */

#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>

constexpr uint8_t RST_PIN = 9;     // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 10;     // Configurable, see typical pin layout above
int doorlock=8;
 
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key; 

// Init array that will store new NUID 
byte nuidPICC[4];
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() { 
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Please press");
  lcd.setCursor(0,1);
  lcd.print("your card");
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 
  pinMode(doorlock,OUTPUT);

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  Serial.println(F("This code scan the MIFARE Classsic NUID."));
  Serial.print(F("Using the following key:"));
//  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
 
void loop() {

  // Look for new cards
    if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

  if (rfid.uid.uidByte[0] != nuidPICC[0] || 
  rfid.uid.uidByte[1] != nuidPICC[1] || 
  rfid.uid.uidByte[2] != nuidPICC[2] || 
  rfid.uid.uidByte[3] != nuidPICC[3] ) {
  Serial.println(F("A new card has been detected."));

  //Store NUID into nuidPICC array
  for (byte i = 0; i < 4; i++) {
 nuidPICC[i] = rfid.uid.uidByte[i];
}
   
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    
    if(nuidPICC[0]==114&&nuidPICC[1]==8)
    {
    lcd.clear();
    lcd.print(nuidPICC[0]);
    lcd.print(" ");
    lcd.print(nuidPICC[1]);
    lcd.print(" ");
    lcd.print(nuidPICC[2]);
    lcd.print(" ");
    lcd.print(nuidPICC[3]);
    lcd.setCursor(0, 1);
    lcd.print("Hi Roboboy");
    Serial.print(F("Hi Roboboy"));
    digitalWrite(doorlock,HIGH);
    delay(3000);
    digitalWrite(doorlock,LOW);
    nuidPICC[0]=0;
    nuidPICC[1]=0;
    nuidPICC[2]=0;
    nuidPICC[3]=0;
    lcd.clear();
    lcd.print("Please press");
    lcd.setCursor(0,1);
    lcd.print("your card");
    }

   else if(nuidPICC[0]==121&&nuidPICC[1]==172)
    {
    lcd.clear();
    lcd.print(nuidPICC[0]);
    lcd.print(" ");
    lcd.print(nuidPICC[1]);
    lcd.print(" ");
    lcd.print(nuidPICC[2]);
    lcd.print(" ");
    lcd.print(nuidPICC[3]);
    lcd.setCursor(0, 1);
    lcd.print("Hello A.R");
    Serial.print(F("Hello A.R"));
    digitalWrite(doorlock,HIGH);
    delay(3000);
    digitalWrite(doorlock,LOW);
    nuidPICC[0]=0;
    nuidPICC[1]=0;
    nuidPICC[2]=0;
    nuidPICC[3]=0;
    lcd.clear();
    lcd.print("Please press");
    lcd.setCursor(0,1);
    lcd.print("your card");
    }

    else if(nuidPICC[0]==224&&nuidPICC[1]==252)
    {
    lcd.clear();
    lcd.print(nuidPICC[0]);
    lcd.print(" ");
    lcd.print(nuidPICC[1]);
    lcd.print(" ");
    lcd.print(nuidPICC[2]);
    lcd.print(" ");
    lcd.print(nuidPICC[3]);
    lcd.setCursor(0, 1);
    lcd.print("Welcome KBM");
    Serial.print(F("Welcome KBM"));
    digitalWrite(doorlock,HIGH);
    delay(3000);
    digitalWrite(doorlock,LOW);
    lcd.clear();
    lcd.print("Please press");
    lcd.setCursor(0,1);
    lcd.print("your card");
    nuidPICC[0]=0;
    nuidPICC[1]=0;
    nuidPICC[2]=0;
    nuidPICC[3]=0;
    }

    else if(nuidPICC[0]==32&&nuidPICC[1]==253)
    {
    lcd.clear();
    lcd.print(nuidPICC[0]);
    lcd.print(" ");
    lcd.print(nuidPICC[1]);
    lcd.print(" ");
    lcd.print(nuidPICC[2]);
    lcd.print(" ");
    lcd.print(nuidPICC[3]);
    lcd.setCursor(0, 1);
    lcd.print("Hiya Jack!");
    Serial.print(F("Hiya Jack!"));
    digitalWrite(doorlock,HIGH);
    delay(3000);
    digitalWrite(doorlock,LOW);
    lcd.clear();
    lcd.print("Please press");
    lcd.setCursor(0,1);
    lcd.print("your card");
    nuidPICC[0]=0;
    nuidPICC[1]=0;
    nuidPICC[2]=0;
    nuidPICC[3]=0;



    }

    
  }
  else Serial.println(F("Card read previously."));

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}


/**
 * Helper routine to dump a byte array as hex values to Serial. 
 */
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

/**
 * Helper routine to dump a byte array as dec values to Serial.
 */
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

আরএফআইডি ট্যাগের নাম্বার চারটি ভাগে এলসিডিতে প্রদর্শিত হবে। যেমনঃ 224 252 118 137. আমাদের কোড অনুসারে মোট চারটি নির্দিষ্ট কার্ডের নাম্বারের জন্য ডোরলকটি খুলবে। নাম্বারগুলো হচ্ছে 32 252 38 014, 114 08 119 137, 224 252 118 137 এবং 121 172 120 137। আমাদের কোডে nuidPICC[0] এবং nuidPICC[1] হল কার্ডের নাম্বারের প্রথম অংশ ও দ্বিতীয় অংশ। যেমন 224 252 118 137 নাম্বারের ক্ষেত্রে nuidPICC[0]=224 এবং nuidPICC[1]=252. nuidPICC[0] ও nuidPICC[1] ম্যাচ করিয়েই আমরা আমাদের ডোরলকটি খুলব। কাজেই কোডের এই ম্যাচিংয়ের অংশটি যার যার কার্ডের নাম্বার অনুযায়ী পরিবর্তন করে নিতে হবে। কোডে প্রদত্ত nuidPICC[0] ও nuidPICC[1] এর সাথে রিডারের সামনে ধরা কার্ডের nuidPICC[0] ও nuidPICC[1] ম্যাচ করলেই ডোরলক খুলবে।

অন্যান্য কার্ডের ক্ষেত্রে কার্ডের নাম্বার ঠিকই দেখাবে, কিন্তু লক খুলবে না।
আমাদের প্রদত্ত কোডে এলসিডির পাশাপাশি সিরিয়াল মনিটরের ডেটা দেখানোর ব্যবস্থা রাখা হয়েছে।

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.