Introduction to Arduino and RFID
by pmdwayhk in Circuits > Arduino
2068 Views, 3 Favorites, 0 Comments
Introduction to Arduino and RFID
RFID – radio frequency identification. Some of us have already used these things, and they have become part of everyday life. For example, with electronic vehicle tolling, door access control, public transport fare systems and so on. It sounds complex – but isn’t.
To explain RFID for the layperson, we can use a key and lock analogy. Instead of the key having a unique pattern, RFID keys hold a series of unique numbers which are read by the lock.
It is up to our Arduino sketch to determine what happens when the number is read by the lock. The key is the tag, card or other small device we carry around or have in our vehicles. We will be using a passive key, which is an integrated circuit and a small aerial. This uses power from a magnetic field associated with the lock. The image shows some key and tag examples.
In this tutorial we’ll be using 125 kHz tags – for example. To continue with the analogy our lock is a small circuit board and a loop aerial. This has the capability to read the data on the IC of our key, and some locks can even write data to keys. The image shows our example reader.
These readers are quite small and inexpensive – however the catch is that the loop aerial is somewhat fragile.
Setting Up the RFID Reader
This is a short exercise to check the reader works and communicates with the Arduino. You will need:
- Arduino Uno or compatible board and matching USB cable
- solderless breadboard
- three jumper wires
- the RFID reader package
- some RFID tags or cards
Simply insert the RFID reader main board into a solderless breadboard as shown below. Then use jumper wires to connect the second and third pins at the top-left of the RFID board to Arduino 5V and GND respectively. The RFID coil connects to the two pins on the top-right (they can go either way).
Finally, connect a jumper wire from the bottom-left pin of the RFID board to Arduino digital pin 2.
Next, upload the following sketch to your Arduino and open the serial monitor window in the IDE:
#include <SoftwareSerial.h>
SoftwareSerial RFID(2, 3); // RX and TXint i;
void setup() { RFID.begin(9600); // start serial to RFID reader Serial.begin(9600); // start serial to PC }
void loop() { if (RFID.available() > 0) { i = RFID.read(); Serial.print(i, DEC); Serial.print(" "); } }
If you’re wondering why we used SoftwareSerial – if you connect the data line from the RFID board to the Arduino’s RX pin – you need to remove it when updating sketches, so this is more convenient.
Now start waving RFID cards or tags over the coil. You will find that they need to be parallel over the coil, and not too far away. You can experiment with covering the coil to simulate it being installed behind protective surfaces and so on. Watch this short video which shows the resulting RFID card or tag data being displayed in the Arduino IDE serial monitor.
As you can see from the example video, the reader returns the card’s unique ID number which starts with a 2 and ends with a 3. While you have the sketch operating, read the numbers from your RFID tags and note them down, you will need them for future sketches.
To do anything with the card data, we need to create some functions to retrieve the card number when it is read and place in an array for comparison against existing card data (e.g. a list of accepted cards) so your systems will know who to accept and who to deny. Using those functions, you can then make your own access system, time-logging device and so on. Let’s demonstrate an example of this.
It will check if a card presented to the reader is on an “accepted” list, and if so light a green LED, otherwise light a red LED. Use the hardware from the previous sketch, but add a typical green and red LED with 560 ohm resistor to digital pins 13 and 12 respectively. Then upload the following sketch:
#include <softwareserial.h>
SoftwareSerial RFID(2, 3); // RX and TXint data1 = 0; int ok = -1; int yes = 13; int no = 12;
// use first sketch in http://wp.me/p3LK05-3Gk to get your tag numbers int tag1[14] = {2,52,48,48,48,56,54,66,49,52,70,51,56,3}; int tag2[14] = {2,52,48,48,48,56,54,67,54,54,66,54,66,3}; int newtag[14] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons
void setup() { RFID.begin(9600); // start serial to RFID reader Serial.begin(9600); // start serial to PC pinMode(yes, OUTPUT); // for status LEDs pinMode(no, OUTPUT); }
boolean comparetag(int aa[14], int bb[14]) { boolean ff = false; int fg = 0; for (int cc = 0 ; cc < 14 ; cc++) { if (aa[cc] == bb[cc]) { fg++; } } if (fg == 14) { ff = true; } return ff; }
void checkmytags() // compares each tag against the tag just read { ok = 0; // this variable helps decision-making, // if it is 1 we have a match, zero is a read but no match, // -1 is no read attempt made if (comparetag(newtag, tag1) == true) { ok++; } if (comparetag(newtag, tag2) == true) { ok++; } }
void readTags() { ok = -1;
if (RFID.available() > 0) { // read tag numbers delay(100); // needed to allow time for the data to come in from the serial buffer.
for (int z = 0 ; z < 14 ; z++) // read the rest of the tag { data1 = RFID.read(); newtag[z] = data1; } RFID.flush(); // stops multiple reads
// do the tags match up? checkmytags(); }
// now do something based on tag type if (ok > 0) // if we had a match { Serial.println("Accepted"); digitalWrite(yes, HIGH); delay(1000); digitalWrite(yes, LOW);
ok = -1; } else if (ok == 0) // if we didn't have a match { Serial.println("Rejected"); digitalWrite(no, HIGH); delay(1000); digitalWrite(no, LOW);
ok = -1; } }
void loop() { readTags(); }
In the sketch we have a few functions that take care of reading and comparing RFID tags. Notice that the allowed tag numbers are listed at the top of the sketch, you can always add your own and more – as long as you add them to the list in the function checkmytags() which determines if the card being read is allowed or to be denied.
The function readTags() takes care of the actual reading of the tags/cards, by placing the currently-read tag number into an array which is them used in the comparison function checkmytags().
Then the LEDs are illuminated depending on the status of the tag at the reader. You can watch a quick demonstration of this example in this short video.
Conclusion
After working through this chapter you should now have a good foundation of knowledge on using the inexpensive RFID readers and how to call functions when a card is successfully read. For example, use some extra hardware to control a door strike, buzzer, etc.
Now it’s up to you to use them as a form of input with various access systems, tracking the movement of people or things and much more. This post is brought to you by pmdway.com – everything for makers and electronics enthusiasts, with free delivery worldwide.