66 Comentários

RFID com Raspberry Pi e Python

raspberry pi

Introdução

Identificação por radiofrequência, como podemos chamar o RFID, não é uma tecnologia recente e há especulações que já era utilizada na segunda guerra mundial. É a comunicação por sinal de rádio onde um dos dispositivos é energizado e fica ativo, e o outro lado, a TAG (chaveiro ou cartão RFID), não necessariamente é energizado. Quando aproximados, realizasse a captura da informação do TAG, tecnologia essa que deu o passo inicial para NFC (Near Field Communication).

Utilizando o computador de bolso mais popular, o Raspberry Pi, a linguagem de programação Python, que é o canivete suíço para prototipar ideias, e um módulo RFID comercial vamos ver como é simples, direto e didático fazer a comunicação via SPI com essa turma. 

Não conhece muito bem o Raspberry Pi? Veja o artigo Raspberry Pi do Thiago Lima. E como vamos usar o Raspberry Pi B com Linux, para conhecer melhor essa dupla veja o artigo A Raspberry Pi e o Linux de Vinicius Maciel. Se isso não te assusta, continue lendo o artigo.

Módulo RFID

O Mifare MFRC522 (NXP RC522), ou comercialmente RFID-RC522, é um dos mais populares leitores RFID do mercado, no modo comprar, ligar e usar, uma excelente forma para prototipar.

O RFID-RC522 já vem pronto para ser utilizado, fazendo uso da comunicação SPI. Essa comunicação é nova pra você? Então recomendo o artigo Comunicação SPI do Francesco Sacco. Além disso o CI RC522 possui os recursos I2C e UART para comunicação e realiza comunicação RFID a 13.56 MHz.

Na figura 1 temos uma imagem do nosso módulo leitor RFID (RFID-RC522) e junto o que o acompanha na compra, um chaveiro e um cartão.

raspberry pi

Figura 1 - Módulo RFID com cartão e chaveiro

Segue a relação dos pinos disponíveis para alimentação e comunicação na figura 2.

raspberry pi

Figura 2 - Relação de pinos de alimentação e comunicação do módulo RFID

Esquema de ligação

Na sequência, na figura 3, o esquema de ligação do módulo RFC522 com o Raspberry Pi.

raspberry pi

Figura 3 - Esquema de ligação do módulo RFID com o GPIO do Raspberry Pi B

Apenas alguns detalhes no esquema de ligação é a alimentação 3,3V utilizando o pino 1 do barra de pinos de GPIO, e a comunicação SPI, sendo o SDA no módulo RFID o sinal CS (Chip Select) ou SS (Slave Select), que depende da adoção do fabricante, sendo o correto uso do nome SDA para comunicação I2C.

Configuração do ambiente host

  • Board: Raspberry Pi B;
  • Distribuição: Raspbian – Debian Wheezy (2014-01-07);
  • Kernel 3.12.22;
  • Python 2.7.

Preparando o ambiente

Agora a parte legal, vamos preparar o Raspbian para liberar o uso device SPI no Linux, resolver as dependências de software e testar com uma aplicação padrão de teste. Para isso, o primeiro passo é verificar se o dispositivo SPI está liberado, ou melhor, se o módulo do kernel subiu para fornecer o acesso.

Se na sua Raspberry Pi obteve as mesmas saídas acima, o módulo SPI está desabilitado. Caso contrário, pule a próxima etapa. No Raspbian isso quer dizer que ele está no black list do modprobe, e para habilitar o módulo SPI siga o passo a passo abaixo e reinicie a Raspberry Pi.

Verificando novamente:

Para ler/escrever no barramento SPI precisamos de um módulo no Python. Um que possui rotinas e funções bem escritas é o SPI-Py do Louis Thiery. Vamos clonar o repositório do GitHub, compilar e instalar. Mas antes, é necessário confirmar se possui o python-dev. Você pode verificar com o comando abaixo: 

