- Componentes Requeridos
- Diagrama de Circuito e Explicação
- Operação do sensor de impressão digital com microcontrolador PIC
- Explicação de programação
O sensor de impressão digital, que víamos em filmes de ficção científica há alguns anos, agora se tornou muito comum para verificar a identidade de uma pessoa para diversos fins. Atualmente, podemos ver sistemas baseados em impressão digital em toda a nossa vida diária, como atendimento em escritórios, verificação de funcionários em bancos, retirada de dinheiro ou depósitos em caixas eletrônicos, verificação de identidade em escritórios do governo, etc. Já fizemos interface com o Arduino e com o Raspberry Pi, hoje faremos a interface do sensor de impressão digital com o microcontrolador PIC. Usando este microcontrolador PIC PIC16f877A sistema de impressão digital, podemos registrar novas impressões digitais no sistema e excluir as impressões digitais já alimentadas. O funcionamento completo do sistema foi mostrado no Vídeo fornecido no final do artigo.
Componentes Requeridos
- Microcontrolador PIC16f877A
- Módulo de impressão digital
- Botões de pressão ou teclado
- LCD 16x2
- Pote de 10k
- Oscilador de cristal de 18,432000 MHz
- Bread Board ou PCB (pedido da JLCPCB)
- Fios de ligação
- LED (opcional)
- Resistor 150 ohm -1 k ohm (opcional)
- Fonte de alimentação 5v
Diagrama de Circuito e Explicação
Neste projeto de interface do sensor de impressão digital do microcontrolador PIC, usamos 4 botões de pressão: esses botões são usados para multifunções. A tecla 1 é usada para combinar a impressão digital e aumentar a ID da impressão digital ao armazenar ou excluir a impressão digital no sistema. A chave 2 é usada para registrar a nova impressão digital e para diminuir o ID da impressão digital ao armazenar ou excluir a impressão digital no sistema. A tecla 3 é usada para excluir o dedo armazenado do sistema e a tecla 4 é usada para OK. Um LED é usado para uma indicação de que a impressão digital foi detectada ou combinada. Aqui, usamos um módulo de impressão digital que funciona no UART. Aqui, conectamos este módulo de impressão digital com o microcontrolador PIC em sua taxa de transmissão padrão que é 57600.
Portanto, em primeiro lugar, precisamos fazer todas as conexões necessárias conforme mostrado no Diagrama de Circuito abaixo. As conexões são simples, acabamos de conectar o módulo de impressão digital ao UART do microcontrolador PIC. Um LCD 16x2 é usado para exibir todas as mensagens. Um potenciômetro de 10k também é usado com LCD para controlar o contraste do mesmo. Os pinos de dados de LCD 16x2 são pinos PORTA conectados. Os pinos d4, d5, d6 e d7 do LCD são conectados aos pinos RA0, RA1, RA2 e RA3 do microcontrolador PIC, respectivamente. Quatro botões (ou teclado) são conectados aos pinos RD0, RD1, RD2 e RD do PORTD. O LED também está conectado no pino RC3 da porta PORTC. Aqui, usamos um oscilador de cristal externo de 18,432000 MHz para sincronizar o microcontrolador.
Operação do sensor de impressão digital com microcontrolador PIC
A operação deste projeto é simples, basta fazer o upload do arquivo hex, gerado a partir do código-fonte, no microcontrolador PIC com a ajuda do programador ou gravador PIC (PIckit2 ou Pickit3 ou outros) e então você verá algumas mensagens de introdução no LCD e então o usuário será solicitado a inserir uma opção de operação. Para coincidir com a impressão digital, o usuário precisa pressionar a tecla 1 e, em seguida, o LCD pedirá Coloque o dedo no sensor de impressão digital. Agora, colocando um dedo sobre o módulo de impressão digital, podemos verificar se nossas impressões digitais já estão armazenadas ou não. Se a sua impressão digital for armazenada, o LCD mostrará a mensagem com o ID de armazenamento do tipo ' ID: 2', caso contrário, mostrará 'Não encontrado' .
Agora, para registrar uma impressão digital , o usuário precisa pressionar o botão de registro ou a tecla 2 e seguir as mensagens de instruções na tela LCD.
Se o usuário quiser excluir alguma impressão digital, deverá pressionar o botão ou tecla de exclusão 3. Depois disso, o LCD solicitará a identificação da impressão digital que deve ser excluída. Agora, usando o botão de incremento ou a tecla 1 (botão correspondente ou tecla 1) e o botão de decremento ou tecla 2 (botão de inscrição ou tecla 2) para incremento e decremento, o usuário pode selecionar o ID da impressão digital salva e pressionar OK botão para excluir essa impressão digital. Para mais compreensão, dê uma olhada no vídeo fornecido no final do projeto.
Interface de impressão digital Nota: O programa deste projeto é um pouco complexo para um iniciante. Mas seu código de interface simples feito usando a leitura da ficha técnica do módulo de impressão digital r305. Todas as instruções de funcionamento deste módulo de impressão digital são fornecidas na ficha técnica.
Aqui, usamos um formato de quadro para falar com o módulo de impressão digital. Sempre que enviamos um comando ou quadro de solicitação de dados para o módulo de impressão digital, ele nos responde com o mesmo formato de quadro contendo dados ou informações relacionadas ao comando aplicado. Todos os dados e formato do quadro de comando foram fornecidos no manual do usuário ou na folha de dados do módulo de impressão digital R305.
Explicação de programação
Na programação, usamos o formato de quadro abaixo.
Iniciamos o programa definindo os bits de configuração e definindo macros e pinos para LCD, Botões e LED, que você pode verificar no código completo fornecido no final deste projeto. Se você é novo no microcontrolador PIC, comece com Getting started with PIC Microcontroller Project.
Em seguida, declaramos e inicializamos algumas variáveis e array, e fizemos um quadro que precisamos usar neste projeto para fazer a interface do módulo de impressão digital com o microcontrolador PIC.
uchar buf; uchar buf1; índice uint volátil = 0; bandeira int volátil = 0; uint msCount = 0; uint g_timerflag = 1; contagem de uint volátil = 0; dados 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};
Depois disso, criamos a função LCD para conduzir o 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; para (i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
A função dada é usada para inicializar UART
void serialbegin (uint baudrate) { SPBRG = (18432000UL / (long) (64UL * baudrate)) - 1; // taxa de transmissão @ 18.432000Mhz Clock TXSTAbits.SYNC = 0; // Configurando o modo assíncrono, ou seja, UART RCSTAbits.SPEN = 1; // Ativa a porta serial TRISC7 = 1; // Conforme prescrito na folha de dados TRISC6 = 0; // Conforme prescrito na folha de dados RCSTAbits.CREN = 1; // Ativa a recepção contínua TXSTAbits.TXEN = 1; // Habilita a transmissão GIE = 1; // ATIVAR interrupções INTCONbits.PEIE = 1; // Ativa interrupções periféricas. PIE1bits.RCIE = 1; // HABILITA USART para receber interrupção PIE1bits.TXIE = 0; // desativa a interrupção USART TX PIR1bits.RCIF = 0; }
As funções fornecidas são usadas para transferir comandos para o módulo de impressão digital e receber dados do módulo de impressão digital.
void serialwrite (char ch) { while (TXIF == 0); // Espere até que o registrador do transmissor fique vazio TXIF = 0; // Apaga o sinalizador do transmissor TXREG = ch; // carrega o caractere a ser transmitido para transmitir reg } serialprint (char * str) { while (* str) { serialwrite (* str ++); } } cancelar interrupção SerialRxPinInterrupt (void) { if ((PIR1bits.RCIF == 1) && (PIE1bits.RCIE == 1)) { uchar ch = RCREG; buf = ch; if (índice> 0) flag = 1; RCIF = 0; // limpar sinalizador rx } } void serialFlush () { for (int i = 0; i
Depois disso, precisamos fazer uma função que prepara os dados que serão transmitidos para a impressão digital e decodificar os dados vindos do módulo de impressão digital.
int enviarcmd2fp (char * pack, int len) { uint res = ERROR; serialFlush (); índice = 0; __delay_ms (100); para (int i = 0; i
Agora, existem quatro funções disponíveis no código para quatro tarefas diferentes:
- Função para inserir o ID da impressão digital - unidade getId ()
- Função para correspondência de dedo - void matchFinger ()
- Função para registrar novo dedo - void enrolFinger ()
- Função para excluir um dedo - void deleteFinger ()
O código completo com todas as quatro funções é fornecido no final.
Agora na função principal, inicializamos GPIOs, LCD, UART e verificamos se o módulo de impressão digital está conectado a um microcontrolador ou não. Em seguida, ele mostra algumas mensagens de introdução no LCD. Finalmente, em enquanto loop de lermos todas as chaves ou botões para operar o projeto.
int main () { void (* FP) (); ADCON1 = 0b00000110; LEDdir = 0; SWPORTdir = 0xF0; SWPORT = 0x0F; serialbegin (57600); LCDPORTDIR = 0x00; TRISE = 0; lcdbegin (); lcdprint ("Impressão digital"); lcdwrite (192, CMD); lcdprint ("Interface"); __delay_ms (2000); lcdwrite (1, CMD); lcdprint ("Usando PIC16F877A"); lcdwrite (192, CMD); lcdprint ("Circuit Digest"); __delay_ms (2000); índice = 0; while (sendcmd2fp (& passPack, sizeof (passPack))) { lcdwrite (1, CMD); lcdprint ("FP não encontrado"); __delay_ms (2000); índice = 0; } lcdwrite (1, CMD); lcdprint ("FP encontrado"); __delay_ms (1000); lcdinst (); enquanto (1) { FP = combinar
O código PIC completo e um vídeo de trabalho são fornecidos abaixo. Verifique também nossos outros projetos usando o Módulo Sensor de Impressão Digital:
- Máquina de votação biométrica baseada em impressão digital usando Arduino
- Sistema de segurança biométrica usando Arduino e sensor de impressão digital
- Sistema de atendimento biométrico baseado em impressão digital usando Arduino
- Interface do sensor de impressão digital com Raspberry Pi