Controle de acesso com Arduino, tags iButton, SD, display LCD e relógio de tempo real
É fácil fazer um sistema de registro e controle de acesso com Arduino – apesar do número de pinos e de protocolos, a montagem e programação dos elementos básicos não envolve maiores obstáculos.
Encarei o desafio de projetar e programar um sistema de controle e registro de acesso, usando as resistentes tags iButton (como as da imagem abaixo) para identificar os usuários que podem ou não passar pelo sistema. O convite foi da Usinainfo, que patrocinou o experimento que deu origem a este artigo (obrigado!).
Quando recebe o contato de um iButton em seu leitor, o sistema mostrado acima (e descrito e disponibilizado abaixo) segue esta sequência:
- lê o identificador do iButton
- verifica em um cartão SD qual iButton pode ou não ter acesso
- exibe o resultado dessa verificação em um display LCD
- caso o acesso tenha sido autorizado, aciona durante 3 segundos um relé.
Este relé poderia estar conectado a uma tranca de porta, um motor de portão ou ao mecanismo de liberação de uma catraca, mas no meu protótipo ele está conectado a um prosaico led verde, que simboliza a liberação do acesso, e fica aceso enquanto o relé estiver acionado.
Para poder gravar no SD um registro minimamente útil dos acessos liberados (ou não), incluí no sistema um módulo RTC (relógio de tempo real) com bateria, que permite identificar a data e hora correntes. Já que esse dado estava disponível, passei a exibi-lo também no display LCD, como seria obrigatório se a aplicação fosse um sistema de ponto eletrônico, por exemplo.
A implementação foi no estilo demonstrativo de tecnologias: me preocupei muito mais em fazer um exemplo prático de cada uma das operações básicas de um sistema do gênero, do que em produzir um sistema aplicável a alguma situação prática. Se o que você procura é a solução para uma aplicação prática, é possível que o meu sistema sirva como base, mas provavelmente não estará pronto para o que você deseja.
Sistemas de registro e controle de acesso
Um sistema de controle de acesso geralmente envolve uma forma de identificar1 quem tenta o acesso, verificar em um cadastro se esse acesso é autorizado, e acionar (ou não) algum mecanismo de abertura ou liberação.
Quando o sistema também é registro de acesso ou de frequência, isso ainda envolve gravar em um arquivo todas as passagens autorizadas, e as não autorizadas também. Esse tipo de comportamento ocorre em sistemas de ponto eletrônico, movimentação de estoque, de frota, de frequência (por exemplo, em academias de ginástica e colégios), de verificacão de rondas e mais.
Em geral ambos os sistemas são complementados por módulos administrativos, em geral externos ao hardware de controle/registro: por exemplo, para manter um cadastro de autorizações de acesso, ou para obter os registros de acesso e processá-los na forma de relatórios, ou ainda para lancár movimentações de estoque ou de folha de pagamento a partir deles.
Eu implementei, como protótipo de hardware e o software necessário para operá-lo, os fundamentos funcionais dos 2 primeiros elementos acima: controle de acesso e registro de acesso.
O hardware e a montagem do circuito
Para desenvolver este sistema, fiz uso dos seguintes componentes ou módulos:
- Um leitor de iButton (fornecido pela Usinainfo).
- Duas tags iButton (fornecidas pela Usinainfo)
- Um módulo para leitura e gravação de cartões microSD (fornecido pela Usinainfo)
- Um display LCD 16x2
- Um módulo de tempo real Tiny RTC
- Um relé
- 5 resistores variados
- 1 diodo IN4007
- 1 transistor NPN 2N2222
- 1 led verde
- Arduino, breadboard, jumpers, alimentação elétrica
As conexões, interfaces e programação de cada um dos módulos e elementos do sistema já foram apresentadas nos seguintes artigos anteriores:
- Arduino: como ler tags iButton
- Arduino e cartões SD, MicroSD e SDHC
- Data, hora e memória extra no Arduino com o módulo Tiny RTC e o chip DS1307
- LCD: Arduino e o display LCD 1602 (HD44780, SPLC780D)
- Controlando um relé no Arduino com segurança: Blink, diodo e transistor
Não vou detalhar novamente o que já consta nos artigos acima, pois eu mesmo os usei como referência, de modo a manter a similaridade com as implementações deles, permitindo que você também os consulte para saber os detalhes (pinagem, programação, etc.) de cada item.
Preparei, mesmo assim, um diagrama geral das conexões entre os diversos elementos. Simplifiquei a notação e repeti múltiplas vezes os pinos 5V e GND do Arduino para facilitar a leitura:
Seguem os valores dos resistores: R1 e R2 são de 300Ω, R3 é de 2,4KΩ,m R4 é de 100Ω e R5 é de 1KΩ. Os demais componentes já foram identificados acima, no texto.
Montado na forma de protótipo, o sistema ficou assim:
Note a quantidade de jumpers: parece uma bomba-relógio de filme enlatado! Isso ocorre porque cada um dos módulos usa um protocolo diferente, e assim não podem compartilhar pinos.
Mas isso é um problema apenas para a montagem: ainda sobraram pinos suficientes do Arduino para agregar alguns componentes adicionais, caso venha a ser necessário.
Um sistema de registro de acesso com Arduino e iButton
Para maior familiarização com o iButton, desenvolvi um sistema simples de controle de acesso, com autorização por meio da tag (o chaveirinho...), registro em um arquivo das entradas e também das tentativas não autorizadas, e comando de um relé para simular a abertura automática de uma catraca quando o acesso é autorizado.
Para simular as funcionalidades, recorri a mais alguns componentes: um display LCD para informações ao usuário, um RTC para poder contar com o registro real do horário, e um leitor de cartão SD para ter acesso a um arquivo de autorização de tag, bem como para gravar o registro. Numa aplicação real provavelmente eu optaria por usar serviços de rede para obter a lista de tags autorizados e para registrar o log, mas isso tornaria nosso exemplo complexo demais.
A parte do sistema que vamos simular é basicamente um loop das seguintes operações:
- Aguarda o contato de uma tag no leitor
- Compara a identificação da tag com a autorização lida do SD
- Se autorizado, sinaliza, abre o relé da catraca e grava no registro
- Se não autorizado, sinaliza e grava no registro
Claro que isso também envolverá as funções de inicialização e operação do leitor de iButton, do mostrador LCD, do relógio de tempo real e do leitor de SD.
Atenção a quem procura um relógio-ponto eletrônico com Arduino: no projeto, cumpri alguns dos requisitos legais para registro de ponto eletrônico, como a exibição contínua da hora no mostrador digital, mas ignorei outros, como a presença de uma impressora integrada ou a geração de arquivos para fiscalização. Não use o controle de acesso do meu software como base para algum sistema com finalidades trabalhistas sem incluir nele as funcionalidades adicionais, portanto!
Outra limitação a considerar é que este experimento desconsidera as funcionalidades de administração, ou seja, não incluí no software o recurso para cadastrar/autorizar/desautorizar uma tag iButton (embora isso possa ser feito editando um arquivo-texto no cartão SD), nem para acertar o horário do relógio de tempo real, por exemplo. Incluir esses recursos ampliaria muito o escopo do experimento, sem contribuir nada adicional para a finalidade desejada.
O programa de registro de acesso para o Arduino
O código completo do programa pode ser obtido abaixo, mas antes de chegar a ele quero explicar o seu núcleo: a função loop()
:
Vou descrevê-la em linhas gerais, na sua sequência básica:
- Certifica-se de que o relé está desativado
- Atualiza o relógio na tela do LCD
- Caso uma tag tenha sido encostada no leitor:
- Lê os 8 últimos dígitos hexa do código da tag e armazena na variável SID2.
- Se esta tag estiver autorizada:
- Ativa o relé
- Avisa no LCD que o acesso foi autorizado
- Grava no log a informação sobre o acesso autorizado
- Aguarda 2 segundos
- Apaga o LCD
- Senão:
- Avisa no LCD que o acesso foi negado
- Grava no log a informação sobre o acesso negado
- Aguarda 2 segundos
- Apaga o LCD
Observe com atenção e note que, enquanto ninguém encostar um iButton no leitor, o programa vai ficar apenas se certificando de que o relé (que é o elemento que pode estar conectado a uma catraca ou fechadura) não está acionado, e atualizando o relógio no LCD.
E se alguém encostar uma tag, ele vai identificá-la e consultar se deve liberar o acesso (acionando o relé) ou não, exibindo mensagens apropriadas a cada caso no LCD e registrando a ocorrência no log.
Você pode fazer o download do programa completo, e usar como referência os links mencionados acima, para entendê-lo.
Exercícios para o leitor
Algumas das decisões que tomei na montagem do circuito e no desenvolvimento do programa permitem alguns exercícios interessantes para estendê-lo e entendê-lo. Eis algumas sugestões:
- Durante o upload de código para o Arduino, você pode ouvir o relé ser acionado algumas vezes. Você consegue identificar a razão? O que faria para impedir esse efeito? Dica: a mesma razão prejudica o acionamento do relé se você tentar usar as funções Serial.begin ou Serial.print.
- O led vermelho do leitor de iButton fica permanentemente aceso. Como você mudaria o circuito e o programa para fazê-lo piscar por 200ms a cada 3 segundos?
- A função
gravaLog()
registra a hora, mas não a data dos eventos. Como você acrescentaria a data? - Na inicialização, o programa lê do arquivo tag1_aut.txt, do cartão SD, apenas UM identificador de iButton que irá ser tratado como autorizado. Como você faria para que até 10 identificadores pudessem ser lidos e usados pelo programa?
- Como você faria para que a apresentação do iButton ao leitor precisasse ser complementada por uma senha?
Patrocínio: UsinaInfo
Quero agradecer à UsinaInfo, que vem patrocinando alguns experimentos do BR-Arduino, inclusive este com tags iButton e o seu leitor.
Além de receber material da empresa para os experimentos como parte do acordo de patrocínio, eu já fiz compras de componentes lá, aproveitando a variedade, o estoque bem suprido, as descrições detalhadas e a qualidade do seu sistema de comércio eletrônico. Recomendo sem ressalvas.
Agradeço também pela confiança que ficou expressa nos termos do patrocínio: a empresa me enviou os componentes necessários ao experimento combinado (um sistema de registro de acesso), mas não fez qualquer exigência sobre a forma e nem buscou exercer controle sobre o que eu fosse escrever. Nem sempre os termos são tão amplos, ainda mais para um blog recém-iniciado. Obrigado, UsinaInfo!
- A identificação de usuários pode ocorrer a partir de algo que o usuário tem, sabe ou é – exemplos são uma chave, uma senha e uma impressão digital, respectivamente. Os modos podem ocorrer de forma concomitante: smartcard + senha, por exemplo. Neste artigo tratamos apenas do modo baseado na posse de uma chave ou identificador. ↩
- Veja a advertência sobre o possível de problema de usar só os 4 últimos dígitos, no artigo Arduino: como ler tags iButton ↩
Comentar