No caso acima temos instalado. Caso não aparecesse python2.7-dev ou python-dev, poderia executar a sua instalação com o comando abaixo: 

Agora vamos clonar o repositório do SPI-Py, acessar o diretório e instalar. 

O módulo para comunicação via SPI está pronto. Agora vamos baixar de outro repositório um código exemplo pronto para comunicar com RC522, que depende do módulo SPI-Py para funcionar, no caso é o MFRC522-python que, além do SPI-Py, utiliza também o RPi.GPIO

Testando a aplicação RFID

Dos arquivos clonados do repositório e que estão no diretório MFRC522-python, o importante neste momento é saber que toda programação e tratamento do SPI com o RF522 está no arquivo MFRC522.py, e que no arquivo Read.py há um exemplo pronto para testar a comunicação e o Write.py é outro exemplo para gravação no RC522. 

No momento que aproximo o cartão: 

Agora, vamos utilizar o módulo MFRC522.py e criar uma aplicação nossa baseada no Read.py. Primeiro vou abrir o código do Read.py e comentá-lo, logo em seguida irei escrever nossa aplicação (veja os comentários para mais detalhes). 

O código foi exposto e adicionei alguns comentários para facilitar. As informações detalhadas sobre o protocolo e o modo de autenticação pode ser abstraído no datasheet do cartão RFID. No meu caso o cartão é um MIFARE Classic 4k e do código do MFRC522.py.

Agora vamos à nossa aplicação rfid_embarcados.py, onde utilizaremos a estrutura pronta do Read.py, removendo a parte de autenticação. 

No caso, para um controle simples, criei uma lista chamada acessos_autorizados=[] que contem listas de ID’s RFID. Na linha 73 verifico se o uid recebido está contido ou não da minha lista. Em caso positivo, irá imprimir “Acesso Liberado!”, caso contrário, “Sem Acesso!”. Agora vamos ver nossa aplicação em funcionamento.

A aplicação funcionou como previsto, porém, algumas implementações novas surgiram na aplicação como a função check_user() e um except ImportError. Nesses casos, estou garantindo que a aplicação só deve continuar se estiver sendo executada com permissão de super-usuário e é obrigatório ter MFRC522 e RPi.GPIO para prosseguir. Agora vamos ver o que ocorre se executar a aplicação como usuário comum e logo em seguida, executar se não tivermos o MFRC522.py. 

Para melhorar essa aplicação, poderia utilizar um banco de dados que contém os IDs com alguns nomes e informações, realizar consultas e, em caso de sucesso, poderia acionar algum GPIO e abrir uma porta ou liberar algo.

Implemente, invente e faça seus testes e qualquer dúvida envie pelos comentários.

Conclusão

Vimos como é fácil realizar a configuração do módulo ao Raspberry Pi B, como é prático preparar o Linux com Python e realizar os testes, e como é simples utilizar o módulo que baixamos para criar uma aplicação própria para ler os dados RFID. E utilizando um arquivo exemplo mais os recursos do python conseguimos criar uma aplicação simples e com recursos interessantes, como por exemplo verificar se é o root que está executando e se o módulo existe.

Referências

http://www.nxp.com/documents/data_sheet/MFRC522.pdf
https://github.com/lthiery/SPI-Py
https://github.com/mxgxw/MFRC522-python
https://pypi.python.org/pypi/RPi.GPIO
https://www.nxp.com/documents/data_sheet/MF1S70YYX.pdf

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comunicações » RFID com Raspberry Pi e Python
Talvez você goste:
Comentários:

66
Deixe um comentário

avatar
19 Comentários
47 Respostas
1 Seguidores
 
Discussão de maior alcance
Discussão mais quente
18 Autores de comentários
Fabricio RibeiroVinicius MacielRaphaelJorgeCleiton Bueno Comentários recentes
  Notificações  
