Controle de acesso RFID com Raspberry Pi 57

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.

Controle de Acesso com RFID com Raspberry Pi

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.

Raspberry PI 3 GPIO

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.

Tabela de conexão

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.

Habilitar SPI

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.

Python Shell

Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

57 Comentários

  1. 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?

    1. 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.

  2. Boa tarde, como seria a programação para utilizar um NFC PN532?

    1. 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

  3. Poderiam atualizar o post para funcionar na versão mais recente do respbian ?

  4. 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?

    1. Luciano,

      Talvez uma solução diferente seria utilizar um display que possua conexão I2C.

      Abraços!
      Diogo – Equipe MakerHero

  5. Olá! Qual é a distância máxima entre o leitor e o cartão para a leitura do cartão. Obrigado.

    1. Olá Lucas,

      É de 5~7cm.

      Abraço!
      Rosana – Equipe MakerHero

  6. 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??

    1. 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

  7. 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)

    1. Olá Bruno,

      Qual versão do Raspbian você está usando?

      Abraço!
      Rosana – Equipe MakerHero

      1. 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?

        1. Olá Bruno,

          O problema parece estar relacionado ao arquivo do MFRC522.

          1. 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?

            andre.eletronico
          2. Olá André,

            Vamos verificar o que está acontecendo. Assim que tivermos uma resposta, aviso por aqui.

            Abraço!
            Rosana – Equipe MakerHero

      2. No meu raspberry também dá esse problema. A versão do Raspbian é GNU/Linux 10 \n \l. O que devo fazer?

  8. 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?

    1. Olá,

      Você seguiu o procedimento “Preparando o ambiente” corretamente?

      Abraço!
      Rosana – Equipe MakerHero

    2. 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.

      1. Olá Alexandre!

        Obrigada pelo aviso. Vamos revisar o tutorial com as versões mais atuais das bibliotecas.

        Abraço!
        Rosana – Equipe MakerHero

    3. git clone https://github.com/lthiery/SPI-Py.git
      git checkout 8cce26b9ee6e69eb041e9d5665944b88688fca68
      sudo python setup.py install

  9. O meu está dando erro (File “leitor.py”, line 3
    SyntaxError: ‘utf8’ codec can’t decode byte 0xf5 in position 0: invalid start byte
    )

    1. 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

  10. E como gravar o cartão ?

    1. Olá Sergio!

      Já fizemos isso no Arduino:
      https://www.makerhero.com/blog/como-gravar-dados-no-cartao-rfid/

      Abraços!

      André – Equipe MakerHero

  11. 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.

    1. 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

  12. 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’
    >>>

    1. 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

  13. 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

  14. Muito interessante esse assunto. Vou ficar acompanhando.

  15. Boa noite Alexandre, tudo bem?

    E se eu quiser colocar dois RFID no mesmo raspberry, como fica o esquema?

    Abraços

  16. 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?

    1. 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.

  17. ola, parece uma duvida simples, mas sou novato, como acesso como root o txt

    1. sudo nano boot/config.txt

  18. 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…

    1. 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.

  19. 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?

    1. 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.

      1. e como coloca a ordem dos cabos de 35 e a 40 ?

      2. Por favor me dê um help

        1. 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 – – – –

          1. 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 :/

  20. colar a pasta bcm fora da spi

  21. Olá
    quando aplico o comando dmesg | grep spi
    nao tenho resposta no terminal, alguem sabe como resolver?
    agradeço

    1. Provavelmente o módulo de SPI não está carregado. Veja a tela de configuração acima como habilitar SPI.

  22. 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.

  23. 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)

    1. 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

      1. 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.

        1. 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]

Trackbacks and Pingbacks

  1. […] dos mais recentes produtos de circuito de câmeras e controle de acesso são compatíveis com IoT. Conectar seu sistema de segurança ao resto de sua rede oferece uma […]

  2. […] Para a configuração da interface SPI da Raspberry Pi e instalação das bibliotecas necessárias, leia atentamente este artigo aqui do blog. […]