- Необходимые компоненты
- Принципиальная схема и объяснение
- Работа датчика отпечатков пальцев с микроконтроллером PIC
- Объяснение программирования
Датчик отпечатков пальцев, который мы использовали в научно-фантастических фильмах несколько лет назад, теперь стал очень распространенным явлением для проверки личности человека в различных целях. В настоящее время мы можем видеть системы на основе отпечатков пальцев повсюду в нашей повседневной жизни, например, для посещения офисов, проверки сотрудников в банках, для снятия наличных или внесения депозита в банкоматы, для проверки личности в государственных учреждениях и т. Д. Мы уже подключили его к Arduino и С Raspberry Pi сегодня мы собираемся связать датчик отпечатков пальцев с микроконтроллером PIC. Используя этот микроконтроллер PIC PIC16f877A Finger Print System, мы можем регистрировать новые отпечатки пальцев в системе и можем удалять уже загруженные отпечатки пальцев. Полноценная работа системы показана на видео. приведено в конце статьи.
Необходимые компоненты
- Микроконтроллер PIC16f877A
- Модуль отпечатков пальцев
- Кнопки или клавиатура
- ЖК-дисплей 16x2
- 10к банк
- Кварцевый генератор 18,432000 МГц
- Хлебная плата или печатная плата (заказываются в JLCPCB)
- Перемычки
- LED (опционально)
- Резистор 150 Ом -1 кОм (опционально)
- Источник питания 5 В
Принципиальная схема и объяснение
В этом проекте сопряжения датчика отпечатка пальца микроконтроллера PIC мы использовали 4 кнопки: эти кнопки используются для многофункционального устройства. Ключ 1 используется для сопоставления отпечатка пальца и увеличения идентификатора отпечатка пальца при сохранении или удалении отпечатка пальца в системе. Ключ 2 используется для регистрации нового отпечатка пальца и для уменьшения идентификатора отпечатка пальца при сохранении или удалении отпечатка пальца в системе. Клавиша 3 используется для удаления сохраненного пальца из системы, а клавиша 4 используется для ОК. LED используется для индикации того, что отпечаток пальца обнаружен или сопоставлен. Здесь мы использовали модуль отпечатков пальцев, который работает на UART. Итак, здесь мы связали этот модуль отпечатков пальцев с микроконтроллером PIC со скоростью передачи данных по умолчанию, равной 57600.
Итак, прежде всего, нам нужно выполнить все необходимые подключения, как показано на принципиальной схеме ниже. Подключения просты, мы только что подключили модуль отпечатков пальцев к UART микроконтроллера PIC. ЖК-дисплей 16x2 используется для отображения всех сообщений. Потолок 10k также используется с ЖК-дисплеем для управления контрастностью. Выводы данных LCD 16x2 подключены к выводам PORTA. Контакты ЖК-дисплея d4, d5, d6 и d7 подключены к контактам RA0, RA1, RA2 и RA3 микроконтроллера PIC соответственно. Четыре кнопки (или клавиатура) подключены к контактам RD0, RD1, RD2 и RD PORTD. Светодиод также подключен к контакту RC3 порта PORTC. Здесь мы использовали внешний кварцевый генератор 18,432000 МГц для синхронизации микроконтроллера.
Работа датчика отпечатков пальцев с микроконтроллером PIC
Работа этого проекта проста, просто загрузите шестнадцатеричный файл, сгенерированный из исходного кода, в микроконтроллер PIC с помощью программатора PIC или записывающего устройства (PIckit2 или Pickit3 или других), а затем вы увидите несколько вводных сообщений на ЖК-дисплее, а затем пользователя будет предложено ввести выбор для операций. Чтобы сопоставить отпечаток пальца, пользователю необходимо нажать кнопку 1, после чего на ЖК-дисплее появится запрос « Поместите палец на датчик отпечатка пальца». Теперь, приложив палец к модулю отпечатка пальца, мы можем проверить, сохранены ли уже наши отпечатки пальцев. Если ваш отпечаток пальца сохранен, на ЖК-дисплее отобразится сообщение с идентификатором сохранения отпечатка пальца « ID: 2», в противном случае будет отображаться «Не найдено» .
Теперь, чтобы зарегистрировать отпечаток пальца , пользователю необходимо нажать кнопку регистрации или клавишу 2 и следовать инструкциям на ЖК-экране.
Если пользователь хочет удалить какой-либо отпечаток пальца, ему необходимо нажать кнопку удаления или клавишу 3. После этого ЖК-дисплей запросит идентификатор отпечатка пальца, который необходимо удалить. Теперь, используя кнопку увеличения или кнопку 1 (кнопка соответствия или кнопка 1) и кнопку уменьшения или кнопку 2 (кнопка регистрации или кнопка 2) для увеличения и уменьшения, пользователь может выбрать идентификатор сохраненного отпечатка пальца и нажать OK. кнопку, чтобы удалить этот отпечаток пальца. Для большего понимания посмотрите видео, предоставленное в конце проекта.
Интерфейс FingerPrint Примечание: Программа этого проекта немного сложна для новичка. Но его простой интерфейсный код сделан с помощью чтения таблицы данных модуля отпечатков пальцев r305. Вся инструкция по работе этого дактилоскопического модуля приведена в даташите.
Здесь мы использовали формат кадра для общения с модулем отпечатков пальцев. Каждый раз, когда мы отправляем команду или кадр запроса данных в модуль отпечатка пальца, он отвечает нам тем же форматом кадра, содержащим данные или информацию, относящуюся к примененной команде. Все форматы данных и командного кадра приведены в руководстве пользователя или в таблице данных модуля отпечатков пальцев R305.
Объяснение программирования
В программировании мы использовали следующий формат кадра.
Мы начинаем программу с установки битов конфигурации и определения макросов и контактов для ЖК-дисплея, кнопок и светодиода, которые вы можете проверить в полном коде, приведенном в конце этого проекта. Если вы новичок в микроконтроллере PIC, начните с раздела «Начало работы с проектом микроконтроллера PIC».
Затем мы объявили и инициализировали некоторую переменную и массив и создали фрейм, который нам нужно использовать в этом проекте для взаимодействия модуля отпечатков пальцев с микроконтроллером PIC.
учар буф; uchar buf1; изменчивый индекс uint = 0; volatile int flag = 0; uint msCount = 0; uint g_timerflag = 1; volatile uint count = 0; данные учар; 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};
После этого мы сделали ЖК-дисплей для управления ЖК-дисплеем.
void lcdwrite (uchar ch, uchar rw) { LCDPORT = ch >> 4 & 0x0F; RS = rw; EN = 1; __delay_ms (5); EN = 0; LCDPORT = канал & 0x0F; EN = 1; __delay_ms (5); EN = 0; } Lcdprint (char * str) { а (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } lcdbegin () { uchar lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; uint i = 0; для (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Данная функция используется для инициализации UART
недействительный serialbegin (UINT боды) { SPBRG = (18432000UL / (длинный) (64UL * боды)) - 1; // скорость передачи @ 18,432000 МГц тактовая частота TXSTAbits.SYNC = 0; // Установка асинхронного режима, т.е. UART RCSTAbits.SPEN = 1; // Включает последовательный порт TRISC7 = 1; // Как указано в листе данных TRISC6 = 0; // Как указано в даташите RCSTAbits.CREN = 1; // Включает непрерывный прием TXSTAbits.TXEN = 1; // Включает передачу GIE = 1; // РАЗРЕШЕНИЕ прерываний INTCONbits.PEIE = 1; // Разрешить периферийные прерывания. PIE1bits.RCIE = 1; // РАЗРЕШИТЬ прерывание приема USART PIE1bits.TXIE = 0; // отключение прерывания передачи USART PIR1bits.RCIF = 0; }
Данные функции используются для передачи команд в модуль отпечатков пальцев и получения данных от модуля отпечатков пальцев.
void serialwrite (char ch) { while (TXIF == 0); // Подождите, пока регистр передатчика станет пустым TXIF = 0; // Очистить флаг передатчика TXREG = ch; // загружаем передаваемый символ в регистр передачи } 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 (); index = 0; __delay_ms (100); для (int i = 0; i
Теперь в коде доступны четыре функции для четырех различных задач:
- Функция ввода идентификатора отпечатка пальца - блок getId ()
- Функция сопоставления пальца - void matchFinger ()
- Функция регистрации нового пальца - void enrolFinger ()
- Функция удаления пальца - void deleteFinger ()
Полный код со всеми четырьмя функциями приводится в конце.
Теперь в основной функции мы инициализируем GPIO, ЖК-дисплей, UART и проверяем, подключен ли модуль отпечатка пальца к микроконтроллеру или нет. Затем на ЖК-дисплее отображаются вводные сообщения. Наконец, в то время как цикл мы читаем все клавиши или кнопки для работы с проектом.
int main () { недействительно (* 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 («Дайджест схемы»); __delay_ms (2000); index = 0; в то время как (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint («FP не найден»); __delay_ms (2000); index = 0; } lcdwrite (1, CMD); lcdprint («Найдено FP»); __delay_ms (1000); lcdinst (); while (1) { FP = совпадение
Полный код PIC и рабочее видео приведены ниже. Также проверьте наши другие проекты с помощью модуля датчика отпечатков пальцев:
- Биометрическая машина для голосования на основе отпечатков пальцев с использованием Arduino
- Биометрическая система безопасности с использованием Arduino и датчика отпечатков пальцев
- Биометрическая система посещаемости на основе отпечатков пальцев с использованием Arduino
- Датчик отпечатков пальцев, взаимодействующий с Raspberry Pi