Leitores e tags RFID (Radio Frequency Identification, ou Identificação por Radiofrequência) costumam ser utilizados para controle de acesso, identificação de pessoas e equipamentos, seja por meio de crachás ou etiquetas aplicadas à produtos. Neste post vamos ver como utilizar o módulo RFID com Raspberry Pi, criando um controle de acesso para o seu projeto.
No Raspbberry Pi a comunicação do leitor RFID RC522 é feita através da interface SPI (Serial Peripheral Interface). O SPI utiliza comunicação síncrona, full duplex, utilizando o modelo de comunicação mestre-escravo. Na imagem abaixo é possível observar quais são os pinos correspondentes ao SPI na GPIO do Raspberry Pi 3, eles estão destacados com a cor roxa.
Conexão módulo RFID com Raspberry Pi
Na tabela abaixo está descrito o pino do módulo RFID e seu respectivo pino/GPIO. Siga o esquema de conexão mostrado na tabela para utilizar o RFID com Raspberry Pi 3. Atenção, a tensão do módulo é de 3.3 volts.
Preparando o ambiente
Esse passo a passo é para o Raspbian Jessie versão 2016-03-18 (download), versões após esta release estão com problemas na interface SPI, e versões do Wheezy não suportam Device Tree, usado no exemplo abaixo. Leia mais sobre Device Tree na documentação do Raspberry. Caso você deseje configurar outra versão do Raspbian siga o tutorial da documentação do SPI.
O Raspbian vem com SPI desabilitado por padrão, para verificar se está ou não habilitado vamos executar o comando a seguir:
ls /dev/spi*
Se o resultado for o seguinte:
ls: cannot access /dev/spi*: No such file or directory
Nesse caso devemos habilitar o SPI. Para habilitar o SPI no Raspbian acesse o Menu > Preferences > Raspberry Pi Configuration e na aba Interface habilite SPI. Clique em OK.
Em seguida, no seu editor de texto preferido abra o arquivo /boot/config.txt (como root) e adicione a seguinte linha:
dtoverlay=spi-bcm2708
Reinicie o Raspbian e verifique novamente, o resultado deverá ser:
/dev/spidev0.0 /dev/spidev0.1
Verifique se o módulo SPI foi carregado corretamente através do comando:
dmesg | grep spi
O resultado deverá ser algo semelhante ao abaixo, indicando a comunicação RFID com Raspberry Pi:
[ 6.240564] bcm2708_spi 3f204000.spi: master is unqueued, this is deprecated [ 6.241262] bcm2708_spi 3f204000.spi: SPI Controller at 0x3f204000 (irq 80)
Para utilizar o módulo RC522 no Python necessitamos instalar alguns componentes antes de começar a programar. Primeiramente iremos instalar o pacote python-dev através do comando:
sudo apt-get install python-dev
Após instalado iremos instalar o pacote Python para comunicação SPI, para isto execute os comandos abaixo:
git clone https://github.com/lthiery/SPI-Py.git cd SPI-Py sudo python setup.py install
Programa para leitura de cartão RFID
Primeiramente vamos criar uma pasta chamada leitor-rfid para armazenar nosso projeto, para isto execute o comando:
mkdir -p /home/pi/leitor-rfid && cd /home/pi/leitor-rfid
Após criar a pasta onde armazenaremos nosso projeto, iremos fazer download do arquivo para fazer comunicação com o módulo RC522 através do comando:
wget https://raw.githubusercontent.com/mxgxw/MFRC522-python/master/MFRC522.py
Abaixo está o código para leitura das Tags RFID.
#!/usr/bin/env python # -*- coding: utf8 -*- import time import RPi.GPIO as GPIO import MFRC522 # UID dos cartões que possuem acesso liberado. CARTOES_LIBERADOS = { '4F:FD:2F:0:9D': 'MakerHero', '3C:2F:4F:0:2D': 'Teste', } try: # Inicia o módulo RC522. LeitorRFID = MFRC522.MFRC522() print('Aproxime seu cartão RFID') while True: # Verifica se existe uma tag próxima do módulo. status, tag_type = LeitorRFID.MFRC522_Request(LeitorRFID.PICC_REQIDL) if status == LeitorRFID.MI_OK: print('Cartão detectado!') # Efetua leitura do UID do cartão. status, uid = LeitorRFID.MFRC522_Anticoll() if status == LeitorRFID.MI_OK: uid = ':'.join(['%X' % x for x in uid]) print('UID do cartão: %s' % uid) # Se o cartão está liberado exibe mensagem de boas vindas. if uid in CARTOES_LIBERADOS: print('Acesso Liberado!') print('Olá %s.' % CARTOES_LIBERADOS[uid]) else: print('Acesso Negado!') print('nAproxime seu cartão RFID') time.sleep(.25) except KeyboardInterrupt: # Se o usuário precionar Ctrl + C # encerra o programa. GPIO.cleanup() print('nPrograma encerrado.')
Salve este arquivo como leitor.py dentro da pasta do nosso projeto e execute através do comando:
python leitor.py
Ao aproximar uma tag RFID do módulo, caso o UID esteja na lista CARTOES_LIBERADOS você verá uma mensagem semelhante a abaixo:
Aproxime seu cartão RFID Cartão detectado! UID do cartão: 4F:FD:2F:0:9D Acesso Liberado! Olá MakerHero.
Caso contrário será exibida uma mensagem semelhante a esta:
Aproxime seu cartão RFID Cartão detectado! UID do cartão: 6B:4:FE:E5:74 Acesso Negado!
Para descobrir o UID da sua tag basta aproximá-la do leitor RFID e esperar a mensagem de acesso negado. Após edite o arquivo leitor.py e adicione o UID na lista CARTOES_LIBERADOS.
Gostou? Deixe seu comentário logo abaixo.
boa noite, tentei rodar o programa porém acabou ocorrendo um problema na importação da biblioteca do MFRC522, mais especificamente na linha 310 do código da biblioteca MFRC522, em print “size: “+ str(backData[0]), o que posso fazer?
Bom dia.
Recomendo desinstalar o programa e apagar todas as pastas/bibliotecas existentes, para evitar algum problema de incompatibilidade.
Ai instale novamente tudo e veja se deu certo.
Att.
Vitor Mattos.
Suporte Técnico MakerHero.
Boa tarde, como seria a programação para utilizar um NFC PN532?
Olá Daniel,
Acredito que este link aqui possa te ajudar: https://blog.stigok.com/2017/10/12/setting-up-a-pn532-nfc-module-on-a-raspberry-pi-using-i2c.html
Abraços!
Vinícius – Equipe MakerHero
Bom conteúdo
Poderiam atualizar o post para funcionar na versão mais recente do respbian ?
Gostaria que alguém me ajudasse…
Quero adicionar a este projeto um display nokia 5110, porém o display utiliza alguns dos mesmos pinos utilizados pelo RC522 (por exemplo os pinos 23 SDA e SCK 24).
Como devo fazer para utilizar os dois dispositivos ao mesmo tempo?
Luciano,
Talvez uma solução diferente seria utilizar um display que possua conexão I2C.
Abraços!
Diogo – Equipe MakerHero
Olá! Qual é a distância máxima entre o leitor e o cartão para a leitura do cartão. Obrigado.
Olá Lucas,
É de 5~7cm.
Abraço!
Rosana – Equipe MakerHero
Boa tarde!
Estou desenvolvendo um projeto de controle de acesso utilizando o raspberry pi, poré estou utilizando outro leitor, o Reader Windows, estou com dificuldades com a leitura dos dados feito pelo leitor. Vocês consegue me ajudar??
Olá Guilherme,
Por favor, dê mais detalhes sobre a dificuldade que tem. Você está com problemas em fazer o leitor funcionar, na interpretação dos dados, …?
Abraço!
Rosana – Equipe MakerHero
Aki estou com problemas na execução do leitor.py, sou iniciante em python e no raspberry e tava usando esse tutorial como um teste para um pre projeto.
python leitor.py
/home/pi/leitor-rfid/MFRC522.py:133: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(self.NRSTPD, GPIO.OUT)
Traceback (most recent call last):
File “leitor.py”, line 16, in
LeitorRFID = MFRC522.MFRC522()
File “/home/pi/leitor-rfid/MFRC522.py”, line 135, in __init__
self.MFRC522_Init()
File “/home/pi/leitor-rfid/MFRC522.py”, line 406, in MFRC522_Init
self.MFRC522_Reset();
File “/home/pi/leitor-rfid/MFRC522.py”, line 138, in MFRC522_Reset
self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
File “/home/pi/leitor-rfid/MFRC522.py”, line 141, in Write_MFRC522
spi.transfer(((addr<<1)&0x7E,val))
TypeError: function takes exactly 2 arguments (1 given)
Olá Bruno,
Qual versão do Raspbian você está usando?
Abraço!
Rosana – Equipe MakerHero
Olá Rosana, eu revisei tudo e consegui um avanço melhor, mais acabei travando em outra parte. E veio a ocorrer esse erro abaixo:
python leitor.py
Traceback (most recent call last):
File “leitor.py”, line 6, in
import MFRC522
File “/home/pi/leitor-rfid/MFRC522.py”, line 25, in
import spi
ImportError: No module named spi
Conseguiria me explicar o que ocorreu e se tem solução?
Olá Bruno,
O problema parece estar relacionado ao arquivo do MFRC522.
Boa tarde Rosana, estou tendo este mesmo problema, no meu rasp quando uso o o python 2.7.13 funciona a leitura das comandas, porém ao utilizar o python 3.5.3 ele não localiza o SPI no import, meu projeto esta em python 3, poderia me ajudar?
Olá André,
Vamos verificar o que está acontecendo. Assim que tivermos uma resposta, aviso por aqui.
Abraço!
Rosana – Equipe MakerHero
No meu raspberry também dá esse problema. A versão do Raspbian é GNU/Linux 10 \n \l. O que devo fazer?
Olá.
Recebo o seguinte erro ao tentar rodar o código
Traceback (most recent call last):
File “leitor.py”, line 16, in
LeitorRFID = MFRC522.MFRC522()
File “/home/pi/leitor-rfid/MFRC522.py”, line 135, in __init__
self.MFRC522_Init()
File “/home/pi/leitor-rfid/MFRC522.py”, line 406, in MFRC522_Init
self.MFRC522_Reset();
File “/home/pi/leitor-rfid/MFRC522.py”, line 138, in MFRC522_Reset
self.Write_MFRC522(self.CommandReg, self.PCD_RESETPHASE)
File “/home/pi/leitor-rfid/MFRC522.py”, line 141, in Write_MFRC522
spi.transfer(((addr<<1)&0x7E,val))
TypeError: function takes exactly 2 arguments (1 given)
Pode me ajudar?
Olá,
Você seguiu o procedimento “Preparando o ambiente” corretamente?
Abraço!
Rosana – Equipe MakerHero
Olá, tive esse problema também.
A versão da biblioteca SPI mudou e acredito que a biblioteca do RFID quebrou por isso.
Eu resolvi pegando no GIT uma versão mais antiga da biblioteca SPI e instalando.
Olá Alexandre!
Obrigada pelo aviso. Vamos revisar o tutorial com as versões mais atuais das bibliotecas.
Abraço!
Rosana – Equipe MakerHero
git clone https://github.com/lthiery/SPI-Py.git
git checkout 8cce26b9ee6e69eb041e9d5665944b88688fca68
sudo python setup.py install
O meu está dando erro (File “leitor.py”, line 3
SyntaxError: ‘utf8’ codec can’t decode byte 0xf5 in position 0: invalid start byte
)
Olá Eduardo!
Você tentou compilar o código do post e deu isso? Copiou e colou tudo direto?
Estranho que a linha 3 é um espaço em branco.
Abraços!
André – Equipe MakerHero
E como gravar o cartão ?
Olá Sergio!
Já fizemos isso no Arduino:
https://www.makerhero.com/blog/como-gravar-dados-no-cartao-rfid/
Abraços!
André – Equipe MakerHero
Boa tarde.
Comprei o kit aqui pelo site para iniciar os testes.
Terias como disponibilizar as imagens das conexões?
No tutorial consta como: e
Desde já agradeço.
Olá Passos!
Basta fazer essas conexões
SPI0 MOSI – GPIO 10 – Pino 19
SPI0 MISO – GPIO 9 – Pino 21
SPI0 SCLK – GPIO 11 – Pino 23 (SCK)
SPI0 CS0 – GPIO 8 – Pino 24 (SDA)
SPI0 CS1 – GPIO 7 – Pino 26
Abraços!
André – Equipe MakerHero
Bom dia. Estou seguindo passo-a-passo mas estou obtendo o erro abaixo. Hel.
>>> %Run rfidbase.py
Traceback (most recent call last):
File “/home/pi/rfidbase.py”, line 17, in
LeitorRFID = MFRC522.MFRC522()
File “/home/pi/MFRC522.py”, line 111, in __init__
spi.openSPI(device=dev,speed=spd)
AttributeError: module ‘spi’ has no attribute ‘openSPI’
>>>
Olá Laercio.
Você precisa seguir o tutorial do SPI para configurar a comunicação corretamente.
https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md
Abraços!
André – Equipe MakerHero
Boas,
Tentei seguir este guia porém logo no inicio quando tento verificar se o módulo SPI foi carregado corretamente com o comando
dmesg | grep spi
obtenho a resposta no terminal:
[ 6.279967] spi spi0.0: setting up native-CS0 as GPIO 8
[ 6.280399] spi spi0.0: setting up native-CS1 as GPIO 7
Ao contrário do que seria esperado. Será que consegue orientar-me para encontrar o problema?
Obrigado
Muito interessante esse assunto. Vou ficar acompanhando.
Boa noite Alexandre, tudo bem?
E se eu quiser colocar dois RFID no mesmo raspberry, como fica o esquema?
Abraços
Ola, estou tentando ultilizar esse projeto em um controle de acesso, que vai consultar um banco de dados dentro do raspbarry, como estou começando agora… sabem dizer se suporta banco de dados o raspbarry?
Sim, pesquise por LAMP, que será fácil executar a instalação de um webserver com um banco de dados Mysql em seu raspberry. Coisa que 10 min resolve.
Assim consegue fazer a integração com banco.
ola, parece uma duvida simples, mas sou novato, como acesso como root o txt
sudo nano boot/config.txt
Olá alguém sabe se roda Java no raspberry? Gostaria de fazer um controle de acesso para portaria do condomínio com rfid porém sou javeiro…
A principio sim, tanto o Oracle Java quando o OpenJDK. Só não sei o que é suportado tudo. Mas vale o teste e depois deixa um comentário aqui pra gente.
Tem como instalar um display de 4 polegadas que usa as gpio de 1 a 26 junto desse leitor rfid? Tipo, como o display usa as mesmas portas que o leitor precisa, tem como redirecionar as portas? da 27 a 40 tem alguma que seja spi pra conectar o leitor?
Sim, existe outra SPI. Fica entre a 35 e a 40 no RPi 3. Para usar basta alterar o construtor MFRC522.MFRC522() por MFRC522.MFRC522(dev=’/dev/spidev0.1′, spd=1000000)
Abraço.
e como coloca a ordem dos cabos de 35 e a 40 ?
Por favor me dê um help
Segue tabela de comparação dos pinos do SPI0 e SPI1:
SPI0 MOSI – GPIO 10 – Pino 19
SPI0 MISO – GPIO 9 – Pino 21
SPI0 SCLK – GPIO 11 – Pino 23 (SCK)
SPI0 CS0 – GPIO 8 – Pino 24 (SDA)
SPI0 CS1 – GPIO 7 – Pino 26
SPI1 MOSI – GPIO 20 – Pino 36
SPI1 MISO – GPIO 19 – Pino 35
SPI1 SCLK – GPIO 21 – Pino 40 (SCK)
SPI1 CS0 – GPIO 16 – Pino 36 (SDA)
SPI1 CS1 – – – –
obrigado pela ajuda brother, eu consegui fazer funcionar no spi1 porem sem um lcd 3.5 acoplado, e quando eu coloquei o lcd pra funcionar, nem mesmo reconhece que está abilitado o spi, aparece essa mensagem ls: cannot access /dev/spi*: No such file or directory, agora não sei o que fazer :/
colar a pasta bcm fora da spi
Olá
quando aplico o comando dmesg | grep spi
nao tenho resposta no terminal, alguem sabe como resolver?
agradeço
Provavelmente o módulo de SPI não está carregado. Veja a tela de configuração acima como habilitar SPI.
Boa tarde,
Segui as recomendações mas o máximo que consegui foi ver o led do MFRC522 piscar quando o script Python manda o comando (alterando o valor do sleep) mas nunca um cartão (ou tag) é detectado.
Plataforma: RPi 3
#Drivers carregados
lsmod
Module Size Used by
spi_bcm2708 5038 0
#Dispositivos SPI
ls -l /dev/spidev0.*
crw-rw—- 1 root spi 153, 0 Jul 20 17:16 /dev/spidev0.0
crw-rw—- 1 root spi 153, 1 Jul 20 17:16 /dev/spidev0.1
uname -a
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux
dmesg | grep spi
[ 7.178040] bcm2708_spi 3f204000.spi: master is unqueued, this is deprecated
[ 7.178758] bcm2708_spi 3f204000.spi: SPI Controller at 0x3f204000 (irq 80)
Cheguei a instalar a versão mais recente do driver mas sem sucesso. Voltei então à 2708 (descontinuada) e o cabeamento foi triplamente revisado. Testei com o tag e o cartão que vem no kit (adquirido com vocês) e outros cartões MIFARE 1K que tenho mas nenhum foui reconhecido. Fiz até o downgrade da versão do Jessie para a versão indicada.
Alguma ideia sobre qual possa ser o problema? Já gastei bem mais horas do que devia pesquisando soluções sobre isto.
Obrigado.
Thomas.
Projeto muito bom, simples de executar e os outros projetos que eu achei estava faltando alguma coisa.
Fica a dica para quem quiser usar um rele ou um led ou outra coisa, é só adicionar no começo GPIO.setmode(GPIO.BOARD)
GPIO.setup(N° da Porta, GPIO.OUT) e adcionar
GPIO.output(N° da Porta, GPIO LOW) depois do comando if status == LeitorRFID.MI_OK:
uid = ‘:’.join([‘%X’ % x for x in uid])
print(‘UID do cartão: %s’ % uid)
GPIO.output(N° da Porta, GPIO LOW)
e no final
time.sleep(.25)
GPIO.output(N° da Porta, GPIO HIGH)
AMigo, estou iniciando nesse mundo, então poderia me dar um help? gostaria de adicionar uma fechadura eletronica ao projeto, seria mais ou menos por esse caminho? teria como me dar uma luz
Se você utilizar RFID para abrir a porta, sim é este o caminho.
Hoje em dia muitos prédios residenciais possuem RFID para permitir a entrada dos moradores.
Alexandre, boa noite
Preciso de uma aplicação em raspberry, usando a questão do RFID, porém o log de dados devem ser enviado pro nosso servidor, como série do cartão lido/ autorizado, tempo em que o equipamento ficou ligado (leitura do status de entrada digital)
Você realiza estes projetos ?
Meu e-mail [email protected]