Lezione 11: Come utilizzare il RFID reader per carte magnetiche

Lezione 11: Come utilizzare il RFID reader per carte magnetiche

[Aggiornato con la nuova libreria, per risolvere i problemi di compilazione]

In questa puntata vedremo come un utilizzare un componente abbastanza interessante, che verrà ripreso successivamente, quando verranno introdotte le varie Shield per Arduino per connetterlo ad Internet. Questo dispositivo si chiama RFID reader è permette di poter leggere facilmente le varie tessere magnetiche con Arduino.

RFID Arduino

Requisiti per il progetto

  • Arduino Uno d8023dded193db365b86e925197efd2e.image.240x240
  • RFID Reader con tessere magnetiche RFID Arduino
  • LED e cavi flessibili Schermata 2013-05-24 alle 09.40.56

Per quanto riguardo il RFID reader sono disponibili diversi modelli; tuttavia, per il nostro programma, conviene utilizzare il modulo mifare RC522, disponibile su Ebay per qualche Euro.

Per avere maggiori dettagli tecnici, riguardo al funzionamento del RFID reader, potete dare un’occhiata al datasheet:

pdf

Arduino RFID reader e i suoi collegamenti

Il collegamento da effettuare dal dispositivo di letture delle tessere ed Arduino è abbastanza semplice, basta collegare i PIN come riportato nella seguente tabella:

RC522 MODULE    Uno/Nano 
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V

Il tipo di collegamento offerto dal modulo, purtroppo non è dei migliori; infatti capita spesso che i contatti tra i fili e il dispositivo non siano stabili e l’alimentazione viene meglio. Per questo motivo, è necessario cercare di fissare bene i collegamenti, in modo da non avere discontinuità nel funzionamento.

Per il corretto funzionamento del RFID reader con i prossimi codici, è necessario scaricare la libreria ufficiale del dispositivo:

github-logo

1° Programma: Mostriamo nel seriale la tessere letta

Con questo programma, sarà possibile leggere il codice delle tessera magnetica, che viene passato sopra il dispositivo.


/* FILE:    RC522_RFID_Module_Example
   DATE:    24/07/13
   VERSION: 0.1
   
REVISIONS:
24/07/13 Created version 0.1
This is an example of how to use the RC522 RFID module. The module allows reading
and writing to various types of RFID devices and can be found in our MFRC-522 
(HCMODU0016) and Ultimate RFID (HCARDU0068) kits. This example Arduino sketch uses
the RFID library written by Miguel Balboa to read the pre-programmed serial number 
from RFID cards and tags supplied with our RFID kits. Snapshots and links to the 
library are available on our support forum.
PINOUT:
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
You may copy, alter and reuse this code in any way you like, but please leave
reference to HobbyComponents.com in your comments if you redistribute this code.
This software may not be used directly for the purpose of selling products that
directly compete with Hobby Components Ltd's own range of products.
THIS SOFTWARE IS PROVIDED "AS IS". HOBBY COMPONENTS MAKES NO WARRANTIES, WHETHER
EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ACCURACY OR LACK OF NEGLIGENCE.
HOBBY COMPONENTS SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR ANY DAMAGES,
INCLUDING, BUT NOT LIMITED TO, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY
REASON WHATSOEVER.
*/

#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 

/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 



void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
}

void loop()
{
  /* Temporary loop counter */
  byte i;
  
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
    
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    delay(delayRead);
    Serial.println();
    Serial.println();
  }
}

Il codice riportato precedentemente è abbastanza semplice da capire, sopratutto con i commenti presenti. Nel loop(), viene effettuato un controllo, sulla presenza di una tessera magnetica sopra il dispositivo; se il risultato è true, viene caricato in una stringa, il codice delle tessera magnetica e mostrato successivamente nel seriale.

Ed ecco il risultato:

RFID_1

2° Programma: Verifichiamo l’identità di una tessera

In questo programma, vedremo come poter stabilire se una tessera è abilitata a compiere una certe azione, ad esempio accendere una luce, oppure aprire una porta (nei prossimi capitoli vedremo esempi pratici).

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:

RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
Autore Giacomo Bellazzi
Versione 1.0
*/

#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 
#define ledVerde 3
#define ledRosso 4
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 

String codiceAutorizzato = "EC40E03478";

void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
}

void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");

    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead);  
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}    
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

Il metodo verificaCodice, non fa altre che prendere il codice delle tessera che viene letta e confrontato con quello salvato in memoria. Se la tessera è autorizzata, viene accesso un LED verde, mentre se la tessera non è autorizzata, viene accesso il LED rosso.

Ecco un video che mostra l’esecuzione del programma su Arduino Uno:

RFID_2

3° Programma: Versione 2.0 del lettore di autorizzazioni 

Come avete potuto notare precedentemente, il codice è stato realizzato per la lettura di una sola tessera autorizzata; ma come possiamo fare per avere un numero maggiore di tessere abilitate ?

In questo versione 2.0, verrà fatta una prima soluzione; in pratica i codici letti verranno trasformati in interi e sommati. La somma del codice, dovrebbe rappresentare il codice vero e proprio, ma potrebbe capitare che ci sono posso essere due tessere diverse, con la stessa somma di cifre. Comunque i codici autorizzati sono inseriti in un array di interi.

Vediamo il codice:

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:

RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
Autore Giacomo Bellazzi
Versione 2.0
Novità:
*Possibilità di inserire più di una tessera autorizzata
*/

#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 
#define ledVerde 3
#define ledRosso 4
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
long uno = 696; // rappresenta la somma delle 4 cifre 
int due = 450;
int codiciAutorizzati[] ={uno,due}; // contiene i codici autorizzati

void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
}

void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    int codiceLetto = 0;
    Serial.println("Codice delle tessera letto:");

    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+=RC522.serNum[i];
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto)){
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead);  
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(int codiceLetto){
  boolean autorizzato = false;
  for(int i = 0; i < sizeof(codiciAutorizzati) ; i++){
    if(codiceLetto==codiciAutorizzati[i]){
      autorizzato = true;
    }
  } 
  return autorizzato;
}    
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

4°Programma: utilizzare più codici autorizzati nello stesso programma

In questo quarto e ultimo programma vedremo come inserire diversi codice pre-autorizzati all’interno del nostro programma, per verificare a run-time se il codice letto è effettivamente autorizzato:

/* 
Questo programma permette effettuare la lettura di una tessera magnetica e stabilire se quest'ultima
è stata autorizzata.
PINOUT:
 
RC522 MODULE    Uno/Nano    
SDA             D10
SCK             D13
MOSI            D11
MISO            D12
IRQ             N/A
GND             GND
RST             D9
3.3V            3.3V
Autore Giacomo Bellazzi
Versione 1.0
*/
 
#include <SPI.h>
#include <RFID.h>
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10  // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay 
#define delayLed 2000 
#define ledVerde 3
#define ledRosso 4
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO); 
 
String codiceAutorizzato1 = "EC40E03478";
String codiceAutorizzato2 = "EC40E03479";
String codiceAutorizzato3 = "EC40E03480";
 
void setup()
{ 
  Serial.begin(9600);
  /* Abilita SPI*/
  SPI.begin(); 
  /* Viene inizilizzato RFID reader */
  RC522.init();
  Serial.println("Setup");
  pinMode(ledVerde,OUTPUT);
  pinMode(ledRosso,OUTPUT);
}
 
void loop()
{
  /* Temporary loop counter */
  byte i;
  // Se viene letta una tessera
  if (RC522.isCard())
  {
    // Viene letto il suo codice 
    RC522.readCardSerial();
    String codiceLetto ="";
    Serial.println("Codice delle tessera letto:");
 
    // Viene caricato il codice della tessera, all'interno di una Stringa
    for(i = 0; i <= 4; i++)
    {
      codiceLetto+= String (RC522.serNum[i],HEX);
      codiceLetto.toUpperCase();
    }
    Serial.println(codiceLetto);
    if(verificaCodice(codiceLetto,codiceAutorizzato1)||verificaCodice(codiceLetto,codiceAutorizzato2)
    ||verificaCodice(codiceLetto,codiceAutorizzato3)){
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
    }else{
      Serial.println("Tessera non autorizzata");
      accendiLed(ledRosso);
    }
  delay(delayRead);  
  }
}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto, String codiceAutorizzato){
  if(codiceLetto.equals(codiceAutorizzato)){
    return true;
  }else{
    return false;
  }  
}    
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
  digitalWrite(ledPin,HIGH);
  delay(delayLed);
  digitalWrite(ledPin,LOW);
}

La chiave del programma è quella di utilizzare una funzione che verifica se due strings sono uguali, cioè se due codici delle tessere magnetiche sono uguali e l’operatore logico or. Per entrare nell’if, basterà che almeno uno dei tre codici sia uguale.

I codici riportati in questo capitolo, sono elementi basi per costruire progetti più interessanti, come sistemi di antifurto, controllo di accessi e uscite in un luogo etc.. Vedremo come questi progetti nei prossimi capitoli.
I codici dei programmi presenti in questo capitolo, sono scaricabili dalla repo di Github:

github-logo

ismanettoneblog

115 pensieri su “Lezione 11: Come utilizzare il RFID reader per carte magnetiche

  1. Ciao, complimenti per la guida perchè è davvero fatta bene.. Scusami ma ho difficoltà a realizzare il progetto..
    Quando su app. Arduino su Mac provo a caricare il codice che ci hai passato qui nell’articolo, mi restituisce un errore e non mi fa andare avanti…

    sketch_sep26a:27: error: ‘RFID’ does not name a type
    sketch_sep26a.ino: In function ‘void setup()’:
    sketch_sep26a:37: error: ‘RC522’ was not declared in this scope
    sketch_sep26a:39: error: ‘ledVerde’ was not declared in this scope
    sketch_sep26a:40: error: ‘ledRosso’ was not declared in this scope
    sketch_sep26a.ino: In function ‘void loop()’:
    sketch_sep26a:48: error: ‘RC522’ was not declared in this scope
    sketch_sep26a:64: error: ‘ledVerde’ was not declared in this scope
    sketch_sep26a:67: error: ‘ledRosso’ was not declared in this scope
    sketch_sep26a.ino: In function ‘void accendiLed(int)’:
    sketch_sep26a:84: error: expected `}’ at end of input

    Mi riesci ad aiutare per favore?
    grazie!!

    ciao!!

          1. Ciao, volevo chiederti: ho testato il tuo progetto con arduino uno e funziona alla grande!. Ho provato a farlo anche con arduino mega però non riesco a farlo funzionare. quali sono i collegamenti che cambiano? e che righe del codice devo cambiare?grazie

          2. Ecco lo schema dei collegamenti:
            UNO MEGA
            * Reset 9 5 RST
            * SPI SS 10 53 SDA
            * SPI MOSI 11 51 MOSI
            * SPI MISO 12 50 MISO
            * SPI SCK 13 52 SCK

          3. io invece ho un’altro problema, non legge il lettore la scheda, cosa devo fare? ho copiato il codice, ho scaricato il file delle librerie ma non lo legge, ho provato con 2 schede diverse ma stesso risultato
            attendo risposta

  2. Ecco il mio errore:

    Tessera_Magnetica:9: error: ‘RFID’ does not name a type
    Tessera_Magnetica.ino: In function ‘void setup()’:
    Tessera_Magnetica:17: error: ‘RC522’ was not declared in this scope
    Tessera_Magnetica.ino: In function ‘void loop()’:
    Tessera_Magnetica:26: error: ‘RC522’ was not declared in this scope

    Ho inserito le librerie e non riesco a capire dove ho sbagliato

    Grazie

    1. Salve,
      questo errore viene rilevato quando non è viene letta correttamente la libreria. Penso di aver capito il problema; Arduino non è in grado di leggere libreria il cui nome contiene spazi oppure caratteri speciali. Per tanto è necessario nominare la libreria, per esempio con il nome RC522 (quando Arduino è chiuso) e riaprire l’IDE. Dovrebbe funzionare così !

      1. Ho provato a far di tutto(ho chiesto anche ad un amico di aiutarmi) ma, continua a non leggere la libreria. Non so come fare… Ho provato anche con un progetto sullo schermo Lcd e lì la libreria me la legge. Nella cartella dell’IDE non ho inserito nulla, ho messo nella cartella libraries la libreria; l’ho rinominata RC522 ma non la legge ugualmente.
        Attendo una risposta, grazie

  3. SCUSAMI SE TI DISTURBO QUESTO E’ IL MIO ERRORE:

    sketch_feb28a:9: error: ‘RFID’ does not name a type
    sketch_feb28a.ino: In function ‘void setup()’:
    sketch_feb28a:17: error: ‘RC522’ was not declared in this scope
    sketch_feb28a.ino: In function ‘void loop()’:
    sketch_feb28a:27: error: ‘RC522’ was not declared in this scope

    IO HO SCARICATO LA LIBRERIA CHE DAI TU ANCHE HO CAMBIATO IL NOME DELLA CARTELLA (GLI HO MESSO RC522) E ANCORA MI DA QUESTO ERRORE NON CAPISCO PERCHE. SAPRESTI AIUTARMI PER FAVORE??

    PS: MI SONO INFORMATO ED LTRI DA QUESTO PROBLEMA PER IL CHE CE DI BISOGNI DEL FILE RFID.h MA NON SONO RIUSCITO AD TROVARLO E ANCHE COME RISOLVERLO.

    GRAZIE

    1. Dovresti verifica il contenuto dei file all’interno della cartella Documenti, Arduino, Librerie, RFID.

      1. Ho chiesto ad un amico di aiutarmi e mi ha detto che l’errore è nel codice: dove voi avete messo la classe RFID o RC522 (non ricordo)andava chiamata MFRC522 e modificare di conseguenza tutto il resto

  4. ho aperto la pagina per scaricare la libreria, ma non ho capito quale file prendere… potete inviarmi il file fuori dalla pagina?Grazie

    Aspetto risposte il prima possibile.

    1. Salve,
      è necessario scaricare il file .zip e scompattarlo e copiarlo nella cartella Libraries in Arduino. È necessario utilizzare come nome della cartella un nome che non contenga caratteri speciali, quali -@[] etc…

      1. Ciao, molto interessante, ma purtroppo l’errore c’è. La libreria è stata installata correttamente altrimenti non caricherebbe gli esempi contenenti all’ interno del file.
        Ottimo articolo comunque, potresti controllare magari scaricando quella libreria? magari la tua attuale non è la stessa che si scarica. Il file è complicato bene, ma i problemi purtroppo sono legati alla libreria. Ho provato anche quella ufficiale, ma niente, gli esempi comunque vanno.

        1. Salve,
          non ho capito bene se i programmi della libreria ufficiale vengono compilati correttamente.

          1. vorrei dire la mia. ho copiato il suo codice, ma non legge la carta, ho provato con molti altri codici ma non và lo stesso. posso aver paura di aver acquistato un lettore falso?
            attendo risposta tramite e-mail
            P.S. non è il mio vero nome

          2. Ha verificato che i collegamenti sono corretti? Può essere che i contatti non siano perfetti

  5. è un problema di libreria, quella che si scarica all’inizio dell’articolo è sbagliata, bisogna cercare quella chiamata rfid.h come da programma

    1. Non mi ricordo esattamente quale libreria abbia utilizzato nei miei codici. Tuttavia sul web è possibile trovarne diverse, per questo lettore di carte magnetiche.

  6. nella versione 2.0 del programma usi un array di interi, non è possibile usare un array di stringhe o di char per evitare di avere tessere con lo stesso valore?

    1. Salve,
      l’esempio a cui si riferisce non è sicuramente il più sicuro, dal momento che diversi carte magnetiche, possono avere la stessa somma. In realtà si potrebbe lavorare solamente con gli interi, dal momento che la funzione delle librerie che restituisce il codice, è un vettore di interi. Oltre a questa possibilità è possibile lavorare con le stringhe, che però posso saturare facilmente la memoria di Arduino. Un’altra soluzione è di crearsi una libreria in C++, con l’oggetto Codice, composto da quattro interi. Spero di esserle stato utile.

  7. Ciao scusa il disturbo e anche per questa domanda un pò balorda ma potresti dirmi cos è l’ N/A?
    Se lo fai mille grazie

    1. Salve,
      dove hai trovato quella scritta ? Tipicamente N/A significa Not Available, però dipende dal contesto.

    1. Il programma può memorizzare i tags necessari per l’identificazione, oppure si può utilizzare un database, dove vengono memorizzati i dati e verificare se il tag è abilitato. Era questo il senso della domanda ?

  8. Salve,
    ho iniziato da poco a programmare arduino e volevo chiederle una spiegazione riguardo ad un comando nei vari sketch in particolare il comando “for”.
    Ciò che non riesco a capire è il motivo di tale comando e quale sia il motivo del “<= 4" come condizione e dell'incremento della variabile i.

    1. Salve,
      il costrutto for permette di eseguire continuamente delle linee di codice, fino a quando una condizione si è verificata. In particolare, a quale costrutto ciclo for si riferisce ?

      1. Mi riferisco al seguente:

        // Viene caricato il codice della tessera, all’interno di una Stringa
        for(i = 0; i <= 4; i++)

        Ciò che non mi è chiaro è per quale motivo attraverso la condizione indicata tra le parentesi del ciclo for è possibile caricare il codice della tessera.

        La ringrazio per la considerazione e per la risposta data.

        1. Per l’utilizzo delle tessere RFID, vengono utilizzate delle librerie, che contengono già i metodi per la lettura del codice. In questo caso, il metodo che legge la tessera, ritorna un vettore di 5 elementi e per tanto è necessario un ciclo for per leggere tutto il codice e salvarlo in una stringa, che viene successivamente mostrata a video. Spero di aver chiarito il dubbio!

          1. La ringrazio molto per le sue risposte sono state molto esaurienti e sono state in grado di levare il dubbio.
            Grazie mille per la sua attenzione.

  9. Buon giorno,
    ho scaricato le librerie RFID, ho copiato i tuoi scketch ma il compilatore mi da sempre questo errore

    cc1plus.exe: out of memory allocating 1677721600 bytes
    Errore durante la compilazione

    mi puoi aiutare?

    Grazie in advance.

    Silvio

    1. Salve,
      sembrerebbe che venga saturata la memoria di Arduino; ha selezionato correttamente l’Arduino Uno nell’IDE ?

  10. Stesso problema il programma non corrisponde alla libreria, ne ho provate diverse ma sempre lo stesso risultato, scusa ma non fai prima a uploadare la tua libreria?

      1. Però in quella libreria io non vedo nessun file RFID.h che richiami dallo sketch (#include ) da dove lo prende?

  11. Salve,

    è possibile collegare più lettori RFID ad un’ unica scheda ARDUINO?
    A me servirebbe collegare fino a 4 lettori RFID e identificare ognuno di questi in maniera distinta. È possibile farlo?

    Grazie
    Saluti

    1. Salve,
      purtroppo Arduino dispone di 13 PIN digitali e pertanto collegare 4 lettori RFID non è possibile. Ad ogni modo, come mai deve collegare 4 lettori di tessere magnetiche?

  12. Perché ho 4 porte vicine e vorrei gestirle con un unico lettore evitando di spendere tropi soldi

    1. In linea di principio potrebbe funzionare, però ci sono dei problemi che si sono possono verificare a run-time, cioè in fase d’esecuzione. Dal momento che Arduino ha un solo processore, non sarebbe possibile fare multi-threading, cioè mandare in esecuzione diversi processi allo stesso tempo. Ti faccio un esempio se due persone vogliono accedere nello stesso momento non sarebbe possibile. Ad ogni modo, ci sarebbe qualche soluzione software che si può adottare. Ti consiglio di dare un’occhiata a questa pagina web. Il caso due persone possano accedere nel medesimo istante di tempo è un po’ difficile, ma dipende da situazione a situazione. Ad ogni modo è possibile costruirsi degli Arduino UNO con 5 euro. Spero di esserti stato utile.

  13. Per chi ha problemi con la nuova libreria scaricata all’indirizzo sopra indicato ( MFRC522.h)
    sostituire le righe che seguono.

    #include
    #include \\ inserire questa riga

    RFID RC522 (SDA_DIO, RESET_DIO) ;
    MFRC522 mfrc522(SDA_DIO, RESET_DIO); \\ inserire questa riga

    RC522.init() ;
    mfrc522.PCD_Init(); \\ inserire questa riga

    if (RC522.isCard())
    if (mfrc522.PICC_IsNewCardPresent()) \\ inserire questa riga

    RC522.readCardSerial();
    mfrc522.PICC_ReadCardSerial(); \\ inserire questa riga

    (RC522.serNum[i] , HEX);
    (mfrc522.uid.uidByte[i],HEX); \\ inserire questa riga

    Saluti mauro.

  14. ciao volevo sapere come posso passare badge aziendale su il portachiavi badge di arduino
    grazzie in anticipo

  15. Buongiorno…
    come posso aggiungere altre schede autorizzate nel codice?
    sono novellino e non mastico bene il codice..
    grazie

    1. Salve,
      ci sono diverse soluzione. Quella più semplice è riportata nel programma 2.0 dell’articolo. Un’altra soluzione è quella di dichiarare diversi variabili di tipo String (oppure vettori di Char[] o Int[]) all’interno del programma e utilizzare la funzione verificaCodice(codiceLetto) in or logico con altri codici autorizzati. L’ultima soluzione è quella di utilizzare un database MySQL, dove vengono caricati i codici autorizzati. Cercherò di fare una guida dettagliata a riguarda. Spero di essere stato d’aiuto.

  16. Salve, dato che questo componente può funzionare anche da scrittore di tessere magnetiche oltre che da lettore riusciresti a spiegarmi come? Se hai un esempio di codice meglio. Grazie mille.

    1. Salve,
      nella libreria presente nell’articolo, c’è un esempio di come usare il dispositivo con tessere magnetiche per la scrittura.

  17. Ciao e complimenti per la guida. Volevo chiederti se secondo te esiste un modo per esportare il codice rfid letto dalla tessera in un campo attivo di un qualsiasi altro programma aperto parallelamente (ad esempio una cella excel), come una sorta di emulazione tastiera per intenderci.

    Saluti Giovanni.

    1. Salve,
      si ad esempio si può caricare il valore in un database MySQL, oppure usare la seriale di Arduino per poter comunicare con un programma in Python.

  18. sketch_jan05a:9: error: ‘RFID’ does not name a type
    sketch_jan05a.ino: In function ‘void setup()’:
    sketch_jan05a:17: error: ‘RC522’ was not declared in this scope
    sketch_jan05a.ino: In function ‘void loop()’:
    sketch_jan05a:27: error: ‘RC522’ was not declared in this scope

    sketch_jan05a:9: error: ‘RFID’ does not name a type
    sketch_jan05a.ino: In function ‘void setup()’:
    sketch_jan05a:17: error: ‘RC522’ was not declared in this scope
    sketch_jan05a.ino: In function ‘void loop()’:
    sketch_jan05a:27: error: ‘RC522’ was not declared in this scope

    Ho inserito la libreria nella cartella cambiando di nome la cartella contenente la libreria. Come posso fare?

  19. ciao mi chiamo pietro ho voluto un po capire come funzionasse la situazione ma quando carico tutti i tuoi skect separatamente mi dice errore nella compilazione io uso un arduino uno originale rfid rc522 ma mi dice errore vorrei capire il perchè pero se carico gli esempi della libreria vanno tu senza problemi grazie e buon lavoro

  20. Risciamo a risolvere questo problema della libreria? oppure a creare un altro tutoria con l’unica libreria che sembra esistere in giro??

  21. Non vorrei dire ma lei ci ha linkato la libreria con MFRC522.h e non RFID.h
    Dunque senza la vecchia libreria lo sketch non funzionerà mai…

    1. Son riuscito ad inserire la giusta libreria.
      La compilazione e’ ok ,ma quando ci passo sopra la tessera non succede nulla , nemmeno da terminale

      1. Salve,
        un problema l’abbiamo risolto :). Questo problema è più che altro di tipo hardware, dovuto a qualche non corretto contatto tra il ricevitore e i cavi che vanno ad Arduino. Controlli i pin e tali contatti.

  22. Salve, complimenti per la guida, io sto usando un controllore yun carico il codice riportato nel primo esempio (per la lettura del codice di una tessera) ma quando vado a passare la tessera o il portachiavi sul monitor seriale non viene mostrato nulla ! ma il codice viene caricato senza problemi !! forse non è compatibile con una scheda yun ? grazie mille in anticipo

    1. Salve,
      il problema non è legato a compatibilità, ma al fatto che i contatti tra la scheda RFID e i cavi che vanno ad Arduino non fanno bene contatto.

      1. L’errore di lettura è normale, alcuni contatti possono non fare bene il loro lavoro, se non saldati. Per quanto riguarda i pin, possono essere modificati dalla libreria.

        1. Sono fissati bene, la scheda non si muove, e i fili rimangono attaccati, sicuro sia quello il problema?

          1. I contatti a cui mi riferisco sono quelli tra la scheda che rileva la tessera magnetica e i cavi flessibili che vanno ad Arduino; capita spesso anche a me di aver problemi di questo tipo. Penso sia questo un possibile problema.

  23. Ho utilizzato uno dei tuoi sketch più semplici ed ha funzionato immediatamente tranne il fatto che ogni tanto mi legge dei codici incompleti-errati composti da sole cifre e con una lunghezza della stringa inferiore.
    Secondo problema: le porte 11, 12 e 13 (non indicate nello sketch) sono delle porte fisse indispensabili anche per la sola lettura delle card o sono modificabili e/o eliminabili?

  24. è possibile (se si come) leggere il contenuto del tag nfc?
    nel senso, se con il telefono ci metto dentro un testo
    è possibile leggerlo?

  25. Salve, alla fine non era un problema di saldature ma un problema di incompatibilità con la board yun , provsto con una board nano ed una uno ed il cil finziona senza problemi

    1. Grazie per la segnalazione. Pensavo proprio che l’Arduino Yun non avesse dei problemi con questo dispositivo. I problemi che ho avuto riguardavano i contatti tra la scheda e il micro.

    2. il problema è che la piedinatura della yun è diversa da quella di mega / leonardo / uno, quindi non funziona.
      su github c’è un post sul come collegare la scheda a yun, ma a me continua a non funzionare…
      se percaso qualcuno lo scopre me lo faccia sapere.
      gazie

  26. Salve, ho notato una cosa ! Ho acquistato il kit rfid 522 comprensivo di tarhettino portachiavi , ma come mai sul targhettino quando lo passo sul lettore escono codici diversi ogni volta che lo passo ? È possibile mettere un solo codice ? E questo metodo a livello di sicurezza è affidabile ? Grazie in anticipo

    1. Ogni tessera ha un codice numerico che è stato scritto in fase di fabbricazione; mi sembra molto strano che cambi il numero. Provi a mandarmi uno screenshot della seriale di Arduino.

      1. Purtroppo adesso mi ritrovo senza board ma praticamente non fa altro che leggere sullo stesso ciondolino codici sempre differenti ogni volta che lo passo ( invece con la tessera bianca è sempre lo stesso)

  27. Salve sempre utilizzando la libreria che è presente nell’esempio come posso scrivere da Arduino sulla tessera?
    Grazie 🙂

    1. Salve,
      intende di sostituire il valore presente nella tessera magnetica? Per quale motivo? Ad ogni modo nella libreria di riferimento c’è un programma con tale funzionalità.

  28. Buon giorno, ho seguito l’articolo alla lettera. Tuttavia quando apro il monitor seriale non succede nulla quando avvicino la tessera magnetica al lettore. Il problema può dipendere dal fatto che uso un arduino uno non originale?

    1. Salve,
      non penso sia legato a quel motivo. Se il codice viene caricato correttamente sul micro-controllore, non dovrebbero esserci problemi. Il motivo per cui non funziona, può essere legato ai collegamenti non corretti.

  29. Salve, Ho acquistato il rfid 522, stò provando ad realizzare un semplice allarme per la casa con arduino mega. Purtroppo per me non è possibile montare l’rfid vicino ad arduino ma si trovano a circa 15/20mt di distanza, leggo sui vari forum che questo non è possibile parlano tutti di centimetri di cavo cat5/6 e non di metri…. esperienze su lunghezze del collegamento? soluzioni possibili?
    Grazie e complimenti per lezioni spiegate in maniera semplice e completa.

    1. Salve,
      utilizzare dei cavi da 15/20 metri non è fattibile in questo caso. Il mio consiglio è quello di usare dei sensori Wireless, come ad esempio lo Zigbee oppure i moduli wireless 433 MHz che ho discusso altri post. Non ho capito come mai non sia possibile mettere vicino Arduino e i sensori RFID; in che cosa consisterebbe il progetto?

  30. Buongiorno, e complimenti per la guida e la costanza.
    Sono un principiante e vorrei realizzare questo sistema con arduino uno, una ethernet shied ed un lettore rfid.
    Lo scopo è semplice: all’interno della sd card ho inserito 5 immagini jpg, vorrei fare in modo che con 5 tessere rfid differenti si possano caricare a monitor le relative immagini.

    Il webserver l’ho gia fatto e testato, le immagini sulla sd sono gia caricate.
    Adesso mi manca la parte rfid connessa alle immagini (ps se dovesse servire posso caricare anche le immagni in differenti pagine html.)

    Grazie per l’attenzione

    1. Salve,
      non sono sicuro di aver capito correttamente la richiesta. Si dispone di una Arduino Uno, con scheda Ethernet, scheda SD e lettore RFID. Le immagine sono caricate e il progetto consiste nel far caricare una pagina web con l’immagine associata alla scheda magnetica, una volta che quest’ultima viene passata sul lettore: è corretto?

  31. salve vorrei usare il lettore rfid arduino per aprire e chiudere un cancello elettronico dove il lettore rfid tramite arduino mi mandasse un impulso d apertura e chiusura alla centralina del cancello ma non capisco come fare perche l apertura e la chiusura sono comandati separatamente in centralina grazie mille per l aiuto

    1. Salve,
      facciamo un po’ di chiarezza. L’utilizzo di un lettore RFID permette la lettura di una tessera magnetica e attraverso un micro-controllore come Arduino, è in grado di stabilire se la tessera che viene passata è autorizzata oppure no. Qualora lo fosse, è possibile aprire un cancello elettronico. Tipicamente quest’ultimi dispositivi, sono dotati di un fine corso, ovvero di un sensore che è in grado di stabilire se il cancello è aperto totalmente oppure no. Ad esempio una volta verificata la tessere magnetica, posso attivare un relè e far passare corrente fino a quando non ricevo un segnale di stop dall’utente oppure di fine corsa.

  32. Buongiorno, io ho comprato un modulo NFC e ha una scheda insieme, ma la scheda ha già un codice?? Se nò come faccio a scriverlo??

    1. Ogni scheda ha già di per se una sorta di codice identificativo. È possibile tuttavia modificare tale valore.

  33. Salve, vorrei chiedere se avvicinando due schede contemporaneamente, cosa accade. La domanda è tale in quanto mi serve un riconoscimento contemporaneo almeno di due codici. Grazie

    1. Tecnicamente dovrebbe essere rilevata una scheda alla volta, oppure se il cambio è molto veloce, la lettura non è completa. Come mai è necessario l’utilizzo di due schede contemporaneamente?

      1. Salve,
        il progetto è realizzabile, ma richiede un po’ conoscenze tecniche. In primo luogo bisogno acquistare i sensori magnetici che rilevano se una finestra è aperta oppure no. Successivamente è necessario far accedere un LED oppure utilizzare altri meccanismi per la notifica.

      2. A volte dei device sono utili anche per altre applicazioni diverse da quelle per le quali sono stati inventati. Era una mia curiosità. Grazie per la risposta

  34. Ciao,

    ho notato che la stessa tessera viene letta con codice diverso, come se sul monitor seriale venisse stampato il codice incompleto. Ad esempio, la stessa tessera viene vista come “ABCD123” oppure come “23ABCD1”. Solo dopo diverse letture il codice sembra “stabilizzarsi”.

    Da cosa può dipendere? Dalle schede?

    1. Il primo motivo che mi viene in mente riguarda ai contatti che magari non sono stabili.

  35. ciao, ho provato a realizzare il tuo progetto con Arduino 1 ed è andato tutto bene. poi per necessità di un numero maggiore di piedini l’ho provato con Arduino mega ma non riesco a farlo funzionare. potresti dirmi come collegare i piedini del rfid all’ Arduino e le righe di codice da cambiare?grazie

  36. Ciao,
    sono Pier Paolo e nuovo all’utilizzo di Arduino nonostante lavoro con l’elettronica (pura) da anni…Spiego subito il mio problema: in pratica ho un impiantino di allarme perfettamente funzionante wireless, ma, vorrei aggiungere due led fuori la porta: il led di presenza rete e di armo/disarmo dell’impianto di allarme. Purtroppo l’impianto cablato non mi permette di passare in maniera wired i due led che vorrei utilizzare e quindi ho pensato ad Arduino. Ho acquistato quindi una coppia di moduli wireless a 433Mhz su Ebay e anche un Attiny85 per problemi di spazio e di soldi. Secondo Lei, potrei riuscire a gestire quanto penso? Ovviamente vorrei utilizzare come segnali in ingresso ad Arduio UNO la tensione i pin del led di presenza rete e la tensione di alimentazione ai pin del LED che indica l’armo dell’allarme.
    Spero di essere stato chiaro.
    Grazie
    Pier Paolo

    1. Salve,
      si è fattibile il progetto. In pratica è possibile utilizzare un rilevatore di corrente, oppure di tensione per verificare che c’è corrente nell’abilitazione e un pin analogico di Arduino, per rilevare l’attivazione dell’allarme, sempre che il segnale sia tra 0 e 5 Volt, altrimenti Arduino si brucia. Per il resto si utilizzare un Arduino TX che trasmette questi valori ad un altro Arduino RX posto al di fuori della casa, che mostra attraverso due led lo stato del sistema. L’unico problema, a livello software, è la sincronizzazione/consistenza dei dati tra i due dispositivi.
      Sperando di essere stato chiaro, rimango a disposizione per ulteriori chiarimenti.

      1. Salve,
        grazie per i consigli!! Riguardo la tensione da rilevare, essendo che si tratta di una tensione che alimenta un led é sicuramente al di sotto dei 5volt, quindi “digeribile” dal ns Arduino. Riguardo attiny85, secondo Lei, potrei utilizzarlo per gestire il modulo rx? Ho problemi di spazio, quindi sarebbe essenziale..ho letto, gironzolando su internet che attiny85 é utilizzabile come un piccolo Arduino… Comunque sia a giorni riceverò anche attiny85, e, se per lei non ci sono problemi vorrei nuovamente disturbarla!! La ringrazio sempre….
        Pierpaolo

        1. Salve,
          ho idea che con l’attiny85 ci possono essere dei problemi di compatibilità. Ad ogni può utilizzare l’Atmega328, che ha dimensioni non troppo più grandi!

  37. Salve, trovo molto utile questa guida, l’unico problema e che ho arduino leonardo perciò i collegamenti non vanno bene, credo, ed il programma anche se viene caricato, non viene restituito nulla. potresti dirmi la disposizione dei pin per arduino leonardo e ciò che devo cambiare all’interno del codice? grazie.

    1. RC522 Leonardo
      SDA pin 10
      SCK SCK (on ICSP header)
      MOSI MOSI (on ICSP header)
      MISO MISO (on ICSP header)
      IRQ (not used)
      GND GND
      RST Reset
      3.3V 3.3V

      1. grazie mille, comunque nel programma dovrei cambiare anche qualcosa? per esempio i #define dei pin? perché anche dopo aver cambiato la disposizione fisica dei cavi, ancora il programma non vuole funzionare.
        Grazie

I commenti sono chiusi.