- Các thành phần bắt buộc
- Sơ đồ mạch và giải thích
- Hoạt động của cảm biến vân tay với vi điều khiển PIC
- Giải thích lập trình
Cảm biến vân tay, cái mà chúng ta từng thấy trong các bộ phim Khoa học viễn tưởng cách đây vài năm, giờ đã trở nên rất phổ biến để xác minh danh tính của một người cho nhiều mục đích khác nhau. Trong thời điểm hiện tại, chúng ta có thể thấy các hệ thống dựa trên dấu vân tay ở khắp mọi nơi trong cuộc sống hàng ngày của chúng ta như để tham gia văn phòng, xác minh nhân viên trong ngân hàng, để rút tiền mặt hoặc gửi tiền trong máy ATM, để xác minh danh tính trong văn phòng chính phủ, v.v. Chúng tôi đã giao tiếp nó với Arduino và với Raspberry Pi, hôm nay chúng ta sẽ giao diện Cảm biến vân tay với vi điều khiển PIC. Sử dụng Hệ thống in dấu vân tay PIC16f877A của bộ vi điều khiển PIC này, chúng tôi có thể đăng ký các dấu vân tay mới trong hệ thống và có thể xóa các dấu vân tay đã được cấp. Hoạt động hoàn chỉnh của hệ thống đã được hiển thị trong Video được đưa ra ở cuối bài báo.
Các thành phần bắt buộc
- Vi điều khiển PIC16f877A
- Mô-đun vân tay
- Nút nhấn hoặc bàn phím
- LCD 16x2
- Hủ 10k
- Bộ dao động tinh thể 18,432000 MHz
- Bread Board hoặc PCB (đặt hàng từ JLCPCB)
- Dây nhảy
- LED (tùy chọn)
- Điện trở 150 ohm -1 k ohm (tùy chọn)
- Nguồn điện 5v
Sơ đồ mạch và giải thích
Trong dự án giao diện cảm biến vân tay của Vi điều khiển PIC này, chúng tôi đã sử dụng 4 nút nhấn: các nút này được sử dụng cho đa chức năng. Phím 1 được sử dụng để đối sánh dấu vân tay và ID vân tay gia tăng trong khi lưu trữ hoặc xóa dấu vân tay trong hệ thống. Phím 2 được sử dụng để đăng ký vân tay mới và giảm ID vân tay trong khi lưu trữ hoặc xóa vân tay trong hệ thống. Phím 3 được sử dụng để xóa ngón tay đã lưu trữ khỏi hệ thống và phím 4 được sử dụng để OK. Một đèn LED được sử dụng cho một dấu hiệu cho thấy dấu vân tay được phát hiện hoặc khớp. Ở đây chúng tôi đã sử dụng mô-đun vân tay hoạt động trên UART. Vì vậy, ở đây chúng tôi đã giao tiếp mô-đun vân tay này với bộ vi điều khiển PIC ở tốc độ truyền mặc định của nó là 57600.
Vì vậy, trước hết, chúng ta cần thực hiện tất cả các kết nối cần thiết như được hiển thị trong Sơ đồ mạch bên dưới. Kết nối rất đơn giản, chúng tôi vừa kết nối mô-đun vân tay với UART của vi điều khiển PIC. Màn hình LCD 16x2 được sử dụng để hiển thị tất cả các tin nhắn. Nồi 10k cũng được sử dụng với màn hình LCD để kiểm soát độ tương phản. Chân dữ liệu LCD 16x2 là chân PORTA được kết nối. Các chân d4, d5, d6 và d7 của LCD được kết nối tương ứng với Chân RA0, RA1, RA2 và RA3 của vi điều khiển PIC. Bốn nút nhấn (hoặc bàn phím) được kết nối với Chân RD0, RD1, RD2 và RD của PORTD. LED cũng được kết nối tại chân RC3 của cổng PORTC. Ở đây chúng tôi đã sử dụng một bộ dao động tinh thể bên ngoài 18,432000 MHz để tạo xung nhịp cho bộ vi điều khiển.
Hoạt động của cảm biến vân tay với vi điều khiển PIC
Hoạt động của dự án này rất đơn giản, chỉ cần tải lên tệp hex, được tạo từ mã nguồn, vào bộ vi điều khiển PIC với sự trợ giúp của bộ lập trình PIC hoặc ổ ghi (PIckit2 hoặc Pickit3 hoặc những người khác) và sau đó bạn sẽ thấy một số thông báo giới thiệu trên màn hình LCD và sau đó là người dùng sẽ được yêu cầu nhập một lựa chọn cho các hoạt động. Để khớp dấu vân tay, người dùng cần nhấn phím 1 sau đó màn hình LCD sẽ yêu cầu Đặt ngón tay trên cảm biến vân tay. Giờ đây, bằng cách đặt ngón tay lên mô-đun vân tay, chúng ta có thể kiểm tra xem dấu vân tay của mình đã được lưu trữ hay chưa. Nếu dấu vân tay của bạn được lưu trữ thì màn hình LCD sẽ hiển thị thông báo với ID lưu trữ giống như dấu vân tay ' ID: 2' nếu không nó sẽ hiển thị 'Không tìm thấy' .
Bây giờ để đăng ký một ngón tay Print, người dùng cần nhấn nút đăng ký hoặc phím 2 và làm theo thông báo hướng dẫn trên màn hình LCD.
Nếu người dùng muốn xóa bất kỳ dấu vân tay nào thì người dùng cần nhấn nút xóa hoặc phím 3. Sau đó, màn hình LCD sẽ yêu cầu ID của dấu vân tay sẽ được xóa. Giờ đây, bằng cách sử dụng nút nhấn tăng hoặc phím 1 (khớp với nút nhấn hoặc phím 1) và nút nhấn giảm hoặc phím 2 (nút nhấn đăng ký hoặc phím 2) để tăng và giảm, người dùng có thể chọn ID của Dấu vân tay đã lưu và nhấn OK để xóa dấu vân tay đó. Để hiểu thêm, hãy xem video được đưa ra ở cuối dự án.
Giao diện FingerPrint Lưu ý: Chương trình của dự án này hơi phức tạp đối với người mới bắt đầu. Nhưng mã giao diện đơn giản của nó được thực hiện bằng cách đọc biểu dữ liệu mô-đun vân tay r305. Tất cả các hướng dẫn về hoạt động của mô-đun vân tay này được đưa ra trong biểu dữ liệu.
Ở đây chúng tôi đã sử dụng một định dạng khung để nói chuyện với mô-đun vân tay. Bất cứ khi nào chúng tôi gửi một lệnh hoặc khung yêu cầu dữ liệu đến mô-đun vân tay, nó sẽ trả lời chúng tôi với cùng một định dạng khung chứa dữ liệu hoặc thông tin liên quan đến lệnh được áp dụng. Tất cả dữ liệu và định dạng khung lệnh đã được cung cấp trong hướng dẫn sử dụng hoặc trong biểu dữ liệu của mô-đun vân tay R305.
Giải thích lập trình
Trong lập trình, chúng tôi đã sử dụng định dạng khung bên dưới.
Chúng tôi bắt đầu chương trình bằng cách thiết lập các bit cấu hình và xác định macro và chân cho LCD, Buttons và LED, bạn có thể kiểm tra trong mã hoàn chỉnh được cung cấp ở cuối dự án này. Nếu bạn chưa quen với Vi điều khiển PIC thì hãy bắt đầu với Bắt đầu với Dự án Vi điều khiển PIC.
Sau đó, chúng tôi khai báo và khởi tạo một số biến và mảng, đồng thời tạo một khung mà chúng tôi cần sử dụng trong dự án này để giao diện mô-đun vân tay với vi điều khiển PIC.
uchar buf; uchar buf1; chỉ số uint dễ bay hơi = 0; cờ int dễ bay hơi = 0; uint msCount = 0; uint g_timerflag = 1; số lượng uint dễ bay hơi = 0; dữ liệu uchar; uint id = 1; enum { CMD, DATA, SBIT_CREN = 4, SBIT_TXEN, SBIT_SPEN, }; const char passPack = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x7, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1B}; const char f_detect = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x3, 0x1, 0x0, 0x5}; const char f_imz2ch1 = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x1, 0x0, 0x8}; const char f_imz2ch2 = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x4, 0x2, 0x2, 0x0, 0x9}; const char f_createModel = {0xEF, 0x1,0xFF, 0xFF, 0xFF, 0xFF, 0x1,0x0,0x3,0x5,0x0,0x9}; char f_storeModel = {0xEF, 0x1,0xFF, 0xFF, 0xFF, 0xFF, 0x1,0x0,0x6,0x6,0x1,0x0,0x1,0x0,0xE}; const char f_search = {0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x1, 0x0, 0x8, 0x1B, 0x1, 0x0, 0x0, 0x0, 0xA3, 0x0, 0xC8}; char f_delete = {0xEF, 0x1,0xFF, 0xFF, 0xFF, 0xFF, 0x1,0x0,0x7,0xC, 0x0,0x0,0x0,0x1,0x0,0x15};
Sau đó, chúng tôi đã thực hiện chức năng LCD để lái xe LCD.
void lcdwrite (uchar ch, uchar rw) { LCDPORT = ch >> 4 & 0x0F; RS = rw; EN = 1; __delay_ms (5); EN = 0; LCDPORT = ch & 0x0F; EN = 1; __delay_ms (5); EN = 0; } Lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } lcdbegin () { uchar lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; uint i = 0; for (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Hàm đã cho được sử dụng để khởi tạo UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // tốc độ truyền @ 18.432000Mhz Đồng hồ TXSTAbits.SYNC = 0; // Đặt chế độ không đồng bộ, tức là UART RCSTAbits.SPEN = 1; // Bật cổng nối tiếp TRISC7 = 1; // Như được quy định trong Datasheet TRISC6 = 0; // Như được quy định trong Datasheet RCSTAbits.CREN = 1; // Cho phép tiếp nhận liên tục TXSTAbits.TXEN = 1; // Cho phép truyền GIE = 1; // BẬT ngắt INTCONbits.PEIE = 1; // Có thể kích hoạt ngắt ngoại vi. PIE1bits.RCIE = 1; // BẬT USART nhận ngắt PIE1bits.TXIE = 0; // vô hiệu hóa ngắt USART TX PIR1bits.RCIF = 0; }
Các chức năng đã cho được sử dụng để chuyển các lệnh đến Mô-đun vân tay và nhận dữ liệu từ mô-đun vân tay.
void serialwrite (char ch) { while (TXIF == 0); // Chờ cho đến khi thanh ghi máy phát trống TXIF = 0; // Xóa cờ máy phát TXREG = ch; // nạp ký tự cần truyền vào truyền reg } serialprint (char * str) { while (* str) { serialwrite (* str ++); } } void ngắt SerialRxPinInterrupt (void) { if ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; if (index> 0) flag = 1; RCIF = 0; // xóa cờ rx } } void serialFlush () { for (int i = 0; i
Sau đó, chúng ta cần thực hiện một chức năng chuẩn bị dữ liệu sẽ được truyền đến dấu vân tay và giải mã dữ liệu đến từ mô-đun vân tay.
int sendcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); chỉ số = 0; __delay_ms (100); for (int i = 0; i
Bây giờ, có bốn chức năng có sẵn trong mã cho bốn tác vụ khác nhau:
- Hàm để nhập ID vân tay - unit getId ()
- Hàm khớp ngón tay - void matchFinger ()
- Hàm đăng ký ngón tay mới - void enrolFinger ()
- Hàm xóa ngón tay - void deleteFinger ()
Mã hoàn chỉnh với tất cả bốn chức năng được đưa ra ở cuối.
Bây giờ trong chức năng chính, chúng tôi khởi tạo GPIO, LCD, UART và kiểm tra xem mô-đun vân tay có được kết nối với vi điều khiển hay không. Sau đó, nó hiển thị một số thông báo giới thiệu qua màn hình LCD. Cuối cùng trong khi vòng lặp chúng ta đọc tất cả các phím hoặc nút ấn để vận hành dự án.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("Vân tay"); lcdwrite (192, CMD); lcdprint ("Giao nhau"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Sử dụng PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Thông báo mạch"); __delay_ms (2000); chỉ số = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("Không tìm thấy FP"); __delay_ms (2000); chỉ số = 0; } lcdwrite (1, CMD); lcdprint ("Tìm thấy FP"); __delay_ms (1000); lcdinst (); trong khi (1) { FP = khớp
Mã PIC hoàn chỉnh và Video làm việc được cung cấp bên dưới. Đồng thời kiểm tra các dự án khác của chúng tôi bằng cách sử dụng Mô-đun cảm biến vân tay:
- Máy bỏ phiếu sinh trắc học dựa trên dấu vân tay sử dụng Arduino
- Hệ thống bảo mật sinh trắc học sử dụng Arduino và cảm biến vân tay
- Hệ thống chấm công sinh trắc học dựa trên dấu vân tay sử dụng Arduino
- Giao diện cảm biến vân tay với Raspberry Pi