حتما تا به حال برای شما هم پیش آمده است که کلیدهایتان را فراموش کنید و پشت در بمانید. پروژهای که در این جلسه با هم یاد میگیریم، میتواند ما را برای همیشه از مشکل پشت در ماندن خلاص کند. ساخت یک قفل امنیتی 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 میشوند.
پایههای LCD
اینترفیس LCDها به صورت موازی (parallel) است. به این معنا که میکروکنترلر باید همزمان چندین پایه را کنترل کند تا بتواند صفحهی نمایشگر را در اختیار داشته باشد. در جدول زیر توضیحات مربوط به این پایهها آمده است.
مشخصات پایهها
در قدم اول ارتباط بین LCD و آداپتور I2C را برقرار میکنیم. به این منظور از آداپتور LCD1602 استفاده میکنیم. این آداپتور نمایشگر LCD که دارای ۲×۱۶ کاراکتر است، به یک Serial I2C LCD تبدیل میکند که میکروکنترلر برای کار کردن به آن تنها به دو سیگنال نیاز دارد.
ارتباط بین بورد آردوینو و LCD
در قدم بعدی باید کتابخانهی «<LiquidCrystal_I2C.h>» را به Arduino IDE اضافه کنیم. این کتابخانه لوازم ارتباط بین آردوینو و LCD را فراهم میکند.
اگر این کتابخانه را در اختیار ندارید میتوانید آن را از این لینک دانلود کنید.
برای اضافه کردن این کتابخانه به IDE، مراحل زیر را انجام دهید.
- ابتدا فایلهای مورد نیاز را از صفحهی گیت هاب پروژه دانلود کنید. (مثلا کتابخانهی مربوط به کی پد و …)
- فولدرهای دانلود شده را zip کنید.
- این فایلهای zip. شده را در فولدر مربوط به آردوینو کپی کنید.
- IDE را باز کنید و از طریق این مسیر فایلها را اضافه کنید.
Sketch menu > Include Library > Add .ZIP Library
- و حالا از طریق این مسیر کتابخانه را اضافه کنید.
Sketch menu > Include Library > Keypad
کدی برای تست کردن اتصال 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() { }
وصل کردن کی پد
کی پد را به این منظور استفاده میکنیم که اعداد وارد شده از طریق آن را بر روی LCD نمایش دهیم.
برای این کار به کتابخانهی Keypad.h نیاز داریم که به آردوینو اجازه میدهد دادههای کی پد را که از نوع ماتریسی هستند، بخواند. کی پدی که ما در اینجا استفاده کردهایم از نوع ۴×۴ است.
جدول زیر چگونگی اتصال بین پایههای کی پد و آردوینو را نشان میدهد. در واقع پایههای کی پد، به پایههای خروجی دیجیتال آردوینو متصل میشوند.
پین D6 را هم که یک پین PWM است به بازر وصل میکنیم.
وصل کردن RFID
در این مرحله باید ماژول RFID را به مدار اضافه کنیم. ماژولی که ما در اینجا استفاده میکنیم، از پروتکل ارتباطی SPI استفاده میکند. در این ارتباط SPI، بورد آردوینو به عنوان Master و ماژول RFID به عنوان Slave عمل میکند. هم تگ و هم ریدر بر روی فرکانس 13.56MHz تنظیم شدهاند.
همان طور که گفتیم، از ماژول RFID به این منظور استفاده میکنیم که ID کارت شناسایی را به کمک آن بخوانیم و آن را با ID که از قبل در EEPROM ذخیره شده است، مقایسه کنیم. در صورتی که یکی باشند، در باز میشود و بر روی LCD عبارت Unlocked نمایش داده میشود؛ در غیر این صورت عبارت Blocked را بر روی نمایشگر خواهیم دید.
اتصال بین بورد آردوینو، ماژول RFID و LCD
بورد آردوینو، ماژول RFID و LCD
اضافه کردن بازر و LEDها
برای کامل شدن سیستم باز کنندهی قفل، یک بازر و دو عدد LED را هم به مدار اضافه میکنیم. برای وصل کردن آنها از نمودار مداری عکس زیر استفاده کنید. نقش بازر را به این شکل تعیین میکنیم که هر زمان سیستم اجازهی دسترسی داد (یعنی وضعیت Unlocked)، بازر به صدا درآید. LED قرمز رنگ در وضعیت بسته بودن در روشن است و LED سبز رنگ هم با باز شدن در روشن میشود.
ما در اینجا برای محافظت از سیستمی که طراحی کردهایم، با استفاده از یک پرینتر سه بعدی یک جعبه طراحی میکنیم. اما اگر شما به چنین پرینتری دسترسی ندارید اصلا مهم نیست. از هر جعبهی دیگری هم که در اختیار داشته باشید میتوانید به این منظور استفاده کنید. خوبی استفاده از چنین جعبهای این است که اجزاء مدار محافظت میشوند و تنها LEDها، LCD و کی پد در معرض عموم قرار میگیرند.
نمودار مداری اتصال تمام قطعات مدار به یکدیگر: بورد آردوینو LCD ،Nano، کی پد، RFID و بازر
طراحی جعبهی محافظ
اگر به پرینتر سه بعدی دسترسی دارید، خیلی خوب است که این جعبهی محافظ را خودتان و متناسب با مدار طراحی کنید. به این ترتیب آن را از آسیبهایی مانند آلودگی و … حفظ خواهید کرد و طول عمر آن بیشتر میشود.
طراحی جعبه را با استفاده از نرمافزار SketchUp انجام میدهیم. این نرمافزار رابط کاربری بسیار سادهای دارد و ابزارهای آن مانند Line ،Eraser و … توسط همهی افراد قابل یادگیری و استفاده هستند.
ابعاد جعبه را ۱۲۰*۱۲۵*۳۷ میلیمتر انتخاب میکنیم.
اگر قبلا با این نرمافزار کار نکردهاید، اصلا نگران نباشید، کافیست مرور مختصری بر روی آموزشهای فراوانی که از آن وجود دارد داشته باشید.
نمای بالایی جعبه
نمای پایینی جعبه
ضمن طراحی باید این موارد را در نظر بگیرید.
در قسمت بالای جعبه:
- دو دریچه ۵.۲ میلیمتری برای LEDها
- یک دریچه ۷.۳×۴۲.۲ میلیمتری برای LCD
- یک دریچه ۱۰.۵×۱۶ میلیمتری برای کابل
در قسمت پایینی جعبه:
- یک دریچه ۱۰×۲۷ میلیمتری برای کی پد
لازم به ذکر است که این اندازهگیریها را بر اساس ابعاد قطعات مورد استفاده به دست آوردهایم تا جعبه اندازهای کاملا متناسب و متوازن داشته باشید. شما میتوانید ابعاد را به دلخواه و بر حسب اندازهی قطعات مورد استفادهی خود تغییر دهید.
نمایی از جعبهی محافظ پس از قرار گرفتن مدار طراحی شده در آن
دیاگرام کد
کد مدار
#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
پیشنهاد میکنیم که حتما قسمت دوم این پروژه جذاب را هم دنبال کنید. در قسمت بعد آموزش میدهیم که چگونه فرمان باز و بسته کردن در را از طریق یک تلفن همراه هوشمند صادر کنید.
- منبع: ترجمه از سایت deviceplus.com
امیدوارم مقاله «پروژه ساخت قفل درب RFID با آردوینو » براتون مفید واقع شده باشه.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
کد آردوینو با وجود دانلود کتابخانه ارور میده و آردوینو با خطا مواجه میشه
لطفا کد رو در آردوینو verify کنید و خطاش رو برطرف کنید
سلام برای حذف کی پد و استفاده از پوش باتون برای ذخیره کارت یا حذف کارت از ایپیرام . کد چه تغییراتی میکنه؟
کارتی رو که ذخیره میکنه نمیتونه شناسایی کنه
سلام این مشکل برطرف شد؟ منم همین مشکلو دارم
سلام وقت بخیر
همه مراحل رو انجام دادم به اررور
Lcd begain می ده
نمی دونم چرا
می شود با انو امتحان کرد به جای نانو
سلام کتابخانه box در گیت هاب پاک شده و نمیشه ادش کرد داخل arduino ide
از کجا میتونم ادش کنم؟
شلام این فطعه گیر نمیاد چی میتونم جایگذینش کنم.
بازر اکتیو پیزوالکتریکی 3 تا 24 ولت SFM-20B
اگر چیزی هست بگید لطفا
واقعا پروژه عالی و خوبیه من خیلی توی مقالات مختلفی گشتم که همشون یا فقط rfid گفته بودند یا کیپد ولی این اموزی هردوتارو شامل شده بود تازه اینجا هم lcd هم بازر هم چراغو اورده که خیلی جاها یا با oled کار میکردن یا بازر اصن نمیذاشتن. این مقاله بسیار عالیه توسیه میکنم توی خونه اجراش کنید
سلام کارت رو شناسایی نمیکنه و ارور invalid nfc code میده چکار باید بکنم؟
سلام دوستان این کد نویسی برنامه مشکل داره هرکسی خواست بخرش به این ای دی تو تلگرام پیام بده به کمترین قیمت میفروشش
@Ali_Rostamian_1380