اتصال حسگر اثر انگشت به Raspberry Pi

در حال حاضر ما می توانیم سیستم های مبتنی بر اثر انگشت را در زندگی روزمره خود مانند حضور در دفاتر، تأیید کارمندان در بانک ها، برداشت وجه نقد  در دستگاه های خودپرداز، تأیید هویت در ادارات دولتی و غیره مشاهده کنیم.
با استفاده از این سیستم اثر انگشت Raspberry Pi، ما می توانیم انگشت های جدید را در سیستم ثبت کنیم و می تواناثر انگشت را که قبلاً ثبت شده اند حذف کنیم

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

Raspberry Pi
مبدل USB به سریال
ماژول اثر انگشت
LCD 16×2
پتانسیومتر 10k

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

در این پروژه رابط سنسور اثر انگشت و Raspberry Pi ، ما از ۴ دکمه فشاری استفاده کرده ایم: یکی برای ثبت نام انگشت جدید، دیگری برای اثر انگشت که قبلاً ثبت شده اند و دو مورد برای افزایش / کاهش موقعیت چاپ های انگشتی که قبلاً تغذیه شده اند. برای اینکه سنسور اثر انگشت آماده تطبیق باشد، از یک LED استفاده می شود. در اینجا ما از یک ماژول اثر انگشت استفاده کرده ایم که روی UART کار می کند. بنابراین در اینجا ما با استفاده از مبدل USB به سریال با ماژول اثر انگشت با Raspberry Pi ارتباط برقرار کرده ایم.
سریال

 

در ابتدای کار، ما باید تمام اتصال مورد نیاز را همانطور که در شماتیک مدار زیر نشان داده شده است، ایجاد کنیم. اتصالات ساده هستند، ما فقط ماژول اثر انگشت را با استفاده از مبدل USB به سریال به پورت USB Raspberry Pi متصل کرده ایم.

برای نمایش تمام پیام ها از LCD 16×2 استفاده می شود. از پتانسیومتر 10k برای کنترل کنتراست LCD استفاده می شود. پین های LCD 16×2 RS ، EN  d4 ، d5 ، d6 و d7 به ترتیب با GPIO Pin 18 ، ۲۳ ، ۲۴ ، ۲۵ ، ۸ و ۷ Raspberry Pi متصل می شوند. چهار دکمه فشار به GPIO Pin 5 ، ۶ ، ۱۳ و ۱۹ Raspberry Pi متصل هستند. LED همچنین در پایه ۲۶ RPI متصل می شود.

مدار
مدار

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

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

مرحله ۱: برای نصب این کتابخانه، دسترسی root لازم است. بنابراین ابتدا با دستور داده شده وارد root می شویم:

sudo bash
مرحله ۲: سپس با استفاده از دستورات داده شده برخی از بسته های مورد نیاز را بارگیری کنید:
مرحله ۳: بعد از این، ما باید Raspberry pi را بروز کنیم و کتابخانه سنسور اثر انگشت بارگیری شده را نصب کنیم:
sudo apt-get update
sudo apt-get install python-fingerprint –yes
مرحله ۴: پس از نصب کتابخانه اکنون باید با استفاده از دستور زیر پورت USB را که سنسور اثر انگشت شما به آن متصل است بررسی کنیم:
ls /dev/ttyUSB*
اکنون شماره پورت USB را با پورت USB که روی صفحه دارید جایگزین کنید و آن را در کد پایتون جایگزین کنید. کد کامل پایتون در پایان این پروژه آورده شده است.

عملکرد حسگر اثر انگشت با Raspberry Pi:

عملکرد این پروژه ساده است، فقط کد پایتون را اجرا کنید و برخی پیام های معرفی از طریق LCD وجود دارد و سپس از کاربر خواسته می شود انگشت را روی سنسور اثر انگشت قرار دهد. اکنون با قرار دادن انگشت روی ماژول اثر انگشت، می توانیم بررسی کنیم که آیا اثر انگشت ما قبلاً ذخیره شده است یا خیر. اگر اثر انگشت شما ذخیره شده باشد، LCD پیغامی را با موقعیت ذخیره سازی اثر انگشت مانند “Fount at Pos: 2” نشان می دهد در غیر این صورت “No Match Found”.

اکنون برای ثبت اثر انگشت، کاربر باید دکمه ثبت را فشار داده و پیام های دستورالعمل را در صفحه LCD دنبال کند.

اگر کاربر می خواهد هر کدام از اثر انگشت ها را حذف کند، کاربر باید دکمه حذف را فشار دهد. پس از آن، LCD موقعیت اثر انگشتی را که باید حذف شود درخواست می کند. اکنون با استفاده از دو دکمه فشار دیگر برای افزایش و کاهش، کاربر می تواند موقعیت اثر انگشت را انتخاب کرده و دکمه ثبت را فشار دهد (در این زمان دکمه ثبت نام مانند دکمه Ok رفتار می کند) تا اثر انگشت حذف شود.

دیاگرام

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

پایتون برای رابط سنسور اثرانگشت با RPi با استفاده از توابع کتابخانه اثر انگشت آسان است. اما اگر کاربر بخواهد خودش آن را راه اندازی کند، برای اولین بار کمی دشوار خواهد بود. در دیتاشیت سنسور اثر انگشت، هر آنچه برای ارتباط با ماژول مشابه مورد نیاز است، آورده شده است.

کد GitHub برای آزمایش Raspberry pi شما با سنسور اثر انگشت در دسترس است.

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

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)
ما برخی از توابع را برای شروع و راه اندازی LCD نوشتیم، کد کامل زیر را در بخش کد بررسی کنید:

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

تابع def enrollFinger برای ثبت یا ذخیره چاپ انگشت جدید استفاده می شود.
از تابع def (Finger) برای جستجوی اثرهای انگشتی که قبلاً ذخیره شده اند استفاده می شود
تابع def deleteFinger برای حذف خط چاپ انگشتی که قبلاً ذخیره شده است با فشار دادن دکمه پاسخ مجدد استفاده می شود.

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

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

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()

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

Code
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()



مطالب پیشنهادی برای شما


 

محمد صداقتی
Latest posts by محمد صداقتی (see all)

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

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