Android

8 set, 2017

Leitor de tags NFC com Raspberry Pi

Publicidade

Em outro artigo, falei sobre leitores de tags NFC e Arduino. Hoje, vou fazer o mesmo, mas com um Raspberry Pi. Por quê? Mais ou menos tudo o que podemos fazer com uma placa Arduino podemos fazê-lo também com um Raspberry Pi (e vice-versa).

Às vezes, Arduino é muito low level para mim. Por exemplo, se quisermos conectar um Arduino à LAN, precisamos configurar o endereço mac à mão. Nós podemos fazê-lo, mas essa operação é trivial com Raspberry Pi e Python. Podemos conectar nosso Arduino a um banco de dados PostgreSQL, mas não é muito simples. O meu background também é melhor com Python do que C++, então, eu me sinto mais confortável trabalhando com Raspberry Pi.

Não estou dizendo que o RPi seja melhor do que o Arduino. Com o Arduino, por exemplo, não precisamos nos preocupar com o início dos processos, as reinicializações e aquele tipo de coisa que precisamos nos preocupar em relação a computadores. Arduino e Raspberry Pi são ferramentas diferentes. Às vezes, uma será melhor e, às vezes, a outra.

Então, vamos começar a conectar nosso sensor RFID/NFC MFRC522 ao nosso Raspberry Py 3. As conexões:

  • RC522 VCC > RP 3V3
  • RC522 RST > RPGPIO25
  • RC522 GND > RP Ground
  • RC522 MISO > RPGPIO9 (MISO)
  • RC522 MOSI > RPGPIO10 (MOSO)
  • RC522 SCK > RPGPIO11 (SCLK)
  • RC522 NSS > RPGPIO8 (CE0)
  • RC522 IRQ > RPNone

Eu vou usar uma porta Python do código de exemplo para o módulo NFC MF522-AN graças a mxgxw.

Eu vou usar dois scripts Python. Um para controlar o leitor NFC:

import RPi.GPIO as gpio
import MFRC522
import sys
import time
 
MIFAREReader = MFRC522.MFRC522()
GREEN = 11
RED = 13
YELLOW = 15
SERVO = 12
 
gpio.setup(GREEN, gpio.OUT, initial=gpio.LOW)
gpio.setup(RED, gpio.OUT, initial=gpio.LOW)
gpio.setup(YELLOW, gpio.OUT, initial=gpio.LOW)
gpio.setup(SERVO, gpio.OUT)
p = gpio.PWM(SERVO, 50)
 
good = [211, 200, 106, 217, 168]
 
def servoInit():
    print "servoInit"
    p.start(7.5)
 
def servoOn():
    print "servoOn"
    p.ChangeDutyCycle(4.5)
 
def servoNone():
    print "servoOn"
    p.ChangeDutyCycle(7.5)
 
def servoOff():
    print "servoOff"
    p.ChangeDutyCycle(10.5)
 
def clean():
    gpio.output(GREEN, False)
    gpio.output(RED, False)
    gpio.output(YELLOW, False)
 
def main():
    servoInit()
    while 1:
        (status, TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        if status == MIFAREReader.MI_OK:
            (status, backData) = MIFAREReader.MFRC522_Anticoll()
            gpio.output(YELLOW, True)
            if status == MIFAREReader.MI_OK:
                mac = []
                for x in backData[0:-1]:
                    mac.append(hex(x).split('x')[1].upper())
                print ":".join(mac)
                if good == backData:
                    servoOn()
                    gpio.output(GREEN, True)
                    time.sleep(0.5)
                    servoNone()
                else:
                    gpio.output(RED, True)
                    servoOff()
                    time.sleep(0.5)
                    servoNone()
                time.sleep(1)
                gpio.output(YELLOW, False)
                gpio.output(RED, False)
 
if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Interrupted'
        clean()
        MIFAREReader.GPIO_CLEEN()
        sys.exit(0)

E outro para controlar o botão push. Eu uso esse segundo script apenas para ver como usar processos diferentes.

import RPi.GPIO as gpio
import time
 
gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)
BUTTON = 40
GREEN = 11
RED = 13
YELLOW = 15
 
gpio.setup(GREEN, gpio.OUT)
gpio.setup(RED, gpio.OUT)
gpio.setup(YELLOW, gpio.OUT)
 
gpio.setup(BUTTON, gpio.IN, pull_up_down=gpio.PUD_DOWN)
gpio.add_event_detect(BUTTON, gpio.RISING)
def leds(status):
    gpio.output(YELLOW, status)
    gpio.output(GREEN, status)
    gpio.output(RED, status)
 
def buttonCallback(pin):
    if gpio.input(pin) == 1:
        print "STOP"
        leds(True)
        time.sleep(0.2)
        leds(False)
        time.sleep(0.2)
        leds(True)
        time.sleep(0.2)
        leds(False)
 
gpio.add_event_callback(BUTTON, buttonCallback)
while 1:
    pass

Aqui está um vídeo com um exemplo em funcionamento (eu também coloquei um servo e três leds somente porque parece bom).

***

Gonzalo Ayuso faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://gonzalo123.com/2017/09/04/nfc-tag-reader-with-raspberry-pi/