Arduino Uno RC522 RFID Simulator: Wiring, Code and a Live Circuit
This is an RC522 (MFRC522) RFID reader wired to an Arduino Uno 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.
Seven wires: 3.3 V, GND, the four SPI lines to the Arduino Uno’s SPI pins, and RST to pin 9.
- 5 V logic
- Library: MFRC522.h
- SS on pin 10
- 3.3 V module
Wiring the RC522 RFID to the Arduino Uno
Every connection in the circuit above, with the board’s own pin names.
| RC522 RFID pin | Arduino Uno pin | Why |
|---|---|---|
| 3.3V | 3.3V | The MFRC522 is a 3.3 V chip. Never 5 V on this pin. |
| GND | GND | Common ground. |
| SDA (SS) | pin 10 | Chip select. Labeled SDA on the module, but this is SPI, not I2C. |
| SCK | pin 13 | Arduino Uno’s SPI clock. |
| MOSI | pin 11 | Data from the board to the reader. |
| MISO | pin 12 | Data from the reader to the board. |
| RST | pin 9 | Reset, held high while the reader runs. |
| IRQ | not connected | The library polls instead. |
The module is powered from the Arduino Uno’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 Uno
Pins 0 and 1 are the USB serial port on a real Uno, so anything wired there fights the upload and the serial monitor. Pin 13 carries the onboard LED.
On a real bench
On a real bench the Uno stands beside the breadboard: the RC522 RFID goes into the breadboard and male-to-male jumpers run from the Uno’s female headers to its rows. Power the Uno from USB while you build, and unplug it before you move a wire.
The code
The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.
#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 Uno’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 goes over the USB cable, and the serial monitor in the editor reads it at whatever baud rate the sketch sets.
Common mistakes with the RC522 RFID on the Arduino Uno
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 Uno’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.
Questions and answers
Can I simulate an RC522 RFID reader with an Arduino Uno?
Yes. The circuit at the top of this page is an Arduino Uno 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 Uno?
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.