رباتیک و هوافضا

سیستم تشخیص بایومتریک با استفاده از رزبری پای

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

 

 

قطعات مورد نیاز:

  1. رزبری پای
  2. مبدل یو اس بی به سریال
  3. ماژول اثر انگشت
  4. دکمه
  5. ال سی دی ۱۶×۲
  6. پتانسیو متر ۱۰k
  7. برد برد و یا پی سی بی از مدل JLCPCB
  8. سیم جامپر
  9. ال ای دی (اختیاری)
  10. مقاوت ۱۵۰ اهم و ۱ کیلو اهم (اختیاری)

شماتیک مدار و توضیحات

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

تشخیص اثر انگشت

 

اول از همه ما باید تمام اتصالات مورد نیاز را مطابق شماتیک مدار که در زیر نمایش داده شده است انجام دهیم. اتصالات ساده هستند ، ما فقط ماژول اثر انگشت را به پورت یو اس بی رزبری پای با استفاده از مبدل یو اس بی به سریال متصل کردیم. برای نمایش تمامی پیام ها از یک ال سی دی ۱۶ در ۲ استفاده کردیم. همچنین از یک پتانسیومتر ۱۰ کیلو هم برای کنترل تنظیم ال سی دی استفاده کردیم. به ترتیب پین های RS، EN، d4، d5، d6 و d7ال سی دی با پین های ۱۸، ۲۳، ۲۴، ۲۵، ۸ و ۷ از GPIO رزبری پای متصل هستند. همچنین  چهار کلید با پین های ۵ ، ۶ ، ۱۳ و ۱۹ GPIO  رزبری پای متصل هستند. ال ای دی نیز به پین ۲۶ GPIO رزبری پای متصل شده است.

 

 

 

 

 

 

نصب کتابخانه برای سنسور اثر انگشت

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

قدم اول: برای نصب این کتاب خانه باید از مزایای روت استفاده کرد. بنابراین در ابتدا ما با درستور زیر وارد فرایند روت می شویم.

sudo bash

قدم دوم : دانلود کردن تعدادی پکیج با استفاده از دستور زیر:

wget –O – http://apt.pm-codeworks.de/pm-codeworks.de.gpg | apt-key add –
wget http://apt.pm-codeworks.de/pm-codeworks.list -P /etc/apt/sources.list.d/

تشخیص اثر انگشت
قدم سوم: بعد از این ، ما نیاز داریم تا کتابخانه ی اثر انگشت را برای رزبری پای دانلود و آپدیت کنیم. همانند کد زیر :

sudo apt-get update
sudo apt-get install python-fingerprint –yes

تشخیص اثر انگشت

قدم۴: بعد از نصب کتابخانه  اکنون ما نیازمند این هستیم که پورت یو اس بی را چک کنیم که به سنسور متصل است . این کار را با کد زیر انجام میدهیم:

ls /dev/ttyUSB*

حال شماره ی پورت یو اس بی را با پورت یو اس بی که برای شما نمایش داده شده است در کد پایتون تغییر دهید. کد کامل پایتون در پایان پروزه قرار داده شده است.

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

عملکرد سنسور اثر انگشت با رزبری پای:

شیوه ی کار این پروزه ساده است ، فقط کافی ست که کد پایتون را اجرا کنید و در ادامه تعدادی پیام بر روی ال سی دی نمایش داده می شود و سپس از کاربر خواسته می شود تا انگشتش را بر روی سنسور قرار دهد . سپس با قرار دادن انگشت بر روی سنسور اثر انگشت ، سیستم چک می کند که آیا اثر انگشت در سیستم ذخیره شده است یا خیر. اگر که اثر انگشت شما از قبل در سیستم ذخیره شده بود سپس ال سی دی پیامی همانند ( Fount at Pos:2) به شما نشان می دهد در غیر این صورت این پیام به شما نمایش داده می شود(No Match found).

تشخیص اثر انگشت

حال برای اضافه کردن اثر انگشت ، کاربر باید دکمه ی اضافه کردن (enroll) را فشار دهد و از دستور العملی که بر روی صفحه ی ال سی دی نمایش داده می شود پیروی کند.

