مهندس موفق الکترونیک

پروژه ساخت قفل‌ درب RFID با آردوینو

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

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

RFID چیست؟

RFID خلاصه ‌شده‌ی عبارت Radio-Frequency Identification است. کاری که یک دیوایس RFID انجام می‌دهد، دقیقا مشابه همان کاری است که بارکد یا نوار مغناطیسی موجود در کارت‌های هوشمند یا عابر بانک‌ها انجام می‌دهد، فراهم کردن یک شناسه‌ی یکتا و منحصر به فرد برای آن کارت یا وسیله. و درست مانند همان بارکد یا نوار مغناطیسی، RFID هم برای آنکه بتواند آن اطلاعات شناسایی را رد و بدل کند، باید توسط یک گیرنده یا فرستنده اسکن شود.

در این پروژه از RFID به منظور خواندن اطلاعات یک RFID tag و ارسال آنها به حافظه‌ی غیرفرار میکروکنترلر استفاده می‌کنیم. ID که از تگ می‌خوانیم، با ID که از قبل در حافظه ذخیره شده است مقایسه می‌شود و بر اساس اینکه یکی هستند یا خیر، در باز می‌شود/ نمی‌شود.

قطعات سخت‌افزاری مورد نیاز

  • بورد Arduino Nano
  • RFID RC522
  • بازر پیزو الکتریک
  • دو عدد LED
  • دو عدد مقاومت ۳۳۰ اهم
  • کی پد ۴×۴
  • آداپتور I2C برای LCD
  • LCD 16×2 BL

نرم‌افزارهای مورد نیاز

  • Arduino IDE
  • SketchUp
  • دسترسی به صفحه‌ی گیت هاب پروژه (Github)

اگر قبلا از گیت‌هاب پروژه‌ دانلود نکردین پیشنهاد می‌کنم آموزش گیت‌هاب را مطالعه کنید.

وصل کردن LCD به بورد آردوینو

LCD دارای ۱۶ پایه است که برای اتصال به بورد Arduino Nano خیلی زیاد هستند. به همین علت است که حتما به آداپتور I2C نیاز داریم. با وجود آن می‌توانیم LCD را تنها با استفاده از سیگنال‌های دو پایه‌ی بورد آردوینو کنترل کنیم و مزیت این حالت این است که پایه‌های کمتری از میکروی ما درگیر LCD می‌شوند.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

پایه‌های LCD

اینترفیس LCDها به صورت موازی (parallel) است. به این معنا که میکروکنترلر باید همزمان چندین پایه را کنترل کند تا بتواند صفحه‌ی نمایشگر را در اختیار داشته باشد. در جدول زیر توضیحات مربوط به این پایه‌ها آمده است.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

مشخصات پایه‌ها

در قدم اول ارتباط بین LCD و آداپتور I2C را برقرار می‌کنیم. به این منظور از آداپتور LCD1602 استفاده می‌کنیم. این آداپتور نمایشگر LCD  که دارای ۲×۱۶ کاراکتر است، به یک Serial I2C LCD تبدیل می‌کند که میکروکنترلر برای کار کردن به آن تنها به دو سیگنال نیاز دارد.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

 ارتباط بین بورد آردوینو و LCD

در قدم بعدی باید کتابخانه‌ی «<LiquidCrystal_I2C.h>» را به Arduino IDE اضافه کنیم. این کتابخانه لوازم ارتباط بین آردوینو و LCD را فراهم می‌کند.

اگر این کتابخانه را در اختیار ندارید می‌توانید آن را از این لینک دانلود کنید.

برای اضافه کردن این کتابخانه به IDE، مراحل زیر را انجام دهید.

  1. ابتدا فایل‌های مورد نیاز را از صفحه‌ی گیت هاب پروژه دانلود کنید. (مثلا کتابخانه‌ی مربوط به کی پد و …)
مطلب پیشنهادی:  پروژه ساخت وندینگ با آردوینو (دستگاه‌های اتوماتیک فروش کالا )

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

  1. فولدرهای دانلود شده را zip کنید.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

  1. این فایل‌های zip. شده را در فولدر مربوط به آردوینو کپی کنید.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

  1. IDE را باز کنید و از طریق این مسیر فایل‌ها را اضافه کنید.

Sketch menu > Include Library > Add .ZIP Library

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

  1. و حالا از طریق این مسیر کتابخانه را اضافه کنید.

Sketch menu > Include Library > Keypad

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

کدی برای تست کردن اتصال LCD

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display
void setup() {
lcd.begin();// initialize the LCD
lcd.backlight();// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("Hello, world!");
}
void loop() {
}

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

وصل کردن کی پد

