Controle de acesso RFID com Raspberry Pi

Controle de acesso RFID com Raspberry Pi

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.

Conexão módulo RFID Raspberry Pi 3

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 Raspbian

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': 'FilipeFlop',
    '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á FilipeFlop.

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.

tela2

Gostou? Ajude-nos a melhorar o blog atribuindo uma nota a este tutorial (estrelas no final do artigo) e visite nossa loja FILIPEFLOP!

3
Controle de acesso RFID com Raspberry Pi
18 votos, 4.67 classificação média (93% pontuação)

Formado em Ciência da Computação pela Universidade Regional de Blumenau, é colaborador do site FILIPEFLOP.

Compartilhe este Post

17 Comentários

  1. Leonardo - 8 de janeiro de 2017

    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?

  2. fernando - 6 de janeiro de 2017

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

  3. André - 14 de dezembro de 2016

    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…

  4. Danilo - 20 de novembro de 2016

    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?

    • Alexandre Vicenzi - 21 de novembro de 2016

      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.

      • wesley - 25 de novembro de 2016

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

      • wesley - 29 de novembro de 2016

        Por favor me dê um help

        • Alexandre Vicenzi - 1 de dezembro de 2016

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

          • wesley - 3 de dezembro de 2016

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

  5. Edvando - 15 de outubro de 2016

    colar a pasta bcm fora da spi

  6. edilson - 30 de setembro de 2016

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

  7. Marcelo Thomas - 20 de julho de 2016

    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.

  8. Edvando - 16 de junho de 2016

    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)

Deixe uma resposta