MFRC-522 RFID অ্যাক্সেস কন্ট্রোল ডিভাইস
আগের দুটি ভিন্ন ভিন্ন টিউটোরিয়ালে আমরা ১২৫ কিলোহার্জ আরএফআইডি রিডার ও কার্ডভিত্তিক একটি অ্যাটেনডেন্স লগার ও অ্যাক্সেস কন্ট্রোল ডিভাইস তৈরী করেছিলাম। কিন্তু আরএফআইডি ট্যাগ যে সবসময় ১২৫ কিলোহার্জের হবে তা নয়। ১৩.৫৬ কিলোহার্জের কার্ডও বাজারে পাওয়া যায়। এই টিউটোরিয়ালে আমরা ১৩.৫৬ মেগাহার্জের আরএফআইডি (যা MFRC-522 নামে পরিচিত ) দিয়ে একটি অ্যাক্সেস কন্ট্রোল ডিভাইস তৈরী করব। যেটা দিয়ে ১৩.৫৬ মেগাহার্জের যেকোনো আরএফআইডি ট্যাগের নাম্বার পড়া যাবে এবং শুধুমাত্র পূর্বনির্ধারিত কয়েকটি নাম্বারের কার্ড দেখালেই একটি ডোরলক খোলা যাবে।
প্রয়োজনীয় যন্ত্রপাতি | পরিমান | প্রোডাক্ট লিংক |
Arduino UNO-R3 | 1 | এখানে ক্লিক করুন |
MFRC-522 RFID Module | 1 | এখানে ক্লিক করুন |
LCD Display 16X2 with Header | 1 | এখানে ক্লিক করুন |
Breadboard | 1 | এখানে ক্লিক করুন |
Male to male jumper | 13 | এখানে ক্লিক করুন |
Male to female jumper | 10 | এখানে ক্লিক করুন |
Variable resistor-103 | 1 | এখানে ক্লিক করুন |
DC 12V Solenoid Electric Door Lock | 1 | এখানে ক্লিক করুন |
12V Door Lock Driver | 1 | এখানে ক্লিক করুন |
DC socket breakout board | 1 | এখানে ক্লিক করুন |
12V 700mA Power Adapter | 2 | এখানে ক্লিক করুন |
Soldering iron | 1 | এখানে ক্লিক করুন |
Solder lead | 1 | এখানে ক্লিক করুন |
সার্কিটঃ
আরএফআইডি রিডারের সাথে প্রদত্ত হেডারটি রিডারের সাথে সল্ডার করে নিতে হবে। তারপর আরডুইনো এবং রিডারের মধ্যে এই কানেকশনটি সম্পন্ন করুন।
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] ম্যাচ করলেই ডোরলক খুলবে।
অন্যান্য কার্ডের ক্ষেত্রে কার্ডের নাম্বার ঠিকই দেখাবে, কিন্তু লক খুলবে না।
আমাদের প্রদত্ত কোডে এলসিডির পাশাপাশি সিরিয়াল মনিটরের ডেটা দেখানোর ব্যবস্থা রাখা হয়েছে।
Thank you. It was very helpful. Can anyone create me a code for 13.56khz and Node MCU 8266