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

Foto del sensore RFID

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

Immagine dei collegamenti del sensore pr Arduino UNOIn 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

rfid_read_uid.ino
// 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.

rfid_access.ino
// 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.