Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

NFC Tag Reader With Raspberry Pi

DZone's Guide to

NFC Tag Reader With Raspberry Pi

In this post we take a look at how to easily setup a Raspberry Pi to be able to read NFC tags! This is some cool stuff, so let's get started!

· IoT Zone
Free Resource

Discover why Bluetooth mesh is the next evolution of IoT solutions. Download the mesh overview.

In another post, we spoke about NFC tag readers and Arduino. Today, I’ll do the same but with a Raspberry Pi. Why? More or less, everything we can do with an Arduino board we also do with a Raspberry Pi (and vice versa). Sometimes, Arduino is too low-level for me. For example, if we want to connect an Arduino to the LAN we need to set up mac address by hand. We can do it, but this operation is trivial with Raspberry Pi and Python. We can connect our Arduino to a PostgreSQL database, but it’s not that straightforward. My background is also better with Python than C++, so I feel more confortable working with Raspberry Pi.

I’m not saying that RPi is better than Arduino. With Arduino, for example, we don’t need to worry about start proceses, reboots, and those kinds of things that we need to worry about with computers. Arduino and Raspberry Pi are different tools. Sometimes, it will be better to use one and sometimes, the other.

Let’s start connecting our RFID/NFC Sensor MFRC522 to our Raspberry Pi 3.

The wiring:

  • 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

I will use a Python port of the example code for the NFC module MF522-AN (thanks to mxgxw!).

I’m going to use two Python Scripts. One to control the NFC reader:

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)

And another one to control the push button. I use this second script only to see how to use different processes:

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

Here is a video with a working example. I’ve also put a servo and three LEDs — only because it looks good!

The code can be found on my GitHub account.

Take a deep dive into Bluetooth mesh. Read the tech overview and discover new IoT innovations.

Topics:
raspberry pi ,iot ,python ,tutorial ,nfc tags

Published at DZone with permission of Gonzalo Ayuso, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}