کی پد را به این منظور استفاده می‌کنیم که اعداد وارد شده از طریق آن را بر روی LCD نمایش دهیم.

برای این کار به کتابخانه‌ی Keypad.h نیاز داریم که به آردوینو اجازه می‌دهد داده‌های کی پد را که از نوع ماتریسی هستند، بخواند. کی پدی که ما در اینجا استفاده کرده‌ایم از نوع ۴×۴ است.

جدول زیر چگونگی اتصال بین پایه‌های کی پد و آردوینو را نشان می‌دهد. در واقع پایه‌های کی پد، به پایه‌های خروجی دیجیتال آردوینو متصل می‌شوند.

پین D6 را هم که یک پین PWM است به بازر وصل می‌کنیم.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

وصل کردن RFID

در این مرحله باید ماژول RFID را به مدار اضافه کنیم. ماژولی که ما در اینجا استفاده می‌کنیم، از پروتکل ارتباطی SPI استفاده می‌کند. در این ارتباط SPI، بورد آردوینو به عنوان Master و ماژول RFID به عنوان Slave عمل می‌کند. هم تگ و هم ریدر بر روی فرکانس 13.56MHz تنظیم شده‌اند.

همان طور که گفتیم، از ماژول RFID به این منظور استفاده می‌کنیم که ID کارت شناسایی را به کمک آن بخوانیم و آن را با ID که از قبل در EEPROM ذخیره شده است، مقایسه کنیم. در صورتی که یکی باشند، در باز می‌شود و بر روی LCD عبارت Unlocked نمایش داده می‌شود؛ در غیر این صورت عبارت Blocked را بر روی نمایشگر خواهیم دید.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

 اتصال بین بورد آردوینو، ماژول RFID و LCD

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

بورد آردوینو، ماژول RFID و LCD

اضافه کردن بازر و LEDها

برای کامل شدن سیستم باز کننده‌ی قفل، یک بازر و دو عدد LED را هم به مدار اضافه می‌کنیم. برای وصل کردن آنها از نمودار مداری عکس زیر استفاده کنید. نقش بازر را به این شکل تعیین می‌کنیم که هر زمان سیستم اجازه‌ی دسترسی داد (یعنی وضعیت Unlocked)، بازر به صدا درآید. LED قرمز رنگ در وضعیت بسته بودن در روشن است و LED سبز رنگ هم با باز شدن در روشن می‌شود.

ما در اینجا برای محافظت از سیستمی که طراحی کرده‌ایم، با استفاده از یک پرینتر سه بعدی یک جعبه طراحی می‌کنیم. اما اگر شما به چنین پرینتری دسترسی ندارید اصلا مهم نیست. از هر جعبه‌ی دیگری هم که در اختیار داشته باشید می‌توانید به این منظور استفاده کنید. خوبی استفاده از چنین جعبه‌ای این است که اجزاء مدار محافظت می‌شوند و تنها LEDها، LCD و کی پد در معرض عموم قرار می‌گیرند.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

نمودار مداری اتصال تمام قطعات مدار به یکدیگر: بورد آردوینو LCD ،Nano، کی پد، RFID و بازر

طراحی جعبه‌ی محافظ

اگر به پرینتر سه بعدی دسترسی دارید، خیلی خوب است که این جعبه‌ی محافظ را خودتان و متناسب با مدار طراحی کنید. به این ترتیب آن را از آسیب‌هایی مانند آلودگی و … حفظ خواهید کرد و طول عمر آن بیشتر می‌شود.

مطلب پیشنهادی:  راه اندازی سنسور آلتراسونیک با آردوینو

طراحی جعبه را با استفاده از نرم‌افزار SketchUp انجام می‌دهیم. این نرم‌افزار رابط کاربری بسیار ساده‌ای دارد و ابزارهای آن مانند Line ،Eraser و … توسط همه‌ی افراد قابل یادگیری و استفاده هستند.

ابعاد جعبه را ۱۲۰*۱۲۵*۳۷ میلی‌متر انتخاب می‌کنیم.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

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

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

 نمای بالایی جعبه

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

نمای پایینی جعبه

ضمن طراحی باید این موارد را در نظر بگیرید.

در قسمت بالای جعبه:

  • دو دریچه ۵.۲ میلی‌متری برای LEDها
  • یک دریچه ۷.۳×۴۲.۲ میلی‌متری برای LCD
  • یک دریچه ۱۰.۵×۱۶ میلی‌متری برای کابل

در قسمت پایینی جعبه:

  • یک دریچه ۱۰×۲۷ میلی‌متری برای کی پد

لازم به ذکر است که این اندازه‌گیری‌ها را بر اساس ابعاد قطعات مورد استفاده به دست آورده‌ایم تا جعبه اندازه‌ای کاملا متناسب و متوازن داشته باشید. شما می‌توانید ابعاد را به دلخواه  و بر حسب اندازه‌ی قطعات مورد استفاده‌ی خود تغییر دهید.

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

