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
[modifica | modifica sorgente]Sebbene 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
[modifica | modifica sorgente]In 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 | modifica sorgente]#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
[modifica | modifica sorgente]void 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
[modifica | modifica sorgente]La 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
[modifica | modifica sorgente]Lo 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 | modifica sorgente]- 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 | modifica sorgente]- ↑ 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.