Robotica educativa/Lettore RFID

Indice del libro

Quando si legge il termine RFID si intende identificazione a radiofrequenza (dall'inglese Radio-Frequency IDentification, da cui l'acronimo).


Ingredienti

modifica
 
RFID tags operanti a 13,56 MHz

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:

  1. una (o più) etichette RFID (note anche come tag o transponder), le chiavi che possono essere riconosciute o meno;
  2. un dispositivo in grado di leggerne il contenuto (una sequenza di numeri), il quale può corrispondere alla serratura;
  3. 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

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
#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
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

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 forma condizione ? parte vera : parte falsa. Così, può essere inserita in qualsiasi funzione. Se il byte è minore di 16 (in esadecimale, lo specifica indirettamente, scrivendo 0x10) 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 formato String. Pertanto si avranno sempre due cifre esadecimali per ogni ciclo, da 0x00 a 0xFF, 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

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:

 
Come connettere il sensore RFID-RC522 con Arduino Uno R3

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.
  1. 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.
  2. 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.
  3. 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 a 0xFF). È un metodo compatto per visualizzare cifre binarie. Infatti, con 4 byte (8 simboli) si esprimono valori da 0 a 4.294.967.295.
  4. 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.
  5. 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.