نمایی از جعبه‌ی محافظ پس از قرار گرفتن مدار طراحی شده در آن

دیاگرام کد

پروژه ساخت قفل‌کننده‌ی RFID با استفاده از آردوینو

کد مدار

#include <SPI.h>
#include <MFRC522.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include<EEPROM.h>


int relPin;
int state=0;
byte  COD[10];
byte  AUX[10];
int k=0;
String accessCode="*123456#";
String codpairing="*654321#";
//NFC
#define RST_PIN   9
#define SS_PIN 10   
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
MFRC522::MIFARE_Key key;


//LCD
LiquidCrystal_I2C  lcd(0x27,16,2);


//KEYPAD
const byte numRows= 4; //number of rows on the keypad
const byte numCols= 4; //number of columns on the keypad


char keymap[numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};


//Code that shows the the keypad connections to the arduino terminals
byte rowPins[numRows] = {2,3,4,5}; //Rows 0 to 3
byte colPins[numCols]= {A0,7,8,9}; //Columns 0 to 3


//initializes an instance of the Keypad class
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);


void setup() {
  pinMode(A0,OUTPUT);
  digitalWrite(A0,HIGH);
  pinMode(A3,OUTPUT);
  digitalWrite(A3,HIGH);
  pinMode(A1,OUTPUT);
  digitalWrite(A1,HIGH);
  pinMode(A2,OUTPUT);
  digitalWrite(A2,LOW);
  //NFC
  Serial.begin(9600);  // Initialize serial communications with the PC
  while (!Serial);  // Do nothing if no serial port is opened
  SPI.begin(); // Init SPI bus
 mfrc522.PCD_Init();     // Init MFRC522 card


 for (byte i = 0; i < 6; i++) {        
key.keyByte[i] = 0xFF;
 }
lcd.begin();
lcd.backlight();
lcd.setCursor(0,0);
lcd.clear();
lcd.print( "BLOCKED" );
}


void  readNFC(){   // This function will read the code stored on  
 for (byte i =0; i<(mfrc522.uid.size); i++) {  // the  UID
   COD[i]=mfrc522.uid.uidByte[i];
 }
 Serial.print("COD");
 Serial.print(COD[0]);
 Serial.print(COD[1]);
 Serial.print(COD[2]);
 Serial.print(COD[3]);
}


void pairNFC(){
 Serial.println("COD in pair");
 Serial.print(COD[0]);
 Serial.print(COD[1]);
 Serial.print(COD[2]);
 Serial.print(COD[3]);
  long  r=0;
  int c=0;
  for(int i=1;i<=EEPROM.read(0);i++){                       //The UID cannot be stored on
switch(i%4){                                                     // one variable, it was needed to be
      case 1 :{AUX[0]=EEPROM.read(i); break;}     // split
      case 2 :{AUX[1]=EEPROM.read(i); break;}
      case 3 :{AUX[2]=EEPROM.read(i); break;}
      case 0 :{AUX[3]=EEPROM.read(i); break;}
}
if((i)%4==0)
   {Serial.println(r);
    if( AUX[0]==COD[0] && AUX[1]==COD[1] && AUX[2]==COD[2] && AUX[3]==COD[3] ){                                      //Verify if the code is in EEPROM
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("CODE ALREADY IN");
         lcd.setCursor(0,1);
         lcd.print("SYSTEM");
      delay(2000);
          c=1;
      break;}
  }
  }


if(c==0){int aux2=EEPROM.read(0);
             Serial.println("CODE PAIRED");

Serial.print(COD[0]);
Serial.print(COD[1]);
Serial.print(COD[2]);
Serial.print(COD[3]);


         EEPROM.write(aux2+1,COD[0]);  //Writing code in EEPROM
         EEPROM.write(aux2+2,COD[1]);
         EEPROM.write(aux2+3,COD[2]);
         EEPROM.write(aux2+4,COD[3]);


         aux2=aux2+4; // Position for a new code
         Serial.println("aux2");
         Serial.println(aux2);
         EEPROM.write(0,0);
         EEPROM.write(0,aux2);    
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print("CODE PAIRED");
         delay(2000);}   
 }


boolean validationNFC(){
  boolean c=false;
  for(int i=1;i<=EEPROM.read(0);i++){   //Read the EEPROM
      switch(i%4){
      case 1 :{AUX[0]=EEPROM.read(i); break;}
      case 2 :{AUX[1]=EEPROM.read(i); break;}
      case 3 :{AUX[2]=EEPROM.read(i); break;}
      case 0 :{AUX[3]=EEPROM.read(i); break;}
    }
if((i)%4==0)
   {
    if( AUX[0]==COD[0] && AUX[1]==COD[1] && AUX[2]==COD[2] &&                AUX[3]==COD[3])
      c=true; //Verify if the code is in EEPROM and make flag=true;
     }
}       
  return c;  
}


