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/