از اونجایی که امنیت به یکی از اصلی ترین دغدغه های روزمره ما تبدیل شده، قفل های رقمی نقش مهمی در تامین امنیت برای ما ایفا میکنن. انواع مختلفی از سیستم های امنیتی برای ایمن سازی مکان ما وجود داره. به عنوان مثال، دستگاه های تشخیص هویت مبتنی بر فناوری برای باز کردن یا قفل کردن خودکار درب ها استفاده میشن. این سیستم ها برای کنترل حرکت درب بدون نیاز به کلید برای قفل یا باز کردن، کاربرد دارن. در این پروژه بهتون نشون میدیم که چجوری میشه با استفاده از حسگر اثرانگشت R307 یک سیستم قفل درب ساخت.
نمودارها و طرحهای زیر برای درک و طراحی این سیستم به شما کمک میکنه. کد این پروژه رو میتونید در انتها استفاده کنید. همراه من باشید تا این پروژه رو شروع کنیم.
قطعات مورد نیاز
جدول قطعات مورد نیاز
-
Arduino UNO
-
حسگر اثرانگشت R307
-
سلونوئید خطی، 3VDC
-
منبع تغذیه 60W PCIe 12V 5A
-
ماژول رله
شروع پروژه قفل درب مجهز به حسگر اثرانگشت
در این مقاله بهتون نشون میدیم که چجوری میشه به کمک Arduino اثرانگشتها رو ثبت و ذخیره کرد و بعد به کمک حسگر بیومتریک اونا رو خوند و درب رو قفل یا باز کرد.
در ابتدا تمامی قطعات رو روی یک تخته چوب MDF قرار میدیم.
حسگر تشخیص اثرانگشت R307
اگر قصد دارین سیستمی بسازین که بتونه با تکیه بر تحلیل اثرانگشت عملیات احراز هویت رو انجام بده یا به افراد دسترسی بده، حسگر بیومتریک اثرانگشت R307 ابزار مناسبی برای ساخت این سیستمه. این دستگاه با پروتکل سریال کار میکنه و برای همین میتونن با انواع و اقسام میکروکنتلرها یا کارتهای توسعه مورد استفاده قرار بگیرند.
این دستگاه میتونه تا 162 اثرانگشت رو در حافظه داخلی خودش ذخیره کنه. هر زمان که دستگاه در حال عکسبرداری از اثرانگشت باشه، چراغ LED اون روشن میشه.
اطلاعات حسگر R307
- مدل: R307
- ولتاز تغذیه: 5V
- جریان کاری: 100mA-15-mA
- حالت توازن (parity) اثرانگشت
- نرخ باود: 9600*NN=1 to 12 (نرخ پیش فرض 6 هست).
- مدت زمان ثبت و پردازش اثرانگشت: کمتر از 1 ثانیه
- دارای 5 سطح امنیتی
- ابعاد صفحه: 14*18میلیمتر
- محیط کاری: ℃20– – ℃40+ (رطوبت نسبی %40 تا %85)
- ابعاد: 5 x 2.1 x 2.0 سانتیمتر / وزن: 22 گرم
برای اینکه بتونین از این حسگر استفاده کنین باید اثرانگشتها رو در پایگاه داده اون ذخیره کنین. هر اثرانگشت یک ID داره. به دنبال اون میشه توالی خواندن و مقایسه اثرانگشتها رو انجام داد تا اثرانگشت کاربران رو تایید کرد و بر اساس نتایج، عملی رو انجام داد.
قطعات تشکیلدهندۀ حسگر اثرانگشت R307
- LEDها و پد لمسی
- TTP233D IC
- برای دیدن منشور درپوش رو بردارید.
- حسگر تصویر
در تصویر بالا دو PCB وجود داره. یکی به صورت افقی و یکی به صورت عمودی (با رنگ سبز نشان داده شده). LED آبی و پد لمسی در PCB افقی قرار دارند. PCB عمودی دارای حسگر تصویر، پردازنده و رابط هست. پد لمسی با بلوک شیشه ای بالا در تماس هست. همچنین حسگر تصویر به صورت لحیم متصل شده. محفظه برای جدا کردن نور از LED و نوری که از منشور خارج میشه، دارای یک مانع داخلی هست. در قسمت پایین منشور یک چسب پلاستیکی (epoxy) سیاه پوشیده شده که پس زمینه ای با وضوح بالا برای تصویر اثرانگشت ایجاد میکنه. برای دسترسی به منشور، فقط کافیه درپوش جلو رو بردارید.
طبق جدول زیر و با کمک تصویر، اتصالات رو برقرار کنید.
برنامهنویسی
در مرحله بعد، کتابخانه Arduino رو از آدرس زیر دانلود میکنیم:
Adafruit Fingerprint Sensor Library
بعد از دریافت، اون رو از حالت فشرده خارج میکنیم و در آدرس C: Program Files (x86) Arduino libraries ذخیره میکنیم. اگر فایل “cpp.” با نام دیگهای در پوشه کتابخانه وجود داره، حتماً باید نام پوشه کتابخانه رو تغییر بدید.
این حسگر با نرخ باود 57600 (سرعت پیشفرض) کار میکنه و میشه تنظیمش کرد. Arduino در هنگام استفاده از کتابخانه سریال استفاده میکنه.
#include <SoftwareSerial.h>
اگر لازم بود پایه ها رو تغییر بدید، از طریق فرمان زیر میتونین سریال نرمافزار رو تغییر بدید.
MySerial SoftwareSerial (2, 3);
در مثال اثرانگشت، اگر لازم باشه Arduino بعد از تشخیص اثرانگشت عملی انجام بده، باید اون عمل رو در کدها ذکر کنین:
Serial.Print (“found ID #”); Serial.Print (Finger.fingerID); Serial.Print (“with confidence”); Serial.println (Finger.Confidence); Write the code here return finger.fingerID;
حالا برای ثبت اثرانگشتها باید سریال مانیتور Arduino رو باز کنیم و طبق دستورالعمل پیش بریم:
اولین اثرانگشت رو در موقعیت 1 داریم و واردش میکنیم و طبق دستورالعمل پیش میریم:
اگر اثرانگشت به درستی ثبت شده باشه، پیام Fingerprint DOES match نشون داده میشه و به دنبال اون محل ذخیره اون و پیام Registered نشون داده میشه.
تا 162 تا اثرانگشت میشه با این حسگر ذخیره کرد، حالا عدد موقعیت بعدی رو که میخوایم اثرانگشت رو در اون ثبت کنین، مجدد تایپ میکنیم، که در این مثال موقعیت 2 هست و پس عدد 2 و تایپ میکنیم و کلید enter رو میزنیم و مجدد طبق همون دستورالعملها پیش میریم تا زمانیک تمامی اثرانگشتها رو ثبت کرده باشیم و همیشه هم یک موقعیت متفاوت رو تایپ میکنیم.
در آخر، برنامه نهایی رو بارگذاری میکنیم که اثرانگشتها رو بخونه. اگر اثرانگشتی که خونده میشه با یکی از اثرانگشتهای ذخیره شده مطابقت داشته باشه، رله متصل به پایه 13 آردوینو به مدت 3 ثانیه فعال میشه.
کد نهایی پروژه قفل درب مجهز به حسگر اثرانگشت
#include int getFingerprintIDez(); // pin #2 is IN from sensor (GREEN wire) // pin #3 is OUT from arduino (WHITE wire) SoftwareSerial mySerial(2, 3); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); void setup() { Serial.begin(9600); Serial.println(“fingertest”); pinMode(13, OUTPUT); digitalWrite(13, LOW); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1); } Serial.println(“Waiting for valid finger…”); } void loop() // run over and over again { getFingerprintIDez(); delay(50); //don’t ned to run this at full speed. } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println(“Image taken”); break; case FINGERPRINT_NOFINGER: Serial.println(“No finger detected”); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println(“Communication error”); return p; case FINGERPRINT_IMAGEFAIL: Serial.println(“Imaging error”); return p; default: Serial.println(“Unknown error”); return p; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: Serial.println(“Image converted”); break; case FINGERPRINT_IMAGEMESS: Serial.println(“Image too messy”); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println(“Communication error”); return p; case FINGERPRINT_FEATUREFAIL: Serial.println(“Could not find fingerprint features”); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println(“Could not find fingerprint features”); return p; default: Serial.println(“Unknown error”); return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK) { Serial.println(“Found a print match!”); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(“Communication error”); return p; } else if (p == FINGERPRINT_NOTFOUND) { Serial.println(“Did not find a match”); return p; } else { Serial.println(“Unknown error”); return p; } // found a match! Serial.print(“Found ID #”); Serial.print(finger.fingerID); Serial.print(” with confidence of “); Serial.println(finger.confidence); } // returns -1 if failed, otherwise returns ID # int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // found a match! Serial.print(“Found ID #”); Serial.print(finger.fingerID); Serial.print(” with confidence of “); Serial.println(finger.confidence); digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); return finger.fingerID; } #include #include int getFingerprintIDez(); // pin #2 is IN from sensor (GREEN wire) // pin #3 is OUT from arduino (WHITE wire) SoftwareSerial mySerial(2, 3); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); void setup() { Serial.begin(9600); Serial.println(“fingertest”); pinMode(13, OUTPUT); digitalWrite(13, LOW); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println(“Found fingerprint sensor!”); } else { Serial.println(“Did not find fingerprint sensor :(“); while (1); } Serial.println(“Waiting for valid finger…”); } void loop() // run over and over again { getFingerprintIDez(); delay(50); //don’t ned to run this at full speed. } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println(“Image taken”); break; case FINGERPRINT_NOFINGER: Serial.println(“No finger detected”); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println(“Communication error”); return p; case FINGERPRINT_IMAGEFAIL: Serial.println(“Imaging error”); return p; default: Serial.println(“Unknown error”); return p; } // OK success! p = finger.image2Tz(); switch (p) { case FINGERPRINT_OK: Serial.println(“Image converted”); break; case FINGERPRINT_IMAGEMESS: Serial.println(“Image too messy”); return p; case FINGERPRINT_PACKETRECIEVEERR: Serial.println(“Communication error”); return p; case FINGERPRINT_FEATUREFAIL: Serial.println(“Could not find fingerprint features”); return p; case FINGERPRINT_INVALIDIMAGE: Serial.println(“Could not find fingerprint features”); return p; default: Serial.println(“Unknown error”); return p; } // OK converted! p = finger.fingerFastSearch(); if (p == FINGERPRINT_OK) { Serial.println(“Found a print match!”); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println(“Communication error”); return p; } else if (p == FINGERPRINT_NOTFOUND) { Serial.println(“Did not find a match”); return p; } else { Serial.println(“Unknown error”); return p; } // found a match! Serial.print(“Found ID #”); Serial.print(finger.fingerID); Serial.print(” with confidence of “); Serial.println(finger.confidence); } // returns -1 if failed, otherwise returns ID # int getFingerprintIDez() { uint8_t p = finger.getImage(); if (p != FINGERPRINT_OK) return -1; p = finger.image2Tz(); if (p != FINGERPRINT_OK) return -1; p = finger.fingerFastSearch(); if (p != FINGERPRINT_OK) return -1; // found a match! Serial.print(“Found ID #”); Serial.print(finger.fingerID); Serial.print(” with confidence of “); Serial.println(finger.confidence); digitalWrite(13, HIGH); delay(3000); digitalWrite(13, LOW); return finger.fingerID;