اگر که کاربر بخواهد اثر انگشتی را پاک کند ، کاربر باید کلید حذف (delete) را فشار دهد. سپس از کاربر خواسته می شود تا اثر انگشتی را که می خواهد حذف کن را بر روی سنسور قرار دهد. سپس با استفاده از دو دکمه دیگر افزایش و کاهش ، کاربر می تواند که حالت اثر انگشت را که اکنون حالت ذخیره شده است را انتخاب کند و سپس دکمه ی enroll را فشار دهد تا اثر انگشت حذف شود. 

 تشخیص اثر انگشت

برنامه نویسی پایتون

برنامه ی استفاده شده برای این پروژه آسان می باشد ودر آن از کتابخانه ی اثر انگشت استفاده می کنیم. اما اگر کاربر خودش بخواهد رابط را ایجاد کند در این صورت برای بار اول کار کمی دشوار خواهد بود. در دیتاشیت سنسور مورد استفاده تمامی موارد مورد نیاز برا رابط سازی آن درج شده است. یک کد از سایت https://github.com/bastianraschke/pyfingerprint برای تست کردن رزبری پای با سنسور اثر انگشت قابل دسترسیست.

در اینجا ما از کتابخانه استفاده کرده این پس فق نیاز است تا کتابخانه را فراخوانی کنیم. در کد ابتدا باید کتابخانه هایی مانند اثر انگشت ، GPIO و زمان را وارد کنیم. سپس باید پین ها را برای ال سی دی و ال ای دی و دکمه ها را تعریف کنیم.

import time
from pyfingerprint.pyfingerprint import PyFingerprint
import RPi.GPIO as gpio

RS =18
EN =23
D4 =24
D5 =25
D6 =8
D7 =7

enrol=5
delet=6
inc=13
dec=19
led=26

HIGH=1
LOW=0

بعد از آن ما باید برای پین های مورد استفاده عمل مقدار دهی اولیه و ادرس دهی را انجام دهیم.

gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(RS, gpio.OUT)
gpio.setup(EN, gpio.OUT)
gpio.setup(D4, gpio.OUT)
gpio.setup(D5, gpio.OUT)
gpio.setup(D6, gpio.OUT)
gpio.setup(D7, gpio.OUT)

