
Se vi è mai capitato di usare una cassa self-service in un supermercato e di vedere come, man mano che posizionate gli articoli su un vassoio, questi appaiono automaticamente sullo schermo , avete già visto la tecnologia RFID in azione. Non si tratta di magia o telepatia tecnologica: è un sistema basato sulle radiofrequenze che permette di identificare gli oggetti senza contatto diretto, e potete replicarlo a casa con un semplice Arduino e un lettore economico come l'RC522.
In questa guida imparerai, passo dopo passo, come usare Arduino e un lettore RFID RC522 per leggere e scrivere tag, a capire esattamente cos'è l'RFID, quali tipi di sistemi esistono, come vengono alimentate le schede passive, come è organizzata la memoria di una scheda MIFARE Classic 1K e come realizzare progetti concreti come un sistema di controllo accessi o una tessera di trasporto ricaricabile. Mettiti comodo, perché approfondiremo l'argomento in modo esaustivo, ma chiaro e accessibile.
Cos'è la tecnologia RFID e come funziona?
L'identificazione a radiofrequenza, o RFID, è un sistema che permette di riconoscere gli oggetti tramite un identificativo univoco trasmesso via radio. Questo identificativo è solitamente chiamato UID (Unique ID) e può essere considerato come l'ID del tag. Il sistema completo è costituito da due elementi principali: il tag RFID (o transponder) e il lettore RFID (ricetrasmettitore).
I tag RFID sono disponibili in molti formati diversi: tessere di plastica simili a carte di credito, portachiavi, adesivi da applicare sui prodotti per prevenire i furti e persino chip impiantati sotto la pelle degli animali per l'identificazione. Internamente, condividono tutti gli stessi componenti: un'antenna e un piccolo chip che memorizza le informazioni e comunica con il lettore.
Esistono tag di sola lettura, il cui UID è programmato in fabbrica e non può essere modificato, e tag di lettura/scrittura, sui quali un lettore adatto, come il modulo RC522, può sia leggere che scrivere dati . Ciò consente applicazioni come carte di trasporto ricaricabili, sistemi di controllo accessi con saldo prepagato, sistemi di rilevazione presenze e altro ancora.
Dall'altro lato, abbiamo il lettore o ricetrasmettitore RFID. Questo dispositivo non solo riceve dati, ma emette anche un campo elettromagnetico a radiofrequenza . Questo campo è fondamentale per comprendere come vengono alimentati i tag passivi e come avviene lo scambio di informazioni tra la scheda e il lettore.
Alimentazione e principio di funzionamento dei tag RFID
Una domanda molto frequente è: se gli adesivi RFID sui prodotti dei supermercati o sulle tessere di accesso non hanno batterie, da dove prendono l'energia per funzionare? Il punto chiave è che molti di questi tag sono passivi e vengono alimentati dall'induzione elettromagnetica generata dal campo del lettore.
Quando si avvicina un tag passivo a un lettore, la sua antenna entra nel campo elettromagnetico generato dal modulo (ad esempio, a 13,56 MHz nel caso dell'RC522). Questo campo induce una corrente nell'antenna del tag, che viene utilizzata per alimentare momentaneamente il chip interno . Una volta "attivato", il chip modula il segnale che invia al lettore (questo processo è chiamato retrodiffusione), codificando l'UID e, se applicabile, altri dati memorizzati.
A differenza di tecnologie come gli infrarossi, non è necessaria una linea di vista diretta tra il tag e il lettore : le radiofrequenze possono penetrare alcuni materiali, sebbene il loro comportamento dipenda dalla frequenza, dalla presenza di metallo, acqua, ecc. Il lettore cattura il segnale retrodiffuso, lo interpreta e quindi invia i dati a un microcontrollore (come Arduino, ESP8266 o ESP32) o a un computer.
Tipologie di sistemi RFID in base alla frequenza
Lo spettro delle radiofrequenze è molto ampio e le onde radio non si comportano allo stesso modo a tutte le frequenze . Pertanto, nella tecnologia RFID si utilizzano bande diverse a seconda dell'applicazione. Il lettore e il tag devono essere progettati per funzionare alla stessa frequenza, proprio come una radio deve sintonizzarsi sulla stazione corretta.
In generale, possiamo raggruppare i sistemi RFID in tre categorie principali in base alla banda utilizzata:
- Bassa frequenza (LF): circa 125-134 kHz.
- Alta frequenza (HF): circa 13,56 MHz, che include tecnologie come MIFARE e NFC.
- Frequenza ultra alta (UHF): tra circa 433 MHz e 860-960 MHz.
Sistemi RFID a bassa frequenza (LF)
I sistemi RFID a bassa frequenza hanno una lunghezza d'onda relativamente lunga, che consente loro di penetrare meglio materiali sottili e oggetti con un elevato contenuto di acqua , come frutta o bevande. Funzionano anche abbastanza bene in prossimità di metalli sottili.
Tuttavia, questo vantaggio comporta notevoli limitazioni: il raggio d'azione tipico è di pochi centimetri e la velocità di trasmissione dei dati è bassa, con conseguente riduzione della capacità di memoria e aumento dei costi dei tag . Questi sistemi sono comunemente utilizzati per il controllo degli accessi semplice, per le vecchie chiavi di prossimità e per l'etichettatura degli animali.
Sistemi RFID e NFC ad alta frequenza (HF)
La banda ad alta frequenza, a 13,56 MHz, è probabilmente la più popolare tra gli appassionati di "maker" e i progetti fai-da-te, perché è lì che si trovano le schede MIFARE e la tecnologia NFC (Near-Field Communication) , utilizzata da molti telefoni cellulari per i pagamenti contactless.
I sistemi HF funzionano bene in prossimità di superfici metalliche e in presenza di livelli di umidità da moderati ad elevati, offrendo in genere una portata da pochi centimetri fino a circa un metro in condizioni ideali. Le velocità di trasmissione dati rimangono modeste, ma sono sufficienti per applicazioni di identificazione, accesso e trasferimento di piccole quantità di dati. Molti standard globali si basano sull'HF, facilitando l'interoperabilità di apparecchiature e schede.
Sistemi RFID a frequenza ultraelevata (UHF)
All'estremo opposto dello spettro si trovano i sistemi UHF, in grado di raggiungere distanze da pochi centimetri a oltre 20 metri. Sono ideali quando è necessario leggere rapidamente e a distanza molti tag , ad esempio per la gestione dell'inventario nei magazzini, il conteggio delle persone durante gli eventi o la misurazione del tempo degli atleti al traguardo nelle gare.
Lo svantaggio è che, avendo una lunghezza d'onda più corta, il segnale si attenua maggiormente e penetra meno efficacemente metalli e acqua . Nonostante ciò, sono ampiamente utilizzati nei sistemi di pedaggio, nel controllo degli accessi ai parcheggi e nel tracciamento della logistica su larga scala.
Modulo RFID RC522: caratteristiche e pin
Per i progetti Arduino, uno dei lettori più popolari è l'RC522, basato sul chip NXP MFRC522. Si tratta di un modulo molto economico e ampiamente utilizzato che opera ad alta frequenza (13,56 MHz) con schede MIFARE e consente sia la lettura che la scrittura su tag compatibili.
Solitamente viene venduto in un kit che include il lettore stesso, una carta di credito e un portachiavi RFID. Queste carte sono in genere carte MIFARE Classic da 1K o 4K, uno standard estremamente diffuso nei trasporti, nel controllo accessi e nelle soluzioni a basso costo. L'RC522 genera un campo elettromagnetico ad alta frequenza e, in pratica, il suo raggio d'azione è di circa 3-5 cm, sebbene teoricamente possa raggiungere distanze maggiori.
Per quanto riguarda la comunicazione con il microcontrollore, l'RC522 è integrato principalmente tramite SPI (Serial Peripheral Interface) e supporta velocità fino a 10 Mbps. Supporta anche I2C e UART, sebbene nella maggior parte dei progetti Arduino si utilizzi SPI per la sua maggiore velocità e semplicità in questo contesto.
Dal punto di vista elettrico, il modulo funziona con una tensione di alimentazione compresa tra 2,5 V e 3,3 V. La scheda solitamente presenta un pin VCC chiaramente indicato per il collegamento a 3,3 V. Non alimentarlo direttamente a 5 V , altrimenti si rischia di danneggiarlo. Di contro, i livelli logici sono generalmente tolleranti a 5 V, quindi può essere collegato ai pin digitali di Arduino UNO senza convertitori di livello per test di base, sebbene in un progetto professionale sia consigliabile adattare i livelli.
Collegamento del modulo RC522
Il tipico RC522 include 8 pin di connessione al microcontrollore:
- VCC: alimentazione, tra 2,5 V e 3,3 V.
- RST: pin di reset; consente di spegnere e riavviare il modulo impostando il livello su BASSO/ALTO.
- GND: massa o riferimento della terra.
- IRQ: pin di interrupt che può avvisare il microcontrollore quando un tag entra nel campo di lettura.
- MISO / SCL / TX: pin multifunzione; come MISO in SPI, come SCL in I2C o come TX in UART.
- MOSI: linea dati di uscita dal master allo slave in SPI.
- SCK: Orologio dell'interfaccia SPI.
- SS / SDA / RX: pin di selezione slave in SPI, SDA in I2C o RX in UART.
Su Arduino UNO e altre schede basate su ATmega328P, i pin SPI sono già definiti dall'hardware, quindi lo schema di connessione tipico per l'utilizzo di SPI è il seguente:
- VCC → 3,3 V da Arduino.
- GND → GND di Arduino.
- SCK → pin 13 su UNO/Nano.
- MOSI → pin 11 su UNO/Nano.
- MISO → pin 12 su UNO/Nano.
- SS (SDA) → pin 10 (o quello che scegli come SS, ma devi specificarlo nel codice).
- RST → ad esempio, il pin 9 di Arduino.
- IRQ → Opzionale, può essere lasciato scollegato se non viene utilizzato alcun interrupt.
Su schede come Arduino Mega, Leonardo o Micro, le linee SPI potrebbero trovarsi su pin diversi o sul connettore ICSP, quindi è importante consultare la tabella di equivalenza nella documentazione ufficiale prima di effettuare qualsiasi collegamento.
Installazione della libreria MFRC522 e lettura di base dei tag
Sebbene il microcontrollore MFRC522 possa essere programmato da zero, la sua comunicazione interna è piuttosto complessa, quindi è prassi comune utilizzare la libreria sviluppata da Miguel Balboa , disponibile su GitHub e nel gestore librerie dell'IDE di Arduino. Questa libreria incapsula tutte le operazioni necessarie per inizializzare il lettore, rilevare le schede, autenticare i settori e leggere o scrivere blocchi.
Per installarlo dall'IDE di Arduino, è sufficiente aprire il Gestore librerie, cercare "MFRC522" e selezionare la versione gestita dalla community (GitHub Community) . È inoltre necessario includere la libreria SPI, che è già inclusa nell'IDE.
Una volta installato, il flusso tipico in uno sketch semplice per leggere l'UID di un'etichetta è il seguente:
- Includi le librerie SPI.hy MFRC522.h.
- Definire i pin RST e SS che il lettore utilizzerà .
- Crea un oggetto MFRC522 passandogli quei pin.
- In setup(), inizializza Serial, SPI e il lettore con PCD_Init().
- Nel ciclo(), usa PICC_IsNewCardPresent() per scoprire se c'è una carta nelle vicinanze e PICC_ReadCardSerial() per leggere i tuoi dati di base.
- Accedere all'UID utilizzando mfrc522.uid.uidByte e alla dimensione con mfrc522.uid.size.
- Terminare la comunicazione con l'etichetta chiamando PICC_HaltA().
Questo tipo di sketch è perfetto per ottenere l'UID di diverse carte o portachiavi ed eseguire test rapidi, ad esempio, per un semplice controllo degli accessi in cui viene confrontato solo l'UID letto con un elenco di UID autorizzati.
Struttura della memoria nelle schede MIFARE Classic 1K
Le schede che solitamente accompagnano l'RC522 sono in genere MIFARE Classic 1K . Queste schede offrono 1 KB di memoria organizzata gerarchicamente in settori e blocchi, con un sistema di chiavi e permessi piuttosto particolare che è bene comprendere prima di scrivere qualsiasi cosa.
La memoria totale è suddivisa in 16 settori numerati da 0 a 15. Ogni settore contiene 4 blocchi, etichettati da 0 a 3 all'interno di quel settore. Ogni blocco memorizza 16 byte di dati , ovvero 16 posizioni numerate da 0 a 15, quindi ogni settore offre 64 byte.
All'interno dei quattro blocchi per settore, solo tre sono destinati alla memorizzazione dei dati utente: i blocchi 0, 1 e 2 di ciascun settore (ad eccezione del settore 0, che presenta caratteristiche speciali). L'ultimo blocco di ogni settore, il blocco 3, è noto come blocco di chiusura . In esso sono memorizzate le chiavi di crittografia e i bit di accesso che controllano le operazioni consentite in quel settore.
Nel trailer, i 16 byte sono suddivisi come segue:
- Chiave A: 6 byte.
- Modalità di accesso: 3 byte che definiscono i permessi di lettura/scrittura, l'autenticazione e la visibilità della chiave.
- Byte non utilizzato (U): 1 byte non utilizzato.
- Tasto B: 6 byte.
Le schede fornite di fabbrica con i moduli solitamente hanno la Chiave A e la Chiave B inizializzate a FF FF FF FF FF FF , il che è estremamente insicuro, poiché chiunque conosca lo standard può autenticare e modificare il contenuto della scheda. Una pratica relativamente comune nei progetti fai-da-te è quella di utilizzare le stesse chiavi per tutti i settori, sebbene per una reale sicurezza sarebbe meglio diversificare.
Inoltre, il blocco 0 del settore 0 è particolare: memorizza l' UID della scheda (solitamente 4 byte in queste schede MIFARE Classic) e i dati del produttore. Questo blocco è considerato di sola lettura nella pratica; tentare di modificarlo può danneggiare irreversibilmente la scheda.
Cambiare i tasti Tasto A e Tasto B in un settore
Se si desidera utilizzare una scheda MIFARE in un progetto Arduino e RC522 in modo significativo, la prima cosa da fare è modificare le chiavi predefinite . Questo impedisce a chiunque disponga di un lettore e della libreria standard di manomettere la scheda senza autorizzazione.
L'idea di base per aggiornare le chiavi di un settore specifico (ad esempio, il settore 15) è la seguente:
- Definisci le chiavi correnti nel codice (i valori predefiniti di fabbrica, se non sono stati modificati).
- Definisci le nuove parole chiave A e B che desideri utilizzare in quel settore.
- Calcola il numero del blocco rimorchio per quel settore, che è settore * 4 + 3 (per il settore 15, blocco 63).
- Autenticarsi prima con la chiave corrente A utilizzando PCD_Authenticate() riguardo al blocco rimorchio.
- Leggi il blocco del trailer con MIFARE_Read() per ottenere i tuoi contenuti.
- Modifica i byte corrispondenti alle nuove chiavi in ​​un buffer.
- Autenticarsi nuovamente se necessario (ad esempio, con la Chiave B).
- Scrivi il blocco trailer aggiornato con MIFARE_Write().
Durante questo processo, è fondamentale non spostare la scheda dal lettore fino al completamento dell'operazione , poiché una scrittura interrotta sul blocco di coda potrebbe rendere il settore inaccessibile. Una volta modificati i tasti, sarà inoltre necessario aggiornare il codice Arduino per utilizzare questi nuovi tasti nelle operazioni future su quel settore.
Blocchi di lettura e scrittura: simulazione di una tessera di trasporto
Un'applicazione molto esemplificativa della lettura e scrittura con MIFARE Classic è la simulazione del funzionamento di una tessera ricaricabile per il trasporto pubblico . L'idea è semplice: la tessera memorizza un certo numero di viaggi in un blocco specifico e il sistema consente di caricare viaggi (ricaricare) o utilizzarli (convalida all'ingresso dell'autobus o del tram).
A tale scopo, il settore 15 potrebbe essere riservato ai dati utente, ad esempio, e uno dei suoi blocchi di dati (ad esempio, il blocco 60) potrebbe essere utilizzato per memorizzare il contatore dei viaggi. Il numero di viaggi disponibili viene memorizzato nel byte 0 del blocco. I byte rimanenti del blocco potrebbero essere utilizzati per altri dati o semplicemente lasciati a zero.
Il flusso di codice tipico per la parte di ricaricamento sarebbe il seguente:
- Definire Tasto A e tasto B le normative vigenti che tutelano il settore in questione (ad esempio, quelle che abbiamo modificato nella fase precedente).
- Definire il numero del settore, il blocco dati (60) e il blocco trailer (63).
- Dichiarare un array di 16 byte (blockData) in cui il primo byte rappresenterà il numero di viaggi.
- Ogni volta che una carta viene avvicinata al lettore, Leggi il blocco 60 Utilizzo di MIFARE_Read() per ottenere i viaggi correnti.
- Aggiungere al valore letto il numero di viaggi necessari per la ricarica (ad esempio, 10).
- Aggiorna i dati. Blocca con il nuovo numero di viaggi.
- Autenticarsi con la chiave A rispetto al blocco trailer corrispondente.
- Scrivi il blocco 60 con MIFARE_Write().
- Rileggi attentamente per verificare che il valore sia stato aggiornato correttamente.
Per la parte relativa al consumo di viaggio (validazione sull'autobus), il codice è praticamente identico, ma invece di aggiungere, si sottrae uno dal contatore. Prima di sottrarre, si verifica se il valore letto è zero: se non ci sono viaggi rimanenti, l'accesso viene negato e all'utente viene richiesto di ricaricare . Se il contatore è maggiore di zero, viene decrementato, il blocco viene riscritto e il numero di viaggi rimanenti viene visualizzato sullo schermo.
In entrambi i casi è importante gestire correttamente i codici di ritorno delle funzioni della libreria MFRC522 (ad esempio, errori di autenticazione o di scrittura) e interrompere sempre la comunicazione crittografata con PCD_StopCrypto1() e la scheda stessa con PICC_HaltA() al termine di ogni ciclo.
Controllo degli accessi semplice basato sull'UID
Un altro progetto classico che utilizza il microcontrollore RC522 e Arduino è un semplice sistema di controllo accessi in cui l'ingresso viene consentito o negato in base all'UID della scheda presentata. Questo approccio non utilizza la memoria interna della scheda, ma solo il suo identificativo univoco, ed è quindi piuttosto limitato in termini di sicurezza, ma serve come esempio rapido.
L'approccio tipico è:
- Leggere l'UID della scheda utilizzando le funzioni di base della libreria (PICC_IsNewCardPresent, PICC_ReadCardSerial, ecc.).
- Copia i byte dell'UID letto in un array temporaneo (ad esempio, ActualUID).
- Definisci nel codice diversi array con gli UID delle carte autorizzate (ad esempio, Utente1, Utente2).
- Crea una funzione di confronto di array di byte che restituisce vero se entrambi sono identici.
- Confronta ActualUID con ogni UID autorizzato e, se si verifica una corrispondenza, attiva un'uscita digitale, visualizza il messaggio "Accesso consentito" o attiva una serratura elettrica.
- Se non corrisponde a nessuno di essi, visualizza "Accesso negato" e mantieni il sistema chiuso.
In un ambiente reale, un sistema di questo tipo è vulnerabile alla clonazione dei tag, poiché molti lettori economici consentono la copia o l'emulazione degli UID. Per aumentare la sicurezza, sarebbe necessario utilizzare la memoria interna della scheda, chiavi personalizzate e possibilmente meccanismi crittografici più robusti rispetto a quelli di MIFARE Classic, la cui sicurezza è attualmente ampiamente messa in discussione. Ciononostante, rappresenta un eccellente esempio didattico per apprendere il flusso di lavoro di lettura delle schede e la sua integrazione con attuatori fisici.
Grazie a quanto appreso finora, ora avete una solida comprensione dei concetti essenziali della tecnologia RFID, sapete come si comportano le diverse bande di frequenza, conoscete il funzionamento interno di una scheda MIFARE Classic 1K, padroneggiate la connessione e l'utilizzo di base del modulo RC522 con Arduino e avete visto in dettaglio come leggere e scrivere blocchi per creare sistemi reali come il controllo accessi o le carte per i trasporti pubblici . A questo punto, il passo successivo naturale è combinare la tecnologia RFID con altri moduli (schermi LCD, relè, Wi-Fi, database cloud) e imparare a controllare le lampadine intelligenti per realizzare soluzioni più complete, ancora più simili ai sistemi professionali che vedete quotidianamente nei negozi, sui mezzi pubblici e nei dispositivi di pagamento contactless.