recentes antigos mais votados
Notificar
Fabricio Ribeiro
Visitante
Fabricio Ribeiro

Srs, por acaso o Raspberry Pi 3 e este codigo seria compativel com leitor RFID da Intelbras (ex. LE 130) ? O Leitor tem comunicação Wiegand.
Obrigado pela ajuda

Raphael
Visitante
Raphael

Pessoal, boa tarde!

Já segui várias instruções e sempre acabo no mesmo lugar. Ao executar qualquer script que envolva o módulo MFRC22, recebo o erro:

TypeError: function takes exactly 2 arguments (1 given).

Alguma ideia ou procedimento que posso tomar para solucionar isso?

Obrigado.

Vinicius Maciel
Membro
Jorge
Visitante
Jorge

Gostei do artigo, obrigado e parabens!!

Matheus George Abel
Visitante
Matheus Abel

Olá Cleiton, estou tentando implementar este artigo em uma BeagleBone Black, acha que é possível? Há alguma diferença significativa na parte de configuração dos módulos do kernel para comunicação SPI? Obrigado.

tiago
Visitante
tiago

Olá, gostaria de saber se é possível e como realizar a leitura da RFID e consulta em um banco de dados que esta em um servidor, tudo isso via rede.

Henrique Freitas
Visitante
Henrique Freitas

1 ano depois... rsrs
Ficou show o artigo, queria tirar um duvida, seria possivel ligar dois Leitor RFID na mesma Raspberry?

Erivando Sena
Visitante
Erivando Sena

@disqus_KeXn2J9V3p:disqus Sim é possível!
Talvez esta resposta esteja chegando tarde, mas, pode ser que outras pessoas estejam com a mesma dúvida, por isso, eu apresento a solução neste link: https://github.com/erivandoramos/TwoRC522RPi

rwd
Visitante
rwd

Oi Cleiton

já li todos estes comentários, e não consigo entender porque não consigo ler o UID correto , sempre recebo esses pares de números esquisitos [177, 26, 232, 158, 221] ao invés do hexadecimal 9EE81AB1 que seria o decimal 2666011313 correto da minha Tag, alguma sugestão? por acaso eu teria de fazer algum ajuste no script MFRC522.py ?

Javier Thevenet
Visitante
Javier Thevenet

hola, quisiera hacer una consulta sobre el modulo MFRC522. Segui todos los pasos de este post

pero cuando ejecuto Read.py no detecta la tarjeta ni el llavero.He probado con varias tarjetas y llaveros. Verifique conexiones y todos los pasos.
Alguna sugerencia para que pueda hacer funcionar el modulo? Gracias!

Cleiton Bueno
Visitante

Hola javier. Su tarjeta RFID también se MIFARE? ¿Qué error?

Bruno Oliveira de Faria
Visitante
Bruno Oliveira de Faria

Cleiton estou querendo escrever em uma tag rfid, você pode informar como ou conhece algum site que descreva sobre isto?

Cleiton Bueno
Visitante

Olá Bruno,

recomendaria você ler o artigo do Henrique Puhlmann (http://embarcados.com.br/introducao-a-tecnologia-de-identificacao-rfid/) ele aborda com muitos detalhes o RDIF e principalmente as classes e você terá a resposta para as duas perguntas sobre ler e/ou escrever em um ou o que são os números que aparecem.

Abraço.

Bruno Oliveira de Faria
Visitante
Bruno Oliveira de Faria

Cleiton, você sabe me dizer o que representa cada número desse UID "227, 41, 93, 116" ?

Cleiton Bueno
Visitante

Recomendo a leitura no caso do artigo usei este da MIFARE:

http://www.nxp.com/documents/data_sheet/MF1S70YYX.pdf

E este outro link:
http://www.corerfid.com/Files/077%20Mifare%20Codes%20FAQ.pdf

Pra você entender o que é UID e quando/como pode modificá-lo de acordo com o modelo que possuir.

Séries

Menu