- Необходими компоненти
- Електрическа схема и обяснение
- Работа на сензора за пръстови отпечатъци с микроконтролер PIC
- Обяснение на програмирането
Сензорът за отпечатък на пръсти, който преди няколко години виждахме в научно-фантастични филми, сега е много разпространен за проверка на самоличността на човек за различни цели. Понастоящем можем да видим системи, базирани на пръстови отпечатъци, навсякъде в нашето ежедневие, като например присъствие в офиси, проверка на служители в банки, теглене на пари в брой или депозити в банкомати, проверка на самоличността в правителствени служби и т.н. Вече сме го свързвали с Arduino и с Raspberry Pi днес ще свържем сензора за пръстов отпечатък с микроконтролера PIC. Използвайки този PIC микроконтролер PIC16f877A Finger Print System, ние можем да регистрираме нови пръстови отпечатъци в системата и да изтрием вече подадените пръстови отпечатъци. Пълната работа на системата е показана във видеото даден в края на статията.
Необходими компоненти
- PIC16f877A Микроконтролер
- Модул за пръстови отпечатъци
- Бутони или клавиатура
- 16x2 LCD
- 10к пот
- 18.432000 MHz кристален осцилатор
- Дъска за хляб или печатни платки (поръчани от JLCPCB)
- Джъмперни проводници
- LED (по избор)
- Резистор 150 ома -1 k ома (по избор)
- 5v захранване
Електрическа схема и обяснение
В този проект за взаимодействие на сензора за пръстови отпечатъци на микроконтролера сме използвали 4 бутона: тези бутони се използват за мултифункционалност. Клавиш 1 се използва за съвпадение на отпечатъка и увеличаване на идентификатора на пръстовия отпечатък, докато съхранявате или изтривате пръстовия отпечатък в системата. Ключ 2 се използва за записване на новия пръстов отпечатък и за намаляване на идентификатор на пръстов отпечатък, докато съхранявате или изтривате пръстов отпечатък в системата. Клавиш 3 се използва за изтриване на съхранения пръст от системата, а ключ 4 се използва за ОК. А LED се използва за индикация, че пръстовият отпечатък е открит или съвпада. Тук използвахме модул за пръстови отпечатъци, който работи на UART. И така, тук сме свързали този модул за пръстови отпечатъци с PIC микроконтролер при неговата скорост на предаване по подразбиране, която е 57600.
И така, на първо място, трябва да осъществим цялата необходима връзка, както е показано в схемата по-долу. Връзките са лесни, току-що свързахме модула за пръстови отпечатъци към UART на микроконтролера на PIC. 16x2 LCD се използва за показване на всички съобщения. 10k пот също се използва с LCD за контрол на контраста на същия. 16x2 LCD щифта за данни са свързани PORTA щифтове. Пиновете d4, d5, d6 и d7 на LCD са свързани съответно с Pin RA0, RA1, RA2 и RA3 на PIC микроконтролера. Четири бутони (или клавиатура) са свързани към Pin RD0, RD1, RD2 и RD на PORTD. Светодиодът също е свързан към извода RC3 на порт PORTC. Тук използваме 18.432000 MHz външен кристален осцилатор за тактоване на микроконтролера.
Работа на сензора за пръстови отпечатъци с микроконтролер PIC
Работата с този проект е проста, просто качете шестнадесетичен файл, генериран от изходен код, в PIC микроконтролера с помощта на PIC програмист или горелка (PIckit2 или Pickit3 или други) и след това ще видите някои съобщения за въвеждане през LCD и след това потребителя ще бъде помолен да въведе избор за операции. За да съответства на потребителя на пръстови отпечатъци, трябва да натиснете клавиш 1, след което LCD ще поиска Поставяне на пръст върху сензор за пръстов отпечатък. Сега, като поставим пръст върху модула за пръстови отпечатъци, можем да проверим дали нашите пръстови отпечатъци вече са съхранени или не. Ако вашият пръстов отпечатък е съхранен, тогава LCD ще покаже съобщението с идентификатора за съхранение на подобен на пръстов отпечатък " ID: 2", в противен случай ще покаже "Не е намерен" .
Сега, за да регистрира отпечатване с пръст , потребителят трябва да натисне бутона за регистрация или клавиш 2 и да следва съобщенията с инструкции на LCD екрана.
Ако потребителят иска да изтрие някой от пръстовите отпечатъци, тогава потребителят трябва да натисне бутона за изтриване или клавиша 3. След което LCD ще поиска идентификационния номер на пръстовия отпечатък, който трябва да бъде изтрит. Сега с помощта на бутон за увеличаване или клавиш 1 (бутон за съвпадение или клавиш 1) и бутон за намаляване или бутон 2 (бутон за регистрация или клавиш 2) за увеличаване и намаляване, потребителят може да избере идентификатора на запазения отпечатък и да натисне OK, за да изтриете този пръстов отпечатък. За повече разбиране погледнете видеото, дадено в края на проекта.
FingerPrint взаимодействие Забележка: Програмата на този проект е малко сложна за начинаещи. Но неговият прост интерфейсен код, направен чрез използване на четене на лист с данни за модула за пръстови отпечатъци r305. Всички инструкции за функционирането на този модул за пръстови отпечатъци са дадени в листа с данни.
Тук използвахме рамков формат за разговор с модул за пръстови отпечатъци. Винаги, когато изпращаме команда или рамка за искане на данни към модула за пръстови отпечатъци, той ни отговаря със същия формат на рамка, съдържащ данни или информация, свързана с приложената команда. Всички формати на данните и командния кадър са дадени в ръководството за потребителя или в листа с данни на R305 модула за пръстови отпечатъци.
Обяснение на програмирането
При програмирането използвахме формата на рамката по-долу.
Започваме програмата, като задаваме битове за конфигуриране и дефинираме макроси и щифтове за LCD, бутони и LED, които можете да проверите в пълния код, даден в края на този проект. Ако сте нов в PIC Microcontroller, започнете с Първи стъпки с PIC Microcontroller Project.
След това декларирахме и инициализирахме някаква променлива и масив и направихме рамка, която трябва да използваме в този проект, за да свържем модула за пръстови отпечатъци с PIC микроконтролера.
uchar buf; uchar buf1; индекс на летливи uint = 0; летлив int флаг = 0; uint msCount = 0; uint g_timerflag = 1; променлив брой uint = 0; uchar данни; uint id = 1; преброяване { 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};
След него направихме LCD функция за управление на 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); // __ забавяне_ms (20); } } lcdbegin () { uchar lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; uint i = 0; за (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Дадената функция се използва за инициализиране на UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // скорост на предаване @ 18.432000Mhz Clock TXSTAbits.SYNC = 0; // Задаване на асинхронен режим, т.е. UART RCSTAbits.SPEN = 1; // Активира сериен порт TRISC7 = 1; // Както е предписано в лист с данни TRISC6 = 0; // Както е предписано в лист с данни RCSTAbits.CREN = 1; // Активира непрекъснат прием TXSTAbits.TXEN = 1; // Активира предаването GIE = 1; // ENABLE прекъсва INTCONbits.PEIE = 1; // ENAB периферни прекъсвания. PIE1bits.RCIE = 1; // АКТИВИРАНЕ на USART получаване на прекъсване PIE1bits.TXIE = 0; // деактивиране на прекъсване на USART TX PIR1bits.RCIF = 0; }
Дадени функции се използват за прехвърляне на команди към модула за пръстови отпечатъци и получаване на данни от модула за пръстови отпечатъци.
void serialwrite (char ch) { while (TXIF == 0); // Изчакайте, докато регистърът на предавателя стане празен TXIF = 0; // Изчистване на знамето на предавателя TXREG = ch; // зареждаме символа, който трябва да се предаде, в предаване reg } serialprint (char * str) { while (* str) { serialwrite (* str ++); } } void interrupt SerialRxPinInterrupt (void) { if ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; ако (индекс> 0) флаг = 1; RCIF = 0; // изчистване на rx флаг } } void serialFlush () { for (int i = 0; i
След него трябва да направим функция, която подготвя данни, които трябва да бъдат предадени на пръстови отпечатъци и декодира данните, идващи от модула за пръстови отпечатъци.
int sendcmd2fp (char * pack, int len) { uint res = ГРЕШКА; serialFlush (); индекс = 0; __забавяне_ms (100); за (int i = 0; i
Сега в кода има четири функции за четири различни задачи:
- Функция за въвеждане на идентификатора на пръстовия отпечатък - единица getId ()
- Функция за съвпадение на пръст - void matchFinger ()
- Функция за записване на нов пръст - void enrolFinger ()
- Функция за изтриване на пръст - void deleteFinger ()
Пълният код с всичките четири функции е даден в края.
Сега в основната функция инициализираме GPIO, LCD, UART и проверяваме дали модулът за пръстови отпечатъци е свързан с микроконтролер или не. След това показва някои интро съобщения през LCD. Накрая в цикъл while четем всички клавиши или бутони, за да управляваме проекта.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("пръстов отпечатък"); lcdwrite (192, CMD); lcdprint ("Интерфейс"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Използване на PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); индекс = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP не е намерен"); __delay_ms (2000); индекс = 0; } lcdwrite (1, CMD); lcdprint ("FP Found"); __delay_ms (1000); lcdinst (); докато (1) { FP = съвпадение
Пълният PIC код и работен видеоклип са дадени по-долу. Проверете и другите ни проекти, като използвате модула за сензор за пръстов отпечатък:
- Биометрична машина за гласуване въз основа на пръстови отпечатъци, използваща Arduino
- Биометрична система за сигурност, използваща Arduino и сензор за пръстови отпечатъци
- Система за биометрично посещение, базирана на пръстови отпечатъци, използваща Arduino
- Свързване на сензор за пръстови отпечатъци с Raspberry Pi