14. Networking and communications

For this week I wanted to do as much as I could with the somewhat limited resources that I had in my dev kit. I decided to set up a RFID reader with an arduino. With the pandemic lockdown I didn’t have lab access while doing this week so I used a commercial board.

RFID reader with LCD Output.

i started by making a simple RFID reader that outputs a command based on whether a cards id is in it’s library. I worked from this tutorial This worked pretty well! I did some simple edits to the code since I already had the lcd connected. Interestingly there are very few digital pins available with both of these components connected.

table

Gathering Parts and Wiring.

There are three parts that went into this project.

RFID reader breakout RC522

10K ohm potentiometer

LCD screen breakout LCD 1602

Here is the wired breadboard. Again there are very few extra pins with this setup. The potentiometer controls the contrast [Backlight V] for the LCD.

table

As with the IR sensor I configured for input week. The RFID sensor is a complete board with an IC. The communication protocol between this board and the arduino is SPI however it also supports 12C and UART two protocols I’m even less familiar with than SPI. The pinout for communicating is listed bellow.

IRQ- used for ‘waking up’ the board for communication. This a power saving function that I haven’t explored yet. An interesting function of this board is that it can still sense if a card is close even in it’s low power state.

MISO- Master in Slave out

MOSI-Master out Slave in

SCK- clock line

SS/SDA/Rx- Serial input

The radio signal between the board and RFID card is on the 13.56MHz band which is listed for industrial use. it can read and write the 1kB of space on the card. For this project I will just be reading the card’s unique code.

Image from tutorial of wiring.

Configuring Arduino IDE for RFID reading

I needed to import two libraries to use the RFID reader. The MFRC522 library and the SPI library for serial communication.

#include <SPI.h>
#include <MFRC522.h>

Reading RFID code

Before I can program my reader to accept a valid card number I need to read the number on my RFID card to enter into my library. To do this I ran the code below

//All credit to Technic1510
//
//
//
//
//
#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN   9     // Configurable, see typical pin layout above
#define SS_PIN    10    // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

/* Set your new UID here! */
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}

MFRC522::MIFARE_Key key;

void setup() {
  Serial.begin(9600);  // Initialize serial communications with the PC
  while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
  SPI.begin();         // Init SPI bus
  mfrc522.PCD_Init();  // Init MFRC522 card
  Serial.println(F("Warning: this example overwrites the UID of your UID changeable card, use with care!"));

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}

// Setting the UID can be as simple as this:
//void loop() {
//  byte newUid[] = NEW_UID;
//  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
//    Serial.println("Wrote new UID to card.");
//  }
//  delay(1000);
//}

// But of course this is a more proper approach
void loop() {

  // Look for new cards, and select one if present
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    delay(50);
    return;
  }

  // Now a card is selected. The UID and SAK is in mfrc522.uid.

  // Dump UID
  Serial.print(F("Card UID:"));
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  } 
  Serial.println();

  // Dump PICC type
//  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
//  Serial.print(F("PICC type: "));
//  Serial.print(mfrc522.PICC_GetTypeName(piccType));
//  Serial.print(F(" (SAK "));
//  Serial.print(mfrc522.uid.sak);
//  Serial.print(")\r\n");
//  if (  piccType != MFRC522::PICC_TYPE_MIFARE_MINI 
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K
//    &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
//    Serial.println(F("This sample only works with MIFARE Classic cards."));
//    return;
//  }

  // Set new UID
  byte newUid[] = NEW_UID;
  if ( mfrc522.MIFARE_SetUid(newUid, (byte)4, true) ) {
    Serial.println(F("Wrote new UID to card."));
  }

  // Halt PICC and re-select it so DumpToSerial doesn't get confused
  mfrc522.PICC_HaltA();
  if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
    return;
  }

  // Dump the new memory contents
  Serial.println(F("New UID and contents:"));
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));

  delay(2000);
}

This prints the string on the card to the serial line.

Running Card Reader with Valid String

I can now add the string to the reader code. This displays my name and that it’s a valid card when it is read.

//All Credit Technic 1510
//
//
//
//
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   
LiquidCrystal lcd(6 , 7, 5, 4, 3, 2);


void setup() 
{

  SPI.begin();     
  mfrc522.PCD_Init();   
  lcd.begin(16, 2);
  lcd.print("Scan RFID Card");


}
void loop() 
{

  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }

  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }

  lcd.clear();
  lcd.begin(16, 2);
  lcd.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    lcd.setCursor(0, 1);
     lcd.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     lcd.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
lcd.clear();
lcd.begin(16, 2);
 lcd.print("Message : ");
 content.toUpperCase();
  if (content.substring(1) == "E0 28 E9 87") //Plz change to your cards UID
  {
   lcd.setCursor(0,1);
    lcd.print("Authorized");

    delay(3000);
   lcd.clear();
    setup();
  }

 else   {
  lcd.setCursor(0, 1);
    lcd.print(" Access denied");
    delay(3000);
    lcd.clear();
      setup();
      }
} 

Video

Group Project