Controllo accessi RFID con ESP8266: una semplice soluzione

Introduzione

In questo articolo realizzeremo un semplice controllo accessi RFID.
Nell’era sempre più interconnessa e orientata alla sicurezza, il controllo degli accessi diventa cruciale per garantire ambienti protetti e gestiti in modo efficiente. In questo contesto, l’impiego della tecnologia RFID (Radio-Frequency Identification) e di dispositivi come l’ESP8266 assume un ruolo centrale. Nel nostro articolo esploreremo un progetto innovativo che sfrutta una ESP8266, un modulo RFID e un relè per creare un sistema di controllo accessi intelligente e personalizzabile. Scopriremo come, grazie a un dizionario che associa codici RFID a permessi di accesso, è possibile gestire l’attivazione di un relè in modo sicuro ed efficiente. Un’implementazione versatile che trova applicazioni in scenari come il controllo di porte, cancelli o altre aree ad accesso limitato.

Come al solito ci serviremo dell’ottimo IDE PlatformIO per la stesura del codice.

Cosa è la tecnologia RFID

Il Radio-Frequency Identification (RFID) è un sistema di identificazione automatica che utilizza campi elettromagnetici per trasferire dati tra un lettore e una tag RFID. Questa tecnologia è basata sulla comunicazione senza contatto e consente la memorizzazione e il recupero di informazioni da oggetti, animali o persone dotati di tag RFID. Ecco alcuni punti chiave relativi al funzionamento e all’utilizzo dell’RFID:

  1. Principio di funzionamento:
    • Un sistema RFID è composto da un lettore (o interrogatore) e una o più tag RFID.
    • La tag contiene un chip che memorizza un codice univoco o altre informazioni.
    • Quando la tag si trova nel campo elettromagnetico del lettore, riceve energia e trasmette i dati memorizzati al lettore.
  2. Frequenze di funzionamento:
    • Gli RFID operano a diverse frequenze, suddivise principalmente in bassa frequenza (LF), alta frequenza (HF), ultra alta frequenza (UHF), e frequenza molto alta (VHF).
    • Le diverse frequenze influenzano la distanza di lettura e la capacità di penetrare attraverso materiali.
  3. Tipi di tag RFID:
    • Le tag possono essere attive (con batteria) o passive (senza batteria).
    • Le tag passive sono alimentate dal campo del lettore e hanno una distanza di lettura più breve rispetto alle tag attive.
  4. Applicazioni comuni:
    • Controllo degli accessi: badge RFID per aperture automatiche o autenticazioni di sicurezza.
    • Logistica e tracciabilità: monitoraggio di merci in transito attraverso magazzini e catene di distribuzione.
    • Pagamenti contactless: sistemi di pagamento senza contatto come le carte contactless.
  5. Sicurezza e privacy:
    • L’RFID può presentare sfide legate alla sicurezza e alla privacy, con la possibilità di intercettare e clonare i dati.
    • Sono state sviluppate varie tecniche di crittografia per proteggere le informazioni scambiate tra i lettori e le tag.
  6. Implementazione con ESP8266:
    • L’ESP8266 può essere utilizzato come lettore RFID, interfacciandosi con un modulo RFID compatibile.
    • Le informazioni lette dalla tag RFID possono essere utilizzate per attivare specifiche azioni o accedere a risorse.

L’utilizzo di RFID offre un’efficace e conveniente soluzione per molteplici applicazioni, consentendo l’automazione di processi e migliorando l’efficienza operativa.

Descrizione del funzionamento

Il nostro sistema di controllo accessi RFID basato su ESP8266 e modulo RFID offre una gestione intelligente e personalizzata degli accessi. Utilizzando un dizionario che associa singoli codici RFID a specifici permessi, il dispositivo è in grado di discriminare tra utenti autorizzati e non autorizzati. Quando un utente presenta il suo badge RFID al lettore, il sistema consulta il dizionario e, in base al permesso associato, può attivare o non attivare un relè.

  • Accesso autorizzato: in caso di corrispondenza positiva tra il codice RFID e il permesso nel dizionario, il relè viene attivato per un periodo prestabilito, consentendo l’apertura di una porta o di un cancello. Questa funzionalità trova applicazione ideale in contesti quali uffici, magazzini o aree riservate.
  • Accesso negato: se il codice RFID non è presente nel dizionario o se il permesso associato è limitato, il relè rimane inattivo, garantendo che l’utente non autorizzato non possa accedere all’area protetta. Questo livello di controllo è essenziale per la sicurezza in ambienti sensibili.
  • Personalizzazione flessibile: il dizionario consente una gestione flessibile dei permessi, consentendo all’amministratore di aggiungere, modificare o revocare l’accesso a utenti specifici in base alle esigenze.

NOTA: in questo progetto viene utilizzato un modulo doppio relè optoisolato ma useremo solo uno dei due relè. Quindi puoi anche scegliere un modulo a singolo relè optoisolato oppure usare quello doppio magari facendo attivare uno dei due relè da un badge e l’altro relè da un altro badge o dal portachiavi.

Cosa è un dizionario

  1. Definizione di dizionario:
    • In programmazione, un dizionario è una struttura dati che consente di memorizzare coppie chiave-valore.
    • Ogni elemento del dizionario è costituito da una chiave unica associata a un valore.
  2. Struttura e accesso:
    • I dizionari sono strutturati in modo da consentire un accesso rapido ai valori tramite le chiavi.
    • L’accesso ai valori avviene specificando la chiave associata, consentendo un recupero efficiente delle informazioni.
  3. Chiavi e Valori:
    • Le chiavi in un dizionario sono di solito stringhe, numeri o altri tipi di dati immutabili.
    • I valori possono essere di qualsiasi tipo, inclusi numeri, stringhe, liste o addirittura altri dizionari.
  4. Utilità e applicazioni:
    • I dizionari sono ampiamente utilizzati per gestire dati strutturati e associare informazioni in modo flessibile.
    • Sono particolarmente utili quando si deve accedere ai dati tramite identificatori univoci anziché posizioni fisse.
  5. Operazioni comuni:
    • Aggiunta di nuove coppie chiave-valore: mioDizionario[chiave] = valore.
    • Rimozione di una coppia: delete mioDizionario[chiave].
    • Recupero del valore associato a una chiave: valore = mioDizionario[chiave].
  6. Iterazione:
    • È possibile iterare su tutte le chiavi, i valori o le coppie chiave-valore del dizionario.
    • Ciò consente di eseguire operazioni su tutti gli elementi del dizionario in modo efficiente.
    • È possibile estrarre la lista di tutte le chiavi o di tutti i valori presenti nel dizionario.
  7. Implementazione nell’ESP8266:
    • In contesti di programmazione per ESP8266, i dizionari sono spesso utilizzati per gestire configurazioni, associazioni chiave-valore dinamiche o mappare informazioni rilevanti.
  8. Efficienza e complessità:
    • L’efficienza nell’accesso ai dati tramite chiavi rende i dizionari una scelta ideale per situazioni in cui è necessario un recupero veloce delle informazioni.
    • La complessità temporale per le operazioni di ricerca, inserimento e cancellazione è spesso molto bassa rispetto ad altre strutture dati.

L’utilizzo di dizionari aggiunge un livello di flessibilità e organizzazione ai programmi, consentendo una gestione efficiente e dinamica delle informazioni.

Il kit RFID impiegato in questo progetto

Il kit, distribuito dall’azienda AZ-DELIVERY si compone di un lettore RFID, un badge, un portachiavi (sempre RFID), due tipi di connettori da saldare sul lettore (uno con i contatti dritti e uno con i contatti ad angolo retto). Se non hai dimestichezza col mondo dei saldatori e vuoi provare a saldare il connettore in autonomia, ti consiglio di dare uno sguardo all’articolo Un altro tutorial su come saldare.

Sia il badge che il portachiavi contengono un codice che può essere letto dal lettore RFID. Nel mio caso il badge ha codice esadecimale 7351E99 mentre il portachiavi ha codice esadecimale A35CDB.

Ai fini del progetto ho impostato il dizionario all’interno dello sketch in modo che il codice A35CDB possa far scattare il relè mentre al codice 7351E99 tale operazione sia inibita.

Il modulo di lettura RFID si interfaccia all’ESP8266 tramite comunicazione SPI di cui parleremo nel paragrafo successivo.

Nella foto successiva potrai vedere il kit completo:

Kit RFID completo
Kit RFID completo

Interfaccia SPI

Il modulo lettore RFID utilizza l’interfaccia SPI, che è un protocollo seriale di comunicazione a 4 fili comunemente utilizzato in progetti embedded. Questi quattro fili sono:

  1. MISO (Master In Slave Out): questo è il pin attraverso il quale il modulo riceve dati dal dispositivo master, che di solito è l’Arduino o un altro microcontrollore.
  2. MOSI (Master Out Slave In): questo è il pin attraverso il quale il modulo invia dati al dispositivo master.
  3. SCK (Serial Clock): questo è il pin del clock che sincronizza la trasmissione dei dati tra il modulo e il dispositivo master.
  4. CS (Chip Select): questo pin viene utilizzato per selezionare il modulo RFID e inizializzare le operazioni di invio/ricezione dei dati.

Di che componenti abbiamo bisogno?

La lista dei componenti non è particolarmente lunga:

  • una breadboard per connettere la NodeMCU ESP8266 agli altri componenti
  • alcuni fili DuPont (maschio – maschio, maschio – femmina, femmina – femmina)
  • un kit RFID come quello mostrato al paragrafo precedente
  • un modulo con singolo/doppio relè optoisolato
  • e, ovviamente, una NodeMCU ESP8266 !

Per quanto riguarda la scelta del modulo relè valgono le considerazioni presenti alla fine del paragrafo “Descrizione del funzionamento”.

Il modulo doppio relè

  1. Alimentazione:
    • Accetta un’ampia gamma di tensioni di alimentazione, di solito compresa tra 5V e 12V.
    • Il connettore di alimentazione è progettato per essere facilmente collegato a una sorgente di alimentazione esterna, come una batteria o un alimentatore.
  2. Relè:
    • Due relè a bordo, ciascuno con i propri contatti elettrici: comune (COM), normale aperto (NO) e normale chiuso (NC).
    • I contatti del relè sono progettati per gestire carichi di potenza. Tuttavia, le specifiche esatte dipendono dal modello specifico del modulo relè.
  3. Ingressi di Controllo:
    • Due ingressi di controllo (IN1 e IN2) che possono essere collegati a pin digitali di una scheda di sviluppo tipo Arduino.
    • Attivare uno di questi ingressi con un segnale logico alto (o basso, a seconda dei casi) attiverà il relè corrispondente.
  4. Indicatori LED:
    • Indicatori LED incorporati per ogni relè che indicano lo stato di attivazione (spesso con colori come rosso per attivato e spento per disattivato).
  5. Compatibilità Arduino:
    • Progettato per essere facilmente integrato con piattaforme di sviluppo come Arduino, rendendo il controllo dei relè un’operazione semplice e accessibile.
  6. Carichi Pilotabili:
    • In grado di pilotare una varietà di carichi elettrici come lampadine, motori, elettrovalvole, e altri dispositivi che richiedono controllo on/off.
    • Le specifiche esatte del carico dipendono dal modello del relè, ma spesso possono gestire carichi con tensioni alternate fino a 250V e correnti fino a 10A.

Questi moduli relè sono ampiamente utilizzati in progetti di domotica, automazione elettronica e controlli remoti, fornendo un’interfaccia sicura e controllata per dispositivi di potenza.

Un esempio di modulo con doppio relè optoisolato usato dal controllo accessi RFID
Un esempio di modulo con doppio relè optoisolato usato dal controllo accessi RFID

Realizzazione del progetto

Lo schema elettrico del controllo accessi RFID con ESP8266

Prima di realizzare il circuito vero e proprio diamo un’occhiata al pinout della board:

Pinout del NodeMCU ESP8266
Pinout del NodeMCU ESP8266

Di seguito vediamo il pinout del modulo RFID:

Pinout del modulo RFID
Pinout del modulo RFID

Il terminale IRQ non verrà utilizzato.

Vediamo ora lo schema elettrico del progetto, realizzato come al solito con Fritzing:

Schema elettrico completo
Schema elettrico completo

Come si può osservare dallo schema, verrà utilizzato un solo relè, quello facente capo all’ingresso IN1.

Come puoi vedere lo schema non è particolarmente complesso. Piuttosto devi fare attenzione alle alimentazioni dato che sono separate tra sezione di alimentazione del sensore e sezione di alimentazione del modulo relè. Come puoi vedere, l’alimentazione per il sensore è presa dall’uscita 3.3V del NodeMCU (pin 3V3). E’ necessario alimentarlo con 3.3V in modo che anche la sua uscita sia 3.3V in quanto i pin digitali del NodeMCU non accettano tensioni superiori a 3.3V.

Invece l’alimentazione del modulo relè è presa dal pin Vin del NodeMCU che eroga i 5V necessari a pilotare le bobine dei relè.

ATTENZIONE: nel NodeMCU ESP8266 la tensione massima tollerata dagli ingressi digitali è pari a 3.3V. Qualsiasi tensione superiore lo danneggerebbe irreparabilmente!!

Attualmente il modulo doppio relè non è presente in Fritzing ma, se vuoi usarlo nei tuoi progetti, puoi scaricarlo da qui.

Analizziamo più in dettaglio il collegamento del modulo relè.

I due pin Vin e GND del NodeMCU ESP8266 vengono utilizzati per alimentare il modulo a doppio relè, collegando il pin Vin (lato NodeMCU) al pin VCC (lato modulo a doppio relè) e i due pin GND (massa).

Un’altra connessione è usata per controllare il modulo relè tramite il filo arancione che collega l’uscita digitale D1 del NodeMCU all’ingresso IN1 del modulo relè.

Noterai che sul modulo relè è presente un ponticello (disegnato in azzurro sul connettore sinistro) che collega i morsetti JD-VCC e VCC. Questo ponticello viene utilizzato per alimentare il modulo relè attraverso i terminali VCC e GND sul connettore destro. Senza questo ponticello, saremmo costretti ad alimentare il modulo con un alimentatore esterno.

Lo sketch

Creiamo il progetto PlatformIO

Abbiamo già visto la procedura di creazione di un progetto PlatformIO nell’articolo Come creare un progetto per NodeMCU ESP8266 con PlatformIO. Puoi seguire la guida ma non installare alcuna delle librerie indicate.

Ora modifica il file platformio.ini in modo che abbia questo aspetto:

[env:nodemcu]
platform = espressif8266
board = nodemcu
framework = arduino
monitor_speed = 115200
upload_speed = 921600
lib_deps = 
	miguelbalboa/MFRC522@^1.4.11
	arkhipenko/Dictionary@^3.5.0

In questo modo stiamo direttamente inserendo le librerie per la gestione del sensore RFID e per la creazione e gestione del dizionario degli accessi.

Ovviamente puoi scaricare il progetto dal link seguente:

NOTA: lo sketch è stato creato derivandolo da uno degli esempi forniti dalla libreria per RFID di Miguel Balboa.

Sostituisci il file main.cpp del progetto che hai creato con quello presente nel file zip.

Vediamo ora come funziona lo sketch.

Inizialmente vengono incluse le librerie necessarie:

#include <SPI.h>
#include <MFRC522.h>
#include <Dictionary.h>

Vengono poi definiti i GPIO per il reset e il chip select del sensore RFID:

constexpr uint8_t RST_PIN = D0;     // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = D8;     // Configurable, see typical pin layout above

Vengono poi definiti l’oggetto mfrc522 che gestirà il sensore RFID e la variabile uuidCode che conserverà il codice uuid del badge o del portachiavi:

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance
String uuidCode = "";

Poi viene istanziato il dizionario dictUsers (specificando che ci saranno solo due coppie chiave-valore) e definito il GPIO che verrà usato per comandare il relè:

Dictionary &dictUsers = *(new Dictionary(2));
const int relayPin = D1;

All’inizio della funzione setup viene popolato il dizionario con le informazioni necessarie:

  dictUsers("A35CDB", "y");
  dictUsers("7351E99", "n");

Come già anticipato sia il badge che il portachiavi contengono un codice che può essere letto dal lettore RFID. Nel mio caso il badge ha codice esadecimale 7351E99 mentre il portachiavi ha codice esadecimale A35CDB.

Nel dizionario ho associato alla chiave “A35CDB” il valore “y” e alla chiave “7351E99” il valore “n”. Vedremo nel proseguio del codice che ad un valore “y” corrisponde un accesso consentito (cioè il relè scatterà) mentre al valore “n” corrisponde un accesso negato (il relè non scatterà). In poche parole, l’utente con codice “A35CDB” potrà aprire la porta mentre l’utente con codice “7351E99” non potrà aprirla.

Seguendo la funzione setup, vengono inizializzate la porta seriale, il bus SPI, il sensore RFID e poi viene stampato un messafìggio sul Serial Monitor:

  Serial.begin(115200);                                           // Initialize serial communications with the PC
  SPI.begin();                                                  // Init SPI bus
  mfrc522.PCD_Init();                                              // Init MFRC522 card
  Serial.println(F("Read personal data on a MIFARE PICC:"));    //shows in serial that it is ready to read

Infine viene definito il pin di comando del relè come OUTPUT e posto a livello HIGH (in questo modello di relè, esso viene attivato se il livello è LOW):

pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH);

Troviamo poi la funzione loop che inizialmente controlla se è stato avvicinato un badge al sensore e, in caso positivo, ne legge il contenuto e stampa il messaggio “Card detected”:

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}

// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
} 

Serial.println("\n**Card Detected:**");

Segue una parte che inserisce il codice rilevato nella variabile uuidCode, ne rende i caratteri maiuscoli e lo stampa sul Serial Monitor:

Serial.print("Card UID:  ");
for (byte i = 0; i < mfrc522.uid.size; i++) {
uuidCode = uuidCode + String(mfrc522.uid.uidByte[i], HEX);
} 
uuidCode.toUpperCase();
Serial.println(uuidCode);

Veniamo alla parte che decide chi può aprire la porta o no:

if(dictUsers[uuidCode] == "y") {
    Serial.println("access granted");
    Serial.println("opening the door");
    digitalWrite(relayPin, LOW);
    delay(5000);
    digitalWrite(relayPin, HIGH);
   Serial.println("closing the door");
} else {
   Serial.println("access denied");
}

Abbiamo un blocco if che controlla il valore restituito dal dizionario in corrispondenza del codice contenuto nella variabile uuidCode. Se il valore restituito è y allora l’accesso è abilitato, quindi vengono stampati i relativi messaggi, attivato il relè ponendo l’uscita di controllo a LOW, si aspettano 5 secondi dopo di che il relè viene disattivato ponendo l’uscita di controllo a HIGH.

Nel caso il valore restituito dal dizionario fosse n non viene svolta nessuna azione se non quella di stampare il messaggio di accesso negato.

Il loop termina inizializzando la variabile uuidCode e stampando un messaggio di fine lettura:

uuidCode = "";
Serial.println(F("\n**End Reading**\n"));

Osservazioni

Ovviamente l’uso di un dizionario degli accessi messo direttamente nel codice rende poco immediato il suo aggiornamento. Ogni volta bisogna modificare il dizionario (per esempio se si aggiungono nuovi utenti o si cambiano i privilegi di accesso di un dato utente), compilare lo sketch e caricarlo sull’ESP8266.

Una possibile soluzione sarebbe quella di scrivere e aggiornare un documento Json memorizzato su una SD card e scrivere le funzioni per il suo aggiornamento e la lettura in tempo reale dei privilegi di accesso per ogni utente.

Video del funzionamento del controllo accessi RFID

Il video seguente mostra il funzionamento del dispositivo:

Newsletter

Se vuoi essere aggiornato sui nuovi articoli, iscriviti alla newsletter. Prima dell’iscrizione alla newsletter leggi la pagina Privacy Policy (UE)

Se ti vuoi disiscrivere dalla newsletter clicca sul link che troverai nella mail della newsletter.

Inserisci il tuo nome
Inserisci la tua email
0 0 votes
Valutazione articolo
guest
0 Commenti
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
Torna in alto