Board and part

Arduino Nano RC522 RFID Simulator: Wiring, Code and a Live Circuit

This is an RC522 (MFRC522) RFID reader wired to an Arduino Nano over SPI, running live with the MFRC522 library: open it in the editor, lay a card on the reader, and the serial monitor prints its UID.

  • 5 V logic
  • Library: MFRC522.h
  • SS on pin 10
  • 3.3 V module
Arduino Nano · RC522 RFIDlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.
Connections

Wiring the RC522 RFID to the Arduino Nano

Seven wires: 3.3 V, GND, the four SPI lines to the Arduino Nano’s SPI pins, and RST to pin 9.

Every connection in the circuit above, with the board’s own pin names.

RC522 RFID pinArduino Nano pinWhy
3.3V3.3VThe MFRC522 is a 3.3 V chip. Never 5 V on this pin.
GNDGNDCommon ground.
SDA (SS)pin 10Chip select. Labeled SDA on the module, but this is SPI, not I2C.
SCKpin 13Arduino Nano’s SPI clock.
MOSIpin 11Data from the board to the reader.
MISOpin 12Data from the reader to the board.
RSTpin 9Reset, held high while the reader runs.
IRQnot connectedThe library polls instead.

Power

The module is powered from the Arduino Nano’s 3.3V pin, but the SPI lines come from 5 V pins. Many RC522 modules survive that, and countless Uno tutorials wire it so, but the chip is rated for 3.3 V logic; a level shifter on SCK, MOSI, SS and RST is the safe way on real hardware.

Pins to leave alone on the Arduino Nano

A6 and A7 are analog only: pinMode(A6, OUTPUT) does nothing and digitalRead(A7) is not there to call. D0 and D1 are the USB serial port.

On a real bench

The Nano plugs into the breadboard itself, straddling the center channel, so the RC522 RFID goes in a few columns along and every connection is a short jumper. The silkscreen labels its pins D2 to D13 and A0 to A7; in code D2 is simply 2. A Nano clone with a CH340 USB chip needs that driver on a real computer.

The sketch

The code, and what it does.

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

RC522 RFID on Arduino Nano
#include <SPI.h>
#include <MFRC522.h>

const int SS_PIN = 10;    // SDA on the module, pin 10
const int RST_PIN = 9;   // pin 9

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin();          // SCK 13, MISO 12, MOSI 11
  rfid.PCD_Init();
  Serial.println("Hold a card to the reader");
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent() || !rfid.PICC_ReadCardSerial()) {
    delay(50);
    return;
  }
  Serial.print("Card UID:");
  for (byte i = 0; i < rfid.uid.size; i++) {
    Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(rfid.uid.uidByte[i], HEX);
  }
  Serial.println();
  rfid.PICC_HaltA();    // done with this card until it is lifted
}

SPI.begin() starts the Arduino Nano’s SPI bus on its own pins (SCK 13, MISO 12, MOSI 11), and MFRC522 rfid(SS_PIN, RST_PIN) adds the chip select and reset. PCD_Init() resets the reader and turns its antenna on.

PICC_IsNewCardPresent() asks whether a card has entered the field and PICC_ReadCardSerial() reads its UID, four or seven bytes. The sketch prints them in hex with a leading zero where needed, then PICC_HaltA() puts the card to sleep so it is reported once.

Serial.begin(9600) opens the serial monitor. Serial is the USB port, as on the Uno; a clone with a CH340 chip needs that driver on a real computer, which the simulator does not.

Pitfalls

Common mistakes with the RC522 RFID on the Arduino Nano

Powering it from 5V

The 3.3V pin means it: 5 V there damages the MFRC522. If the module gets warm or reports a version of 0x00 or 0xFF, check this first.

Treating SDA as I2C

The pin marked SDA is the SPI chip select. Wired to the Arduino Nano’s I2C data pin, the reader is never selected. It goes to SS_PIN, pin 10 here.

Expecting to read bank cards

The RC522 reads 13.56 MHz MIFARE tags and cards. Contactless bank cards answer, but only with a random ID each time, and 125 kHz key fobs not at all.

FAQ

Questions and answers

Can I simulate an RC522 RFID reader with an Arduino Nano?

Yes. The circuit at the top of this page is an Arduino Nano with a RC522 RFID reader, running in your browser on a simulated ATmega328P. The simulated reader has four cards with fixed UIDs; click to lay one on the antenna. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Which pins does the RC522 use on the Arduino Nano?

SPI: SCK on pin 13, MISO on pin 12, MOSI on pin 11. SS and RST can be any digital pins; this page uses pin 10 and pin 9.

How do I make an access control lock?

Compare the UID bytes with a list of allowed cards, and drive a relay or a servo when one matches. Keep in mind that a UID alone is easy to copy, so it is a learning project, not a security one.

Can I write to the card?

The library has MIFARE_Write() for MIFARE Classic blocks after authentication. This simulated reader models reading UIDs only.

Build your own RC522 RFID project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.