int compareCODE(String a)    //We type a code on keypad and this will be compared
{ //with the accessCode;
 if(a.equals(accessCode))    
return 1;
 else if(a.equals(codpairing)) return 2;
 else return 0;  
}


String takeCode(char x) //Will display on the LCD the code typed
{ char vec[10];
 vec[0]=x;
 lcd.setCursor(0,0);
 lcd.clear();
 lcd.print('X');
 for(int i=1;i<8;i++)
    {vec[i]=myKeypad.waitForKey(); //Waits for 8 keys to be pressed and after that  
     lcd.print('X');} //is taking the decision
 vec[8]=NULL;
 String str(vec);
 return str;
}  


  void loop() {
  
  switch(state){
  case 0: {
    mfrc522.PCD_Init();
    if (  mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ){
   
    readNFC(); //It will read the card and it will search for UID in its
    if(validationNFC()) //memory
       { state=1;
        lcd.clear();
        lcd.setCursor(0,0);
lcd.print( "VALID NFC CODE" ); //The door will be opened
        delay(1000);
        return;
       }
    else{
         lcd.clear();
         lcd.setCursor(0,0);
         lcd.print( "INVALID NFC CODE" ) //If the code was wrongblocked
         delay(1000);
         lcd.setCursor(0,0);
         lcd.clear();
         lcd.print( "BLOCKED" );
         return;
        }
    }      


char c=myKeypad.getKey();
  if(c != NO_KEY){   

String codcurent=takeCode(c);
int A=compareCODE(codcurent);
  if(A==0){                                //A is a variable that stores the current code
   lcd.clear();
   lcd.print("INVALID CODE");
   delay(2000);
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print("BLOCKED");
   return;
}
  if(A==1){
lcd.setCursor(0,0);
     lcd.clear();
   lcd.print( "VALID CODE " );
delay(2000);
   state = 1;
   Return;
}
  if(A==2); {
state=2;
         lcd.clear();
         lcd.setCursor(0,0);
        lcd.print( " Pairing..." );
      delay(2000);
    return;}
  }
break;
   }


 case 1:{
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print( "UNLOCKED" );
    digitalWrite(A3,LOW);
    digitalWrite(A1,LOW); //The red LED will be off
    digitalWrite(A2,HIGH); //The green LED will be on
    tone(6,3000,5010); //The buzzer will make a sound
    delay(5000); //After 5 seconds the system will be blocked
    digitalWrite(A3,HIGH);
    digitalWrite(A1,HIGH);
    digitalWrite(A2,LOW);
    state=0;
    lcd.setCursor(0,0);
    lcd.clear();
    lcd.print( "BLOCKED" );
return;
    }


  case 2:{
   mfrc522.PCD_Init();
      if (  mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ){
      readNFC();
      pairNFC();
      state=0;
      delay(2000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print( "BLOCKED" );   }


break;
}
}
}

جمع‌بندی

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

  • بورد آردوینو و کتابخانه‌های آن
  • مفهوم EEPROM
  • پروتکل های ارتباطی مانند SPI و I2C
مطلب پیشنهادی:  کنترل آردوینو با پایتون - کنترل LED در آردوینو به وسیله پایتون

پیشنهاد می‌کنیم که حتما قسمت دوم این پروژه جذاب را هم دنبال کنید. در قسمت بعد آموزش می‌دهیم که چگونه فرمان باز و بسته کردن در را از طریق یک تلفن همراه هوشمند صادر کنید.

امیدوارم مقاله «پروژه ساخت قفل‌ درب RFID با آردوینو » براتون مفید واقع شده باشه.

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

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

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

6 دیدگاه

  1. کد آردوینو با وجود دانلود کتابخانه ارور میده و آردوینو با خطا مواجه میشه

  2. لطفا کد رو در آردوینو verify کنید و خطاش رو برطرف کنید

  3. سید امیر حسین حسینی

    سلام برای حذف کی پد و استفاده از پوش باتون برای ذخیره کارت یا حذف کارت از ایپیرام . کد چه تغییراتی میکنه؟

  4. سید امیر حسین حسینی

    کارتی رو که ذخیره میکنه نمیتونه شناسایی کنه

  5. سلام وقت بخیر
    همه مراحل رو انجام دادم به اررور
    Lcd begain می ده
    نمی دونم چرا

  6. می شود با انو امتحان کرد به جای نانو