Come usare il modulo RFID RC522 con Arduino
Il modulo RFID RC522 permette ad Arduino di riconoscere tessere e portachiavi RFID a 13,56 MHz. È molto usato per serrature elettroniche, controllo accessi, sistemi di presenza e progetti in cui Arduino deve capire quale tag è stato avvicinato. In questa lezione partiamo da zero: vedremo come funziona l'RFID, a cosa servono tutti i pin, come collegare il RC522 ad Arduino UNO e come leggere l'UID di una tessera.
Che cos'è l'RFID?
RFID significa Radio Frequency Identification. Un sistema RFID è composto principalmente da un lettore e da un tag, per esempio una tessera o un portachiavi. Il lettore genera un campo elettromagnetico; un tag passivo posto abbastanza vicino ricava da quel campo l'energia necessaria per funzionare e risponde inviando i propri dati.
Il RC522 lavora con tag compatibili con l'interfaccia ISO/IEC 14443A, molto comune nelle tessere MIFARE e in diversi tag RFID/NFC.
Immagine del sensore

Come funziona il modulo RC522
Il cuore del modulo è il circuito integrato MFRC522. Arduino comunica con il lettore, mentre il lettore gestisce la comunicazione radio con la tessera. Quando una tessera entra nel campo dell'antenna, il modulo può rilevarla e leggere il suo UID.
L'UID è una sequenza di byte che identifica il tag. La sua lunghezza può variare, quindi è buona pratica scrivere codice che utilizzi la lunghezza reale invece di assumere sempre quattro byte.
Il RC522 può anche leggere e scrivere aree di memoria di alcuni tag compatibili, ma questa operazione richiede autenticazione e una gestione più attenta. Per iniziare è meglio imparare prima a leggere correttamente l'UID.
RC522 e protocollo SPI
Con Arduino il RC522 viene normalmente usato tramite SPI, cioè Serial Peripheral Interface. SPI utilizza linee separate per clock, dati inviati da Arduino, dati restituiti dal modulo e selezione del dispositivo.
Un dettaglio importante: sul RC522 il pin indicato come SDA, quando il modulo viene usato in SPI, funziona in realtà come SS/CS, cioè Slave Select o Chip Select. Non è il normale SDA del bus I2C.
A cosa servono tutti i pin del RC522
3.3V
Alimentazione del modulo. Il MFRC522 è un dispositivo a 3,3 V: non collegare questo pin ai 5 V di Arduino UNO.
RST
Pin di reset. Nel nostro esempio viene collegato al pin digitale 9.
GND
Massa del circuito. Va collegata a GND di Arduino.
MISO
Master In Slave Out: linea con cui il RC522 invia dati ad Arduino. Su Arduino UNO è il pin 12.
MOSI
Master Out Slave In: linea con cui Arduino invia dati al RC522. Su Arduino UNO è il pin 11.
SCK
Clock SPI. Su Arduino UNO è il pin 13.
SDA / SS / CS
In SPI è il Chip Select. Nel nostro esempio viene collegato al pin 10.
IRQ
Uscita di interrupt. Nei progetti base con la libreria MFRC522 può rimanere scollegata.
Attenzione ai 3,3 V
Per l'alimentazione usa sempre il pin 3.3V di Arduino. Arduino UNO utilizza invece logica a 5 V sulle uscite digitali. Molti esempi hobbistici collegano direttamente i segnali SPI e spesso funzionano, ma per un collegamento più corretto e robusto è consigliabile usare un level shifter sui segnali inviati dall'UNO verso il RC522. Il segnale MISO, che parte dal RC522 e arriva all'UNO, può normalmente essere letto direttamente.
Come collegare RC522 ad Arduino UNO
In questo esempio non ho utilizzato un level shifter.- RC522 3.3V → Arduino 3.3V
- RC522 GND → Arduino GND
- RC522 RST → Arduino pin 9
- RC522 SDA/SS → Arduino pin 10
- RC522 MOSI → Arduino pin 11
- RC522 MISO → Arduino pin 12
- RC522 SCK → Arduino pin 13
- RC522 IRQ → non collegato
Questi sono i pin SPI tipici di Arduino UNO. Su Mega, Leonardo e altre schede i pin SPI possono trovarsi in posizioni diverse.
Installare la libreria MFRC522
La libreria SPI è già inclusa nell'ambiente Arduino. Per usare facilmente il lettore apri il Library Manager, cerca MFRC522 e installa MFRC522 by GithubCommunity.
#include <SPI.h>
#include <MFRC522.h>
Primo codice: leggere l'UID
// https://nemiatools.com
#include <SPI.h>
#include <MFRC522.h>
const byte SS_PIN = 10;
const byte RST_PIN = 9;
MFRC522 rfid(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600);
SPI.begin();
rfid.PCD_Init();
Serial.println("Avvicina una tessera RFID...");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) {
return;
}
if (!rfid.PICC_ReadCardSerial()) {
return;
}
Serial.print("UID: ");
for (byte i = 0; i < rfid.uid.size; i++) {
if (rfid.uid.uidByte[i] < 0x10) {
Serial.print("0");
}
Serial.print(rfid.uid.uidByte[i], HEX);
if (i < rfid.uid.size - 1) {
Serial.print(" ");
}
}
Serial.println();
rfid.PICC_HaltA();
}Apri il Monitor Seriale a 9600 baud e avvicina una tessera. Vedrai una sequenza simile a UID: A3 2F 91 0C. Il valore reale sarà diverso per la tua tessera.
Come funziona il codice
SPI.begin() inizializza il bus SPI e rfid.PCD_Init() inizializza il lettore. Nel loop, PICC_IsNewCardPresent() controlla se è comparsa una nuova tessera. PICC_ReadCardSerial() legge le informazioni necessarie, compreso l'UID.
La lunghezza dell'UID è contenuta in rfid.uid.size, mentre i singoli byte si trovano in rfid.uid.uidByte[]. Alla fine PICC_HaltA() termina correttamente la comunicazione con quella tessera.
Esempio: riconoscere una tessera autorizzata
Dopo aver letto il tuo UID puoi salvarlo nel programma e confrontarlo con quello appena rilevato. Nell'esempio seguente si accende il LED integrato di Arduino UNO quando viene riconosciuta la tessera autorizzata.
// https://nemiatools.com
#include <SPI.h>
#include <MFRC522.h>
const byte SS_PIN = 10;
const byte RST_PIN = 9;
const byte LED_PIN = LED_BUILTIN;
MFRC522 rfid(SS_PIN, RST_PIN);
// Sostituisci questi byte con l'UID della tua tessera
const byte authorizedUID[] = {0xDE, 0xAD, 0xBE, 0xEF};
const byte authorizedSize = sizeof(authorizedUID);
bool isAuthorized() {
if (rfid.uid.size != authorizedSize) {
return false;
}
for (byte i = 0; i < authorizedSize; i++) {
if (rfid.uid.uidByte[i] != authorizedUID[i]) {
return false;
}
}
return true;
}
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
SPI.begin();
rfid.PCD_Init();
Serial.println("Sistema RFID pronto");
}
void loop() {
if (!rfid.PICC_IsNewCardPresent()) return;
if (!rfid.PICC_ReadCardSerial()) return;
if (isAuthorized()) {
Serial.println("Accesso autorizzato");
digitalWrite(LED_PIN, HIGH);
delay(1000);
digitalWrite(LED_PIN, LOW);
}
else {
Serial.println("Accesso negato");
}
rfid.PICC_HaltA();
}Sostituisci DE AD BE EF con l'UID ottenuto dal primo programma. Se la tua tessera ha 7 o 10 byte, inseriscili tutti: il codice utilizza automaticamente la dimensione dell'array.
Funzioni MFRC522 più utili
- PCD_Init() → inizializza il lettore.
- PICC_IsNewCardPresent() → verifica se è presente una nuova tessera.
- PICC_ReadCardSerial() → legge UID e dati principali della tessera.
- PICC_HaltA() → termina la comunicazione con la tessera corrente.
- uid.size → indica la lunghezza dell'UID.
- uid.uidByte[] → contiene i byte dell'UID.
- PICC_GetType() → permette di determinare il tipo di PICC rilevato.
Applicazioni del RC522
- Serrature elettroniche.
- Controllo accessi con tessere.
- Sistemi di presenza.
- Profili o menu personalizzati.
- Robot o dispositivi che reagiscono a tag differenti.
- Attivazione di funzioni specifiche in base alla tessera.
L'UID è una password?
No. Confrontare soltanto l'UID è perfetto per imparare e per progetti non critici, ma non deve essere considerato un sistema di sicurezza forte. Alcuni tag possono avere identificativi clonabili o riproducibili. Per un vero sistema di accesso bisogna usare un'autenticazione adeguata e non affidarsi solamente all'UID.
Problemi comuni
Il lettore non rileva nessuna tessera
Controlla alimentazione a 3,3 V, GND, SDA/SS, MOSI, MISO e SCK. Verifica anche che RST sia collegato al pin dichiarato nel programma.
Il programma non reagisce quando avvicino la tessera
Assicurati che SPI.begin() venga eseguito prima di PCD_Init() e che il tag sia compatibile con il lettore.
L'UID viene stampato male
Controlla i collegamenti e mantieni i fili abbastanza corti. Una comunicazione SPI instabile può produrre letture errate.
La stessa tessera viene letta una sola volta
Allontanala e riavvicinala. PICC_IsNewCardPresent() è pensata per rilevare una nuova presentazione del tag.