مشروع قفل الباب باستخدام RFID


مقدمة

سنقوم في هذه التجربة بتصميم قفل للباب يتم التحكم به بواسطة قارئ البطاقة بموجات الراديو RFID.

Radio-Frequency Identification (RFID): تحديد الهوية بموجات الراديو

يتم وضع البطاقة على القارئ فإذا كانت البطاقة متوافقة مع البطاقات المحفوظة في لوحة الأردوينو فإنه سيتم فتح الباب وتظهر عبارة (Access Granted) أي لقد منح السماح بالدخول على شاشة للعرض. بالإضافة إلى ذلك، سنستخدم حساس مسافة لمعرفة إذا ماكان الباب مفتوحًا أم مغلقًا.

قبل البدء بهذه التجربة يفضل معرفة طريقة عمل قارئ البطاقة وكيفية التعامل معه من خلال التجربة في الرابط التالي:

قارئ RFID

الأدوات المستخدمة

Screen Shot 2017 12 08 at 3.46.22 PM

الأداة العدد ملاحظات
أردوينو نانو 1
قارئ بطاقات MRFC522 1
حساس مسافة CNY70 1 يمكن استبداله بحساس الموجات فوق الصوتية
شاشة عرض 16×2 LCD 1
محرك سيرفو (Servo Motor) 1
لوحة توصيل 1
أسلاك توصيل حسب الحاجة

الجزء النظري

بداية سيكون لدينا بطاقة أساسية سوف نمررها على القارئ وسيعمل النظام بشكلٍ طبيعي. وإذا مررنا بطاقة أخرى على القارئ فإن النظام سيرفضها.

لإضافة بطاقة جديدة: نقوم بتمرير البطاقة الأساسية للدخول إلى نظام البرمجة، ثم نمرر البطاقة الجديدة لإضافتها إلى النظام.

لحذف بطاقة مضافة سابقًا: نقوم بتمرير البطاقة الأساسية للدخول إلى نظام البرمجة، ثم نمرر البطاقة الجديدة لحذفها من النظام.

وسيعمل قفل الباب تلقائيًا بمجرد أن يعود إلى مكانه الأساسي أي وضع الإغلاق، وهذا بسبب وجود حساس المسافة الذي يقيس المسافة ويقارنها بالمسافة في الكود البرمجي وعند تطابقهما سيقوم الحساس بتفعيل محرك Servo حتى يتم إغلاق قفل الباب.

خطوات التوصيل

Arduino RFID Door Lock Access Control Project

الكود البرمجي

نحتاج إلى تحميل المكتبات التالية ليعمل الكود بدون أخطاء:

قم بنسخ الكود ولصقه في برنامج الأردوينو وشاهد إنجازك !

الكود البرمجي

/*
* Arduino Door Lock Access Control Project
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN   9
#define SS_PIN    10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor
  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}
void loop() {
  int proximitySensor = analogRead(A0);
  // If door is closed...
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
      return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
      return;
    }
    tagID = "";
    // The MIFARE PICCs that we use have 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)); // Adds the 4 bytes in a single String variable
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA(); // Stop reading
    correctTag = false;
    // Checks whether the scanned tag is the master tag
    if (tagID == myTags[0]) {
      lcd.clear();
      lcd.print("Program mode:");
      lcd.setCursor(0, 1);
      lcd.print("Add/Remove Tag");
      while (!successRead) {
        successRead = getID();
        if ( successRead == true) {
          for (int i = 0; i < 100; i++) {
            if (tagID == myTags[i]) {
              myTags[i] = "";
              lcd.clear();
              lcd.setCursor(0, 0);
              lcd.print("  Tag Removed!");
              printNormalModeMessage();
              return;
            }
          }
          myTags[tagsCount] = strdup(tagID.c_str());
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("   Tag Added!");
          printNormalModeMessage();
          tagsCount++;
          return;
        }
      }
    }
    successRead = false;
    // Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  else {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" Door Opened!");
    while (!doorOpened) {
      proximitySensor = analogRead(A0);
      if (proximitySensor > 200) {
        doorOpened = true;
      }
    }
    doorOpened = false;
    delay(500);
    myServo.write(10); // Locks the door
    printNormalModeMessage();
  }
}
uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  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 1;
}
void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}

المصدر

مصدر التجربة

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *