Robotica educativa/Lettore RFID
Quando si legge il termine RFID si intende identificazione a radiofrequenza (dall'inglese Radio-Frequency IDentification, da cui l'acronimo).
Ingredienti
modificaSebbene gli utilizzi siano tantissimi, per semplificare, è possibile pensare al sistema come una chiave elettronica che apre una porta. Per creare un sistema RFID (indipendentemente dal suo utilizzo) occorrono tre elementi fondamentali:
- una (o più) etichette RFID (note anche come tag o transponder), le chiavi che possono essere riconosciute o meno;
- un dispositivo in grado di leggerne il contenuto (una sequenza di numeri), il quale può corrispondere alla serratura;
- infine, occorre un microcontrollore che gestisca il lettore e – a seconda del dato letto – esegua determinate azioni.
Un passo alla volta.
Nei kit Arduino, spesso sono presenti tre oggetti:
- due tag RFID (uno simile a una carta di credito e un secondo facile da inserire in un portachiavi), come in figura;
- il dispositivo RFID-RC522 in grado di leggere (e scrivere, ma questa è un'altra storia) i dati dei tag nelle vicinanze (al di sotto dei 10 cm).
Con queste (e altre) smart-card è possibile testare il circuito, osservando:
- quali vengono riconosciute dal microcontrollore (perché operanti alla frequenza di 13,56 MHz) e quali no;[1]
- simulare il concetto di accesso consentito/accesso negato;
- azionare qualsiasi dispositivo, una volta inserita la chiave elettronica corretta.
Codice base
modificaIn questo paragrafo non si azioneranno dispositivi in seguito all'accostamento di un tag al sensore. Una volta letto il dato contenuto nel tag, questo verrà inviato alla porta seriale, oppure – se non è possibile leggerlo – verrà inviato un messaggio di errore.
Nelle espansioni suggerite verranno suggeriti numerosi utilizzi di questo codice.
Inizializzazione
modifica#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
Serial.begin(9600); // Inizializza la porta seriale
SPI.begin(); // Inizializza il bus SPI
mfrc522.PCD_Init(); // Inizializza il lettore MFRC522
Serial.println("Accosta un tag RFID sul lettore");
}
Programma principale
modificavoid loop() {
// Esegue un controllo ogni 100 ms
delay(100);
// Se non e' presente nessuna carta ricomincia
if (!mfrc522.PICC_IsNewCardPresent())
return;
// Se non sta leggendo nessuna carta ricomincia
if (!mfrc522.PICC_ReadCardSerial())
return;
// Legge il contenuto del tag RFID
String uid = leggiRFID();
// Scrive il suo codice univoco (uid) nella porta seriale
Serial.print("UID: ");
Serial.println(uid);
}
Lettura del tag
modificaLa funzione leggiRFID
necessita di alcune spiegazioni preliminari.
È in formato String
, questo significa che restituirà una serie di caratteri di testo acquisiti dal tag della scheda. Questi dati verranno restituiti dalla variabile content
, inizialmente vuota.
Essendo una funzione non complessa, ma che introduce elementi non mostrati in precedenza verrà spiegata passo, passo.
// Legge il contenuto del tag RFID
String leggiRFID() {
String content = "";
// Restituisce il contenuto del tag in formato esadecimale
for (byte i = 0; i < mfrc522.uid.size; i++) {
// antepone uno 0 se il byte e' compreso tra 0x00 e 0x0F (0 e 15)
content.concat(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
// concatena il dato letto in formato esadecimale (dopo averlo convertito nel formato String)
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
return content;
}
- Nella linea 39 si crea la variabile che ospiterà il contenuto del tag letto.
- Nella linea 42 si crea un ciclo che va dal primo byte all'ultimo, pari alla dimensione del codice da acquisire:
mfrc522.uid.size
.[2] - Le linee 44 e 46 concatenano (aggiungono in coda) i byte via, via, letti.
- La linea 44 è un
if
, realizzato nella formacondizione ? parte vera : parte falsa
. Così, può essere inserita in qualsiasi funzione. Se il byte è minore di16
(in esadecimale, lo specifica indirettamente, scrivendo0x10
) concatena il testo" 0"
, altrimenti soltanto uno spazio (" "
).[3] - Nella linea 46, viene concatenato il byte letto (
mfrc522.uid.uidByte[i]
) dopo averlo convertito nel formatoString
. Pertanto si avranno sempre due cifre esadecimali per ogni ciclo, da0x00
a0xFF
, grazie alla linea 44, precedute da uno spazio. - Terminata la costruzione della stringa, la linea 49 restituisce il dato contenuto nel tag RFID.
Schema di montaggio
modificaLo schema di montaggio è – allo stesso tempo – semplice e complesso. Semplice, perché basta seguirlo (sono sette cavi, di cui due di alimentazione) e il tutto verrà gestito da librerie. Complesso perché, se si vuole far un uso avanzato con i lettori a radiofrequenza, bisogna capire perché sono state fatte determinate scelte.
Il circuito proposto è il seguente:
Espansioni suggerite
modifica- La prima cosa che si può fare, la più semplice in assoluto, è accendere e spegnere un led quando si accosta un tag con codice autorizzato.
- Per chi ha più fantasia si può sostituire il led con un servomotore: in questo modo il tag può aprire la sbarra di un parcheggio in miniatura.
- Sempre secondo il medesimo principiò si può utilizzare un relè e accendere/spegnere le luci di casa.[4]
- Sempre con un relè e un solenoide, si può aprire una serratura.[5]
- Infine, con un lettore MP3 per Arduino si può riprodurre la propria playlist preferita.
Note
modifica- ↑ Attenzione. Il fatto che una smart-card non venga riconosciuta, non significa che non sia un RFID. Potrebbe sì, lavorare a frequenze o con protocolli differenti, ma potrebbe anche essere un sistema pensato per dispositivi simili ma che richiede una diversa tecnologia per operare. Un esempio è la tessera dei trasporti pubblici di Valencia che viene letta correttamente, ma non quelle londinesi o irlandesi, a titolo di esempio.
- ↑ Le smart card tipicamente hanno un codice pari a 4 byte (oltre 4 miliardi di combinazioni possibili). Infatti
uid
sta per identificativo univoco. Se si tenta di leggere una VISA o un bancomant la cosa funziona e si noterà che verranno letti 7 byte: pertanto le possibili combinazioni sono un po' più alte, pari a 72.057.594.037.927.936. - ↑ Per chi non lo avesse mai incontrato, il codice esadecimale è un raggruppamento di quattro cifre binarie. Infatti, e, per i valori da 10 a 15, si utilizzano le lettere dalla A alla F. Pertanto un byte (un insieme di 8 bit) va da 0 a 255 (da
0x00
a0xFF
). È un metodo compatto per visualizzare cifre binarie. Infatti, con 4 byte (8 simboli) si esprimono valori da 0 a 4.294.967.295. - ↑ Quest'ultima cosa va fatto sotto la supervisione di un utente esperto e soltanto se si è ben consapevoli di cosa si sta facendo. Occorre saper gestire un impianto in media tensione.
- ↑ Anche in questo caso, prima di gettare alle ortiche la meccanica, è bene ricordarsi che senza tensione di rete, o con batterie scariche quella porta occorrerà sfondarla.