Come costruire una serratura RFID con Arduino e RC522

Descrizione

Questo progetto realizza una serratura elettronica RFID con Arduino UNO, un lettore RC522 e un modulo relè da 5 V. Al posto della password da digitare sul tastierino, basta avvicinare una tessera o un portachiavi RFID autorizzato al lettore. Arduino verifica l’identificativo (UID) della tessera e, se è corretto, commuta lo stato del relè: alla prima lettura lo attiva, alla successiva lo disattiva. Il modulo relè usato nel circuito è attivo LOW: il pin 7 di Arduino deve essere impostato su LOW per attivarlo e su HIGH per disattivarlo. Il progetto introduce l’identificazione senza contatto, il controllo degli accessi e la gestione di un relè tramite Arduino.

Componenti necessari:

  • 1x Arduino UNO
  • 1x Modulo lettore RFID RC522 con tessera o portachiavi RFID compatibile
  • 1x Modulo relè 5V SRD-05VDC-SL-C con ingresso di segnale attivo LOW
  • Cavi jumper (breadboard opzionale)
  • Adattamento dei livelli logici da 5 V a 3,3 V, se non integrato nel modulo RFID
  • Serratura elettrica o altro carico a bassa tensione con alimentazione adeguata (opzionale)

Schema:

Schema della serratura RFID con Arduino UNO, modulo RC522 e relè attivo LOW sul pin 7

Codice:

rfid_door_lock.ino
// https://nemiatools.com
#include <SPI.h> // Libreria per la comunicazione SPI
#include <MFRC522.h> // Libreria per il lettore RFID RC522

const byte SS_PIN = 10; // Pin SDA/SS del lettore RFID
const byte RST_PIN = 9; // Pin RST del lettore RFID
const byte relaySignalPin = 7; // Pin IN del modulo relè (attivo LOW)

// UID di ESEMPIO: sostituiscilo con quello della tua tessera!
const byte authorizedUID[] = {0xA3, 0x2F, 0x91, 0x0C};
const byte authorizedUIDLength = sizeof(authorizedUID) / sizeof(authorizedUID[0]);

MFRC522 rfid(SS_PIN, RST_PIN); // Crea il lettore RFID
bool relayActive = false; // Stato iniziale del relè: disattivato

void setRelay(bool active) { // Gestisce il relè attivo LOW
  relayActive = active; // Aggiorna lo stato memorizzato
  digitalWrite(relaySignalPin, active ? LOW : HIGH); // LOW attiva, HIGH disattiva
}

bool isAuthorized() { // Controlla l'UID della tessera letta
  if (rfid.uid.size != authorizedUIDLength) { // Verifica la lunghezza
    return false; // UID con lunghezza diversa
  }

  for (byte i = 0; i < authorizedUIDLength; i++) { // Confronta tutti i byte
    if (rfid.uid.uidByte[i] != authorizedUID[i]) {
      return false; // Almeno un byte è diverso
    }
  }
  return true; // Tutti i byte coincidono
}

void printUID() { // Visualizza l'UID nel Monitor Seriale
  Serial.print(F("UID: "));
  for (byte i = 0; i < rfid.uid.size; i++) {
    if (rfid.uid.uidByte[i] < 0x10) {
      Serial.print('0'); // Completa i valori a una cifra
    }
    Serial.print(rfid.uid.uidByte[i], HEX); // Stampa il byte in esadecimale
    if (i + 1 < rfid.uid.size) Serial.print(' ');
  }
  Serial.println();
}

void setup() {
  digitalWrite(relaySignalPin, HIGH); // Imposta HIGH prima di abilitare l'uscita
  pinMode(relaySignalPin, OUTPUT); // Pin del relè come uscita
  setRelay(false); // Relè inizialmente spento

  Serial.begin(9600); // Avvia il Monitor Seriale a 9600 baud
  SPI.begin(); // Avvia la comunicazione SPI
  rfid.PCD_Init(); // Inizializza il lettore RC522

  Serial.println(F("Avvicina una tessera RFID."));
}

void loop() {
  if (!rfid.PICC_IsNewCardPresent()) { // Cerca una nuova tessera
    return; // Nessuna tessera presente
  }
  if (!rfid.PICC_ReadCardSerial()) { // Legge l'UID della tessera
    return; // Lettura non riuscita
  }

  printUID(); // Mostra l'UID per poter autorizzare la propria tessera

  if (isAuthorized()) { // UID corretto
    setRelay(!relayActive); // Inverte lo stato del relè
    if (relayActive) {
      Serial.println(F("Accesso autorizzato: rele ATTIVO (pin 7 LOW)."));
    } else {
      Serial.println(F("Accesso autorizzato: rele DISATTIVATO (pin 7 HIGH)."));
    }
  } else { // UID non riconosciuto
    Serial.println(F("Tessera non autorizzata: stato invariato."));
  }

  rfid.PICC_HaltA(); // Termina la comunicazione con la tessera
  rfid.PCD_StopCrypto1(); // Ripristina lo stato del lettore
  delay(300); // Piccola pausa tra due letture
}

Come funziona:

Questo progetto usa Arduino UNO, un lettore RFID RC522 e un modulo relè 5V attivo LOW per controllare una serratura o un altro carico tramite una tessera autorizzata. La tessera sostituisce il tastierino: anziché inserire una password, l’utente la avvicina al lettore.

Le righe #include <SPI.h> e #include <MFRC522.h> includono le librerie necessarie. SPI.h gestisce la comunicazione SPI di Arduino, mentre MFRC522.h mette a disposizione i comandi per utilizzare il modulo RC522. Prima di caricare il programma, installa la libreria MFRC522 dal Gestore librerie dell’IDE Arduino.

Nel circuito, il lettore RC522 è collegato ad Arduino nel seguente modo: SDA/SS → 10, SCK → 13, MOSI → 11, MISO → 12, RST → 9, GND → GND e 3.3V → 3.3V. Il pin IRQ non viene utilizzato. Le costanti SS_PIN e RST_PIN indicano alla libreria i pin 10 e 9.

Il modulo relè ha i collegamenti di controllo VCC → 5V, GND → GND e IN → pin 7 di Arduino. La costante relaySignalPin = 7 identifica l’uscita che pilota il relè. I morsetti COM, NO e NC permettono di collegare un circuito esterno, scegliendo il contatto normalmente aperto o normalmente chiuso in base al carico.

L’array authorizedUID contiene i byte dell’identificativo della tessera autorizzata. Il valore {0xA3, 0x2F, 0x91, 0x0C} è soltanto un esempio: va sostituito con l’UID della propria tessera. Per individuarlo, carica inizialmente il codice, apri il Monitor Seriale a 9600 baud, avvicina la tessera e copia nell’array i byte riportati dopo UID:, mantenendo la notazione esadecimale 0x. Se la tessera ha un numero diverso di byte, modifica anche il numero di elementi nell’array.

La riga const byte authorizedUIDLength = sizeof(authorizedUID) / sizeof(authorizedUID[0]); calcola automaticamente la lunghezza dell’UID autorizzato. La funzione isAuthorized() controlla prima la lunghezza della tessera letta e poi confronta, uno per uno, tutti i suoi byte con quelli memorizzati: basta un byte diverso per negare l’autorizzazione.

La variabile relayActive memorizza lo stato corrente del relè. La funzione setRelay(bool active) aggiorna questa variabile e usa digitalWrite(relaySignalPin, active ? LOW : HIGH);: quando active è true invia LOW e attiva il modulo; quando è false invia HIGH e lo disattiva. Questa logica è opposta a quella di un’uscita attiva HIGH.

Nella funzione setup(), il programma imposta il pin 7 su HIGH prima di configurarlo come OUTPUT, poi richiama setRelay(false) per mantenere il relè disattivato. Successivamente, Serial.begin(9600), SPI.begin() e rfid.PCD_Init() avviano rispettivamente la comunicazione seriale, il bus SPI e il lettore RFID.

Nel ciclo loop(), rfid.PICC_IsNewCardPresent() controlla se è stata rilevata una nuova tessera. Se è presente, rfid.PICC_ReadCardSerial() ne legge l’UID. La funzione printUID() lo mostra nel Monitor Seriale anche quando la tessera non è autorizzata, così è possibile recuperare facilmente il codice identificativo della propria tessera.

La condizione if (isAuthorized()) decide se consentire la commutazione. Se l’UID è valido, setRelay(!relayActive); inverte lo stato: da spento ad acceso oppure da acceso a spento. Se l’UID non coincide, lo stato del relè rimane invariato. Non è previsto un tempo automatico di richiusura: per cambiare nuovamente lo stato occorre presentare un’altra volta una tessera autorizzata.

Le istruzioni rfid.PICC_HaltA() e rfid.PCD_StopCrypto1() terminano la gestione della lettura, mentre delay(300) introduce una breve pausa. Per effettuare una nuova lettura della stessa tessera, allontanala dal lettore e poi riavvicinala.

Per una spiegazione dedicata all’utilizzo del modulo, consulta la guida NEMIA TOOLS sul lettore RFID RC522 con Arduino. In questo tutorial ci concentriamo soprattutto sul riconoscimento dell’UID e sul comando del relè.

Attenzione: il modulo RC522 richiede alimentazione a 3,3 V. Con Arduino UNO, i segnali a 5 V diretti agli ingressi del RC522 richiedono un adattamento dei livelli logici, se non già integrato nel modulo; lo schema mostra i collegamenti logici. Verifica inoltre il tipo di relè (attivo LOW), i limiti dei suoi contatti e l’alimentazione del carico. Un semplice UID RFID può essere copiato: questo progetto è didattico e non sostituisce un sistema di sicurezza certificato.

Video dimostrazione:

Questo video non è attualmente disponibile, ci scusi per l'inconveniente.