gpio.setup(enrol, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(delet, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(inc, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(dec, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(led, gpio.OUT)

اکنون سنسور اثر انگشت را مقدار دهی کردیم.

try:
    f = PyFingerprint('/dev/ttyUSB0', 57600, 0xFFFFFFFF, 0x00000000)
    if ( f.verifyPassword() == False ):
        raise ValueError('The given fingerprint sensor password is wrong!')
except Exception as e:
    print('Exception message: ' + str(e))
    exit(1)

سپس تعدادی تابع برای مقدار دهی و راه اندازی ال سی دی به صورت زیر نوشته ایم:

def begin(), def lcdcmd(ch), def lcdwrite(ch), def lcdprint(Str), def setCursor(x,y)

 

بعد از نوشتن تمامیه توابع راه اندازی ال سی دی ، باید تمامی  توابع برای اضافه کرد، جستجو و حذف کردن را قرار داد.

def enrollFinger() : این تابع برای اضافه کردن و ذخیره کردن اثر انگشت های جدید مورد استفاده قرار می گیرد.
def searchFinger() : این تابع برای سرچ اثر انگشت های از قبل ذخیره شده را انجام می دهد.
def deleteFinger()  : این تابع برای حذف کردن اثر انگشت مورد نظر استفاده می شود.

بیشتر بخوانید...  تاکومتر (سرعت سنج پره) با آردوینو

تمامیه توابع بالا در کد پایتون زیر ارائه شده اند.

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

begin()
lcdcmd(0x01)
lcdprint("FingerPrint ")
lcdcmd(0xc0)
lcdprint("Interfacing ")
time.sleep(3)
lcdcmd(0x01)
lcdprint("Circuit Digest")
lcdcmd(0xc0)
lcdprint("Welcomes You  ")
time.sleep(3)
flag=0
lcdclear()

while 1:
    gpio.output(led, HIGH)
    lcdcmd(1)
    lcdprint("Place Finger")
    if gpio.input(enrol) == 0:
        gpio.output(led, LOW)
        enrollFinger()
    elif gpio.input(delet) == 0:
        gpio.output(led, LOW)
        while gpio.input(delet) == 0:
            time.sleep(0.1)
        deleteFinger()
    else:
        searchFinger()

کد کامل پروژه:

دانلود فایل
import time
from pyfingerprint.pyfingerprint import PyFingerprint
import RPi.GPIO as gpio
RS =18
EN =23
D4 =24
D5 =25
D6 =8
D7 =7
enrol=5
delet=6
inc=13
dec=19
led=26
HIGH=1
LOW=0
gpio.setwarnings(False)
gpio.setmode(gpio.BCM)
gpio.setup(RS, gpio.OUT)
gpio.setup(EN, gpio.OUT)
gpio.setup(D4, gpio.OUT)
gpio.setup(D5, gpio.OUT)
gpio.setup(D6, gpio.OUT)
gpio.setup(D7, gpio.OUT)
gpio.setup(enrol, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(delet, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(inc, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(dec, gpio.IN, pull_up_down=gpio.PUD_UP)
gpio.setup(led, gpio.OUT)
try:
    f = PyFingerprint('/dev/ttyUSB0', 57600, 0xFFFFFFFF, 0x00000000)
    if ( f.verifyPassword() == False ):
        raise ValueError('The given fingerprint sensor password is wrong!')
except Exception as e:
    print('Exception message: ' + str(e))
    exit(1)
def begin():
  lcdcmd(0x33) 
  lcdcmd(0x32) 
  lcdcmd(0x06)
  lcdcmd(0x0C) 
  lcdcmd(0x28) 
  lcdcmd(0x01) 
  time.sleep(0.0005)
 
def lcdcmd(ch): 
  gpio.output(RS, 0)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  
def lcdwrite(ch): 
  gpio.output(RS, 1)
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x10==0x10:
    gpio.output(D4, 1)
  if ch&0x20==0x20:
    gpio.output(D5, 1)
  if ch&0x40==0x40:
    gpio.output(D6, 1)
  if ch&0x80==0x80:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
  # Low bits
  gpio.output(D4, 0)
  gpio.output(D5, 0)
  gpio.output(D6, 0)
  gpio.output(D7, 0)
  if ch&0x01==0x01:
    gpio.output(D4, 1)
  if ch&0x02==0x02:
    gpio.output(D5, 1)
  if ch&0x04==0x04:
    gpio.output(D6, 1)
  if ch&0x08==0x08:
    gpio.output(D7, 1)
  gpio.output(EN, 1)
  time.sleep(0.005)
  gpio.output(EN, 0)
def lcdclear():
  lcdcmd(0x01)
 
def lcdprint(Str):
  l=0;
  l=len(Str)
  for i in range(l):
    lcdwrite(ord(Str[i]))
    
def setCursor(x,y):
    if y == 0:
        n=128+x
    elif y == 1:
        n=192+x
    lcdcmd(n)
def enrollFinger():
    lcdcmd(1)
    lcdprint("Enrolling Finger")
    time.sleep(2)
    print('Waiting for finger...')
    lcdcmd(1)
    lcdprint("Place Finger")
    while ( f.readImage() == False ):
        pass
    f.convertImage(0x01)
    result = f.searchTemplate()
    positionNumber = result[0]
    if ( positionNumber >= 0 ):
        print('Template already exists at position #' + str(positionNumber))
        lcdcmd(1)
        lcdprint("Finger ALready")
        lcdcmd(192)
        lcdprint("   Exists     ")
        time.sleep(2)
        return
    print('Remove finger...')
    lcdcmd(1)
    lcdprint("Remove Finger")
    time.sleep(2)
    print('Waiting for same finger again...')
    lcdcmd(1)
    lcdprint("Place Finger")
    lcdcmd(192)
    lcdprint("   Again    ")
    while ( f.readImage() == False ):
        pass
    f.convertImage(0x02)
    if ( f.compareCharacteristics() == 0 ):
        print "Fingers do not match"
        lcdcmd(1)
        lcdprint("Finger Did not")
        lcdcmd(192)
        lcdprint("   Mactched   ")
        time.sleep(2)
        return
    f.createTemplate()
    positionNumber = f.storeTemplate()
    print('Finger enrolled successfully!')
    lcdcmd(1)
    lcdprint("Stored at Pos:")
    lcdprint(str(positionNumber))
    lcdcmd(192)
    lcdprint("successfully")
    print('New template position #' + str(positionNumber))
    time.sleep(2)
def searchFinger():
    try:
        print('Waiting for finger...')
        while( f.readImage() == False ):
            #pass
            time.sleep(.5)
            return
        f.convertImage(0x01)
        result = f.searchTemplate()
        positionNumber = result[0]
        accuracyScore = result[1]
        if positionNumber == -1 :
            print('No match found!')
            lcdcmd(1)
            lcdprint("No Match Found")
            time.sleep(2)
            return
        else:
            print('Found template at position #' + str(positionNumber))
            lcdcmd(1)
            lcdprint("Found at Pos:")
            lcdprint(str(positionNumber))
            time.sleep(2)
    except Exception as e:
        print('Operation failed!')
        print('Exception message: ' + str(e))
        exit(1)
    
def deleteFinger():
    positionNumber = 0
    count=0
    lcdcmd(1)
    lcdprint("Delete Finger")
    lcdcmd(192)
    lcdprint("Position: ")
    lcdcmd(0xca)
    lcdprint(str(count))
    while gpio.input(enrol) == True:   # here enrol key means ok
        if gpio.input(inc) == False:
            count=count+1
            if count>1000:
                count=1000
            lcdcmd(0xca)
            lcdprint(str(count))
            time.sleep(0.2)
        elif gpio.input(dec) == False:
            count=count-1
            if count<0:
                count=0
            lcdcmd(0xca)
            lcdprint(str(count))
            time.sleep(0.2)
    positionNumber=count
    if f.deleteTemplate(positionNumber) == True :
        print('Template deleted!')
        lcdcmd(1)
        lcdprint("Finger Deleted");
        time.sleep(2)
begin()
lcdcmd(0x01)
lcdprint("FingerPrint ")
lcdcmd(0xc0)
lcdprint("Interfacing ")
time.sleep(3)
lcdcmd(0x01)
lcdprint("Circuit Digest")
lcdcmd(0xc0)
lcdprint("Welcomes You  ")
time.sleep(3)
flag=0
lcdclear()
while 1:
    gpio.output(led, HIGH)
    lcdcmd(1)
    lcdprint("Place Finger")
    if gpio.input(enrol) == 0:
        gpio.output(led, LOW)
        enrollFinger()
    elif gpio.input(delet) == 0:
        gpio.output(led, LOW)
        while gpio.input(delet) == 0:
            time.sleep(0.1)
        deleteFinger()
    else:
        searchFinger()

 

دیدگاه‌ها (6)

*
*

    ارش مهمان تیر 16, 1399 پاسخ

    به r301 چطوری وصل کنیم؟

      Admin مدیر کل آبان 16, 1399 پاسخ

      سلام
      تصویر شماتیک اصلاح شد

    ارش مهمان تیر 16, 1399 پاسخ

    سلام برای ماژول R301T Fingerprint Module چطور استفاده کنیم ؟

      Admin مدیر کل آبان 16, 1399 پاسخ

      سلام
      تصویر شماتیک اصلاح شد

    ارش مهمان تیر 16, 1399 پاسخ

    برای من خطا
    The received packet do not begin with a valid header!
    میده

      Admin مدیر کل آبان 16, 1399 پاسخ

      سلام بررسی میشه و بهتون اطلاع داده میشه