Il controllo accessi rfid tastierino è un progetto che tanti makers desiderano realizzare e Adriano ha realizzato e voluto condividere con tutti noi.
Come spesso accade il Venerdì è la giornata dedicata in cui descrivo i progetti che non realizzo personalmente ma che altri appassionati e makers desiderano condividere usando il blog.
Diciamo che il venerdì è la giornata della vetrina su progetti tuoi un giorno in cui puoi mostrare a tutti cosa hai realizzato.
Oggi il progetto che riporto è di Adriano Guscetti: Controllo accessi RFID Tastierino, lascio la descrizione all’autore:
Il programma permette di autorizzare tramite lettura di una chiave elettronica (RFID) e l’inserimento di una password inserita tramite una tastiera 4 righe e 4 colonne, l’accesso a qualsivoglia entrata o apparecchio.
I dati di chi è autorizzato a entrare sono memorizzati direttamente nello sketch nella funzione PadroneChiave.
Scegliendo il tasto D si interrompe l’immissione
Scegliendo il tasto * si cancella l’ultima immissione
Scegliendo il tasto # si conferma l’immissione prima della lunghezza massima (7 caratteri)
I tasti A, B e C non hanno nessuna funzione.
Cosa ti server per il Controllo accessi RFID Tastierino
Il materiale necessario a realizzare il controllo accessi rfid tastierino 4×4 è il seguente:
- Arduino Mega 2560
- Scheda RFID-RC522
- Tastierino 4×4
- Buzzer
- LCD 4×20
Il collegamento di questi componenti non è complesso tuttavia è necessario che tu faccia attenzione a non confondere i pin dell’arduino mega 2560, puoi seguire lo schema inviato da Adriano:
avrai già notato a quali pin collegare i componenti, tuttavia Adriano ha voluto specificarli nella descrizione del progetto e li riporto per completezza:
- La scheda RFID-RC522 devi collegarla ai pin: RST 5, MISO 50, MOSI 51, SCK 52, SDA 53
- Il tastierino 4×4 devi collegarlo ai pin dal 34 al 41: pin 37, 36, 35, 34 rispettivamente riga0, riga1, riga2 e riga3; pin 41, 40, 39, 38 rispettivamente alle colonne: colonna0, colonna1 , colonna2 e colonna3
- Il buzzer collegalo al pin 7
- LCD 4×20 collegato ai pin 22 RS, 23 E, 24 DB4, 25 DB5, 26 DB6, 27 DB7
Lo sketch di Adriano
Ecco lo sketch che Adriano ha realizzato per il controllo accessi rfid tastierino 4×4:
/* Adriano Guscetti marzo 2014 Il programma permette di autorizzare tramite lettura di una chiave elettronica (RFID)e l'inserimento di una password inserita tramite una tastiera 4 righe e 4 colonne, l'accesso a qualsivoglia entrata o apparecchio. I dati di chi è autorizzato a entrare sono memorizzati direttamente nello sketch nella Void PadroneChiave. Scegliendo il tasto D si interrompe l'immissione Scegliendo il tasto * si cancella l'ultima immissione Scegliendo il tasto # si conferma l'immissione prima della lunghezza massima (7 caratteri) I tasti A, B e C non hanno nessuna funzione. Arduino Mega 2560 Scheda RFID-RC522 allacciata ai seguenti Pin: RST 5 MISO 50 MOSI 51 SCK 52 SDA 53 Tastierino 4x4 allacciato ai Pin 34 - 41 (vedi impostazioni sotto) Buzzer al Pin 7 LCD 4x20 allacciato ai Pin 22 - 27 (vedi impostazioni sotto) */ String stringa; String codice; String nome; int IDCarta; int ID; int caratterimax; int errore; int i=0; int numero; int cifra; int spazio; int PinEntrata =30; //RFID #include <SPI.h> #include <MFRC522.h> //Viene creata l'istanza dell'oggetto MFRC522 chiamata mfrc522 in cui sono indicati i pin del RFID collegati alle uscite digitali di Arduino #define SS_PIN 53 #define RST_PIN 5 MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea istanza MFRC522. //LCD 20x4 #include <LiquidCrystal.h> //Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino LiquidCrystal lcd(22, 23, 24, 25, 26, 27); //Tastiera // Definizione tastiera #include <Keypad.h> const byte ROWS = 4; // Quattro righe const byte COLS = 4; // Quattro colonne // Definizione mappa della tastiera char keys[ROWS][COLS] = { {'1','4','7','*'}, {'2','5','8','0'}, {'3','6','9','#'}, {'A','B','C','D'} }; byte rowPins[ROWS] = {37, 36, 35, 34 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino. byte colPins[COLS] = {41, 40, 39, 38 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Creazione della tastiera void setup() { //LCD //imposta il numero di colonne ed il numero di righe lcd.begin(4, 20); // Visualizzo il nome dello Sketch sul display lcd.print("EntrataV01"); delay(1000); Serial.begin(9600); // Initializza la communicazione seriale SPI.begin(); // Inizializza il bus SPI mfrc522.PCD_Init(); // Inizializza la carta MFRC522 pinMode(7, OUTPUT); pinMode(PinEntrata,OUTPUT); //PIN per attivare l'accesso } void loop() { // Prepara la key - tutte le aree keys a FFFFFFFFFFFFh MFRC522::MIFARE_Key key; lcd.setCursor(0,2); lcd.print("Annunciarsi !!!"); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } //Controlla che si annunci una nuova chiave if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } //Selezionato una chiave if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Con la selezione di una chiave emette un bip ! digitalWrite(7, HIGH); delay(100); digitalWrite(7, LOW); // Una nuova chiave è stata selezionata. L'UID e SAK sono in mfrc522.uid. //Restituisce il munero decimale dell'ID della chiave sommando i 4 blocchi di numeri IDCarta=0; for (byte i = 0; i < mfrc522.uid.size; i++) { if (i==0){IDCarta=(mfrc522.uid.uidByte[i]);} if (i==1){IDCarta+=(mfrc522.uid.uidByte[i]);} if (i==2){IDCarta+=(mfrc522.uid.uidByte[i]);} if (i==3){IDCarta+=(mfrc522.uid.uidByte[i]);} } // Mostra il numero della chiave, questo codice sarà da eliminare! lcd.clear(); lcd.setCursor(0,2); lcd.print(IDCarta); delay(2000); PadroneChiave(); //Verifica a chi appartiene la chiave lcd.clear(); lcd.setCursor(0,0); lcd.setCursor(0,1); lcd.print("Ciao ");lcd.print(nome); lcd.setCursor(0,2); lcd.print("Codice: ");lcd.print(codice); //Questo non dovrà essere mostrato è solo per il test delay(2000); //Inserimento codice di sicurezza errore=3; //Numero di volte che si può sbaglire l'inserimento del codice caratterimax=6;//lunghezza massima caratteri della stringa n° + 1 stringa=""; while(stringa!=codice) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Inserisci codice"); lcd.setCursor(0,1); lcd.print("max ");lcd.print(caratterimax+1);lcd.print(" caratteri"); InserisceStringa(); //Void per la lettura del tastierino if(stringa=="A"){break;} if(stringa=="B"){break;} if(stringa=="C"){break;} if(stringa=="D"){break;} if(i<=3) // Il codice deve essere al minimo di 4 caratteri { lcd.clear(); lcd.setCursor(0, 1); lcd.print("Codice troppo corto"); lcd.setCursor(0, 2); lcd.print("minimo 4 lettere !"); delay(2000); stringa=""; } if((stringa!=codice)&&(i>3)) { errore--; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Codice ERRATO !!"); lcd.setCursor(0, 1); lcd.print("Riprova -"); lcd.print(errore); delay(2000); if(errore==0){break;} stringa=""; } } if(stringa=="A")//è stato scelto il tasto A //La lettera A non è utilizzata { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hai scelto > A <"); lcd.setCursor(0, 1); lcd.print("Tasto non utilizzato !!!"); delay(2000); } if(stringa=="B") //La lettera B non è utilizzata { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hai scelto > B <"); lcd.setCursor(0, 1); lcd.print("Tasto non utilizzato !!!"); delay(2000); } if(stringa=="C")//La lettera C non è utilizzata { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hai scelto > C <"); lcd.setCursor(0, 1); lcd.print("Tasto non utilizzato !!!"); delay(2000); } if(stringa=="D")// Scegliendo la lettera D si interrompe l'immissione { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Hai scelto STOP!"); lcd.setCursor(0, 1); lcd.print("Devi riannunciarti !"); delay(2000); } //Se il codice corrisponde, attiva il PIN dove si può allacciare per esempio il meccanismo d'apertura di una porta (per la durarta di 3 secondi) if(stringa==codice) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Puoi entrare"); digitalWrite(PinEntrata, HIGH); delay(3000); digitalWrite(PinEntrata, LOW); } lcd.clear(); lcd.setCursor(0, 0); lcd.print("FINE FINE FINE FINE"); delay(2000); } //Inserisce una stringa tramite tastierino void InserisceStringa() { i=0; while(i<=caratterimax) //Lunghezza massima stringa valore variabile caratterimax + 1 { char key = kpd.getKey(); if(key) // controlla che il valore sia valido. { if(key==65){stringa="A";break;} if(key==66){stringa="B";break;} if(key==67){stringa="C";break;} if(key==68){stringa="D";break;} if(key==35){break;}//Interrompe quando si digita # else{stringa += key;}//Aumenta la variabile stringa con il carattere digitato i++; if(key==42){stringa=stringa.substring(0,i-2); i-=2;lcd.setCursor(i, 2);lcd.print(" ");} //Se si digita * viene cancellato l'ultima cifra if(i>0) //Serve a evitare spiacevoli indicazioni sul LCD se si digita * quale primo tasto { lcd.setCursor(i-1, 2); lcd.print(key); delay(200); lcd.setCursor(i-1, 2); lcd.print("*"); } if(i<0){stringa=""; i=0;} //SE si è digitato * come primo tasto rimette tutto a 0 } } } //Void per definire a chi appartiene la chiave void PadroneChiave() { if(IDCarta==538){nome="Aldo"; codice="1111111";} if(IDCarta==423){nome="Giovanni"; codice="2222222";} if(IDCarta==621){nome="Giacomo"; codice="3333333";} }
sketch corredato dalla spiegazione che lo stesso autore ha scritto per noi:
Righe 1-11: vengono dichiarate le variabili necessarie
Riga 12: viene impostato il pin che sarà attivato quando tutte le condizioni richieste per permettere l’accesso saranno verificate.
Righe 13-17: viene impostata la scheda RFID con la libreria MFRC522.h, e definito i pin necessari pin53 > SS, pin5 > RST
Righe 18-19: viene impostato LCD con la libreria LiquidCrystal.h, e definito i pin necessari pin22 > RS, pin23 > E, pin 24 > DB4, pin25 > DB5, pin26 > DB6, pin27 > DB7,
Righe 20-31: viene impostato il tastierino 4×4 con la libreria Keypad.h, e definito i pin necessari
Riga 34: definisce il tipo di LCD
Righe 35-36: per 1 secondo si mostra sul LCD il nome dello Sketch
Righe 37-41: si inizializzano la comunicazione seriale, il bus SPI, la scheda MFRC522, il pin 7 per il Buzzer e il pin per attivare il dispositivo che permette l’accesso (Pin30)
Righe 45-47: prepara la scheda RFID, fa apparire sul LCD la scritta “Annunciarsi !!!” e aspetta che qualcuno passi una chiave vicino al ricevitore.
Righe 48-59: seleziona la chiave e memorizza i dati tramite la libreria MFRC522.h in mfrc522.uid
Righe 60-62: al passaggio di una chiave viene attivato per 1 decimo di secondo il pin del Buzzer in modo da confermare con un avviso sonoro che la chiave è stata letta.
Rigge 63-70: per una facilità di gestione dei numeri delle chiavi, si trasformano i primi 4 Byte del ID della carta in un numero decimale che viene attribuito alla variabile IDCarta.
Righe 71-74: solo per la versione di prova !!! sarà da cancellare nella versione definitiva mostra sul LCD il numero della chiave
Riga 75: tramite la funzione PadroneChiave verifica a chi appartiene la chiave. In questa versione i dati sono memorizzati direttamente nella funzione, si potrà a volontà trovare altri metodi di memorizzazione
Righe 76-82: saluta il padrone della chiave e indica il codice (anche il codice dovrà essere nascosto in una versione definitiva)
Righe 83-85: si definiscono i parametri per l’inserimento della Password, come il numero delle volte che può essere inserita sbagliata (variabile errore) e la lunghezza massima (variabile caratterimax), impostando le variabili che saranno utilizzate per l’inserimento (variabile stringa).
Riga 86: inizia il ciclo d’inserimento codice
Righe 87-92: fa apparire sul LCD l’invito a inserire il codice e spiega quanto può essere lungo
Riga 93: rimanda alla funzione per l’inserimento della stringa di caratteri (spiegazione alle righe 175 – 198)
Righe 94-97: se si digita A, B, C o D sul tastierino, si esce dal ciclo d’inserimento del codice
Righe 98-107: controlla che il codice sia di almeno 4 caratteri, se non lo è, viene comunicato sul LCD per 2 secondi
Righe 108-119: se il codice non corrisponde lo comunica per 2 secondi sul LCD con l’indicazione di quanti tentativi d’inserimento rimangono
Riga 120: termine del ciclo d’inserimento codice
Righe 121-156: routine scelta tasti A,B,C o D, al momento viene solo indicato su LCD che il tasto scelto non è utilizzato.
Righe 157-165: se il codice corrisponde con quanto inserito, viene attivato per 3 secondi il pin che avvia il dispositivo per permette l’accesso (Pin30)
Righe 166-169: indica per 2 secondi sul LCD che si è terminato
Riga 170: fine ciclo d’inserimento codice
Riga 171: funzione per inserire una stringa tramite tastierino
Righe 172-183: se viene digitato A, B, C, D e #, si esce dalla funzione.
Riga 184: aumenta la variabile stringa con il numero digitato
Righe 185-186: se si digita * cancella l’ultimo numero digitato
Righe 187-194: visualizza su LCD un * al posto del numero digitato
Riga 195: serve a rimettere le variabili alla situazione iniziale, nel caso sia stato digitato * quale primo tasto e evitare spostamenti del “cursore” nel LCD
Riga 198: termine della funzione
Righe 199-204: funzione per la lettura dei dati legati alle chiavi che hanno diritto d’accesso. In questo esempio sono salvati direttamente nella funzione, ma potrebbe essere una qualsiasi funzione che legge dati da dispositivi vari, per esempio una scheda SD.
Buon controllo accessi rfid !!!
34 commenti
Vai al modulo dei commenti
Ciao, ottimo tutorial.
Volevo chiederti una cosa, se puoi realizzare un tutorial dove spieghi l’utilizzo di Arduino mega con l’ ethernet shield. Non riesco a capire se dopo l’inserimento dell’ethernet su arduino mega, i pin di sotto non inclusi nn li posso utilizzare.
Grazie in anticipo
Autore
Ciao Federico,
la ethernet shield usa i pin MOSI (D11 arduino uno r3) ,MISO (D12 arduino uno r3),CLK (D13 arduino uno r3) e CS ( D10 arduino uno r3 ) del protocollo SPI che non coincidono con i medesimi pin della MEGA ( consulta il datasheet sul sito arduino.cc )
Dovrai fare i collegamenti con i jumper.
Ciao Mauro,
come per tanti altri tutorial, ho trovato molto interessante anche questo con lettore RFID e l’ho acquistato.
Mi sono limitato a testarlo da solo senza utilizzare anche LCD e componenti vari, aprendo uno degli esempi riportati nella cartella dentro la libreria , ma il lettore non legge alcuna tessera di quelle fornite. Mi sono assicurato che i collegamenti fossero fatti bene con la giusta corrispondenza dei pin dichiarati nel programma, e lì non ci sono errori ( ovviamente la libreria è ben importata).
Ho notato che un led rosso etichettato D1 rimane costantemente acceso sulla scheda , ma dai video di utilizzo in rete ho visto che è normale.. Secondo te cosa ho sbagliato?
Premetto che ho provato anche altre chiavi magnetiche acquistate, e nessuna funziona..
Ti ringrazio per l’attenzione
Autore
Ciao Fabio, la shield è identica a quella mostrata? L’hai assemblata tu? A me non resta acceso il led rosso per cui potrebbe essere un errore di assemblaggio della shield.
Tutorial molto interessante e chiaro,
mi piacerebbe testare il sistema di controllo accessi in laboratorio, dove si possono acquistare i componenti per un primo test? Esiste un Vs. e-commerce?
Grazie anticipatamente,
Vincenzo.
Autore
Ciao Vincenzo,
Sono un appassionato e docente ma non possiedo un é-commerce.
Io acquisto i componenti dei miei progetti su robot-domestici.it.
Puoi verificare sul loro store se sono disponibili tutti i prodotti.
ciao Mauro sono Michele un appassionato di domotica vorrei un piccolo aiuto, tempo fa ho realizzato un webserver con arduino da cui comando l’apertura delle tapparelle di casa da remoto, ad funziona perfettamente però vorrei ampliare il progetto inserendo in parallelo al tutto un lettore rfid con cui gestire tale apertura e chiusura, ho provato a modificare lo stretch ma quando collego la ethernet shiel non funziona più nulla, se puoi potresti aiutarmi ?
il mio dubbio e che sia la ethernet shield che l’ rfid usino gli stessi pin, è possibile collegare i pin dell’rfid altrove ??
Autore
Ciao Michele,
se hai utilizzato la ethernet shield arduino originale avrai senza dubbio occupato i pin 10,11,12,13 controlla che la RFID non usi i medesimi pin o il connettore ICSP in basso al centro di arduino che di fatto è connesso ai medesimi pin.
Ciao Mauro,
volevo avere una delucidazione; a riga 82 viene inizializzata la comunicazione seriale (serial.begin(9600)) ma in effetti la comunicazione seriale non viene usata per tutto lo sketch.
Mi confermi che non è necessaria?
Te lo chiedo perchè, avendo fatto un progettino simile (rfid, display seriale, relais, keypad) ma molto meno “evoluto” dal lato sketch, su arduino nano, quella riga non l’ho inserita (avendo usato il pin D1 (TX) per il relais).
Grazie
Ciao
Autore
Ciao Nea,
probabilmente Adriano aveva inserito quella linea per farsi inviare dei dati sul monitor seriale ed in un seocndo momento non ha più avuto bisogno di usarla.
Puoi eliminarla.
Grazie.
Autore
Prego Andrea.
Ciao. Sto provando a caricare lo sketch. Il problema è che non me lo carica, compila lo sketch perfettamente ma poi dice sto caricando…. e non termina mai…qualsiasi altro sketch invece lo carica subito. Cosa puo essere?
Autore
Ciao Raffaele,
abilita nell’IDE il debug avanzato in fase di compilazione e upload.
Ciao. Fatto ma non carica lo stesso
Autore
Ciao Raffaele,
l’abilitazione non serve a risolvere il problema di caricamento ma a capire dove si blocca.
Ti chiedo la cortesia di non incollare tutto il debug che ti esce, perché penso tu stia pensando di farlo, ma leggi e cerca di comprendere dove si ferma la compilazione e perché.
La compilazione non di ferma, è il caricamento che si blocca. Lo sketch viene compilato giusto…
Autore
Ok Raffaele,
se hai abilitato il debug anche in fare di upload ( quando carica ) dovresti avere un report del punto in cui si ferma.
Il Blink, l’esempio che trovi nell’IDE, riesci a caricarlo?
Che libreria hai usato di mfrc522? Perche quella di github non funziona e ne ho messo un altra ma non carica anche se lo compila..puoi linkare la libreria che hai tu?
Autore
Ciao Raffaele,
lascio il commento per Adriano, autore del progetto.
Io purtroppo non ho quella libreria.
salve, sono propio un neofita, sto cercando di capire cpme mettere il void padrone chiave, su una sd che deve essere leta durande il void setup e tenere i dati in memoria. in modo da non avcere un accesso continuo alla memoria sd che alla lunga si rompe. Qualche anima pià che almeno mi instradi?
Autore
Ciao Sergio,
non mi è chiaro cosa tu desideri inserire nella chiavetta SD, spero non una funzione sarebbe complesso farla ri-eseguire ad arduino.
In merito alla lettura delle info da SD ricorda che tali memorie sono soggette a malfunzionamenti dopo migliaia di scritture non di letture.
lluminante, grazie. non ci avevo pensato, questo semplifica le cose:)
Ciao mauro sto provando questo projetto pero caricando arduino mi da errore “mfrc522.PCD_Init(); “.cosa devo fare
Autore
Ciao Sahadat,
hai controllato di possedere le librerie indicate nel progetto? se leggi l’articolo c’è scritto quali ti occorrono ed una è proprio “mfrc522”
Scusa ma è possibile inserire un rele in tutto cio?
Autore
Certo Toti,
puoi farlo in parallelo o al posto del led.
E il codice come bisogna modificarlo? Non riesco purtroppo. Potresti aiutarmi per piacere?
Come le hiedevo tramite mp su fb, ho alcuni problemi con delle variazioni del progetto.
– Usare il Nano al posto del Mega2560 [dunque i collegamenti ai pin ]
– Matrice 4×3 anzichè 4×4 (con specifica matrice inviata su fb che allego)
{‘#’, ‘0’, ‘*’} // Define Tastiera
{‘9’, ‘8’, ‘7’} // Define Tastiera
{‘6’, ‘5’, ‘4’} // Define Tastiera
{‘3’, ‘2’, ‘1’} // Define Tastiera
– Sostituire la funzione della lettera D a quella della lettera * (non avendo lettere nel tastierino)
spero che possa essere così gentile e disponibile da aiutarmi come ha fatto anche con gli altri
grazie
Autore
Ciao Antonio,
lascio il tuo commento online perché Adriano, autore del progetto, possa aiutarti.
Ti chiedo intento di verificare che:
– i pin dell’arduino nano siano sufficienti per fare quello che ti occorre.
– ti siano chiare tutte le linee dello sketch come spiegate nell’articolo.
Bene o male si ho compreso il codice. Il numero di pin non lo so. Non so se bastano.
Autore
Ciao Toti,
ho contato il numero di pin dal disegno pubblicato dall’autore:
8 pin tastierino 22-29
4 pin NFC 50-53 ( tipo SPI )
1 pin NFC reset
1 pin buzzer
prova a verificare se sulla tua scheda sono sufficienti.
Per modificarli non dovrai far altro che reimpostare le variabili relative ai pin
ciao, bellissimo progetto, io è da poco che ho voluto cimentarmi nel mondo di arduino, ho due stampanti 3d che uso largamente e qui sono molto più ferrato anche nel disegno, ho comprato lo starter kit completo della elegoo con arduino mega 2560, il problema è che per quanto riguarda la programmazione sono una capra, volevo chiederti un grandissimo favore, vorrei creare questo progetto https://www.thingiverse.com/thing:3628571 ma non ho lo schema di come vanno attaccati i vari pezzi e le varie piedinature ne tanto meno ho il programma che fa funzionare il tutto, volevo chiederti se potevi gentilmente darmi una mano, ti ringrazio in anticipo.
Autore
Ciao Mirko,
hai già provato a scrivere all’autore per chiedere se ti invia o integra queste informazioni ?
Solitamente chi ha già realizzato un progetto è più ferrato sull’argomento e probabilmente ha già uno schema ed uno sketch da condividerti.
Nel mio caso sarebbe da sviluppare da zero o come progetto su commissione.