Nella scorsa lezione su Arduino, abbiamo visto come far interagire Arduino, keypad e un server MySQL. Lo scopo del programma era quello di verificare se un codice che viene digitato dal keypad è presente nel database e in caso affermato può essere fatta un’operazione, come ad esempio accendere un semplice LED, aprire una porta etc…
In modo molto analogo, in questa lezione vedremo come far leggere ad un Arduino un tessera magnetica attraverso un lettore RFID, fare un query ad un database MySQL per verificare se la tessera è valida oppure no.
Come abbiamo visto nella lezione dedicata al lettore RFID, è possibile usare il lettore RFID-RC522 per poter leggere delle tessere magnetiche con Arduino.
La libreria ufficiale del dispositivo, permette di leggere il codice che è formato da 4 parti, che possono essere memorizzate in un unica variabile di tipo String (anche se non è il massimo per Arduino Uno) per usarla facilmente nel nostro semplice programma.
Funzionamento del programma
L’utente passa la tessera magnetica bianca, oppure il portachiavi blu e il lettore RFID è in grado di rilevare tale operazione ed avviare in Arduino le operazioni necessarie per poter leggere il codice. Tale codice, che è salvato in modo hardware nella nostra tessera, verrà mostrato nella seriale di Arduino e salvato nella variabile String codiceLetto.
Come per il programma della lezione 17, dobbiamo seguire le seguenti operazioni.
Prima di tutto è necessario crearsi una Schema all’interno del DB MySQL. Nel mio caso l’ho chiamato Auth.
C’è solamente una table di nome Codes, che ha come attributi un solo elemento che è Code, un elemento di tipovarchar(10), che è chiave primaria e deve non deve essere nulla.
Per fare queste operazioni si può usare tranquillamente il MySQL Workbench, che è un programma davvero semplice da usare.
Per maggiori informazioni riguardo a MySQL, vi consiglio di leggere questo articolo.
Ed ecco il codice del programma per Arduino Uno/Arduino Mega che permette di verificare la presenza di un codice della tessera magnetica letta con il lettore RFID-.RC522, relativamente a quelle presenti nel DB MySQL:
/* Questo programma permette di collegarsi ad un DB MySQL per verificare se il codice della tessera magnetica è corretto 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 "Ethernet.h" #include "sha1.h" #include "mysql.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 LEDGREEN 13 #define LEDRED 12 /* Viene creata una istanza della RFID libreria */ RFID RC522(SDA_DIO, RESET_DIO); byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress server_addr(192, 168, 0, 2); Connector my_conn; char user[] = "username"; char password[] = "password"; char QUERY_POP[50] = "Select * From Auth.Codes as AK Where AK.Code='%s'"; char query[65]; void setup() { Ethernet.begin(mac_addr); Serial.begin(9600); /* Abilita SPI*/ SPI.begin(); /* Viene inizilizzato RFID reader */ RC522.init(); pinMode(13,OUTPUT); while (!Serial); delay(1000); Serial.println("Connecting..."); if (my_conn.mysql_connect(server_addr, 3306, user, password)){ Serial.println("Connected!"); } else { Serial.println("Connection failed."); } } 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(); } char charBuf[12]; codiceLetto.toCharArray(charBuf, 12); Serial.println(codiceLetto); if(isAuthorized(charBuf)){ Serial.println("Tessera autorizzata"); accendiLed(LEDGREEN); }else{ Serial.println("Tessera non autorizzata"); accendiLed(LEDRED); } delay(delayRead); } } // Controlla se un codice è autorizzato boolean isAuthorized(char code[]){ sprintf(query, QUERY_POP,code); my_conn.cmd_query(query); my_conn.get_columns(); row_values *row = NULL; int number = 0; while (row = my_conn.get_next_row()) { number++; my_conn.free_row_buffer(); } my_conn.free_columns_buffer(); if(number==0){ return false; }else{ return true; } } // Questa funzione permette di accendere un LED per un determinato periodo void accendiLed(int ledPin){ digitalWrite(ledPin,HIGH); delay(delayRead); digitalWrite(ledPin,LOW); }
Per poter mandare il esecuzione il programma, è necessario inserire username a password del vostro DB MySQL. Poi è necessario inserire i codici delle tessere magnetiche che si voglio autorizzare. Per farlo si può usare questa query:
1
|
INSERT INTO Codes(Code) VALUES ( 'EC17832AF' ) |
1 commento
Salve, vorrei sapere dove scaricare tutte le librerie utilizzati in questo sketch e se avete anche la struttura esempio di questa database utilizzata in questo esempio.
Conosco un po il mondo di arduino ma ho qualche problema con il dialogo arduino + W5100 + RC522 e php MySql.
Vorrei dunque se e possibile per voi una mano d’aiuto.
Ecco il mio progetto:
Sono pilota aereo privato a l’aeroclub di Cannes e instruttore di volo ULM a Fayence e vivo in Francia da molto tempo (43 anni), ma sono Italiano (Siciliano esattamente).
Il mio club mi ha domandato di fare con un lettore RFID di tipo MC522 e con arduino un armadio a chiave per aerei, in quale il pilota passa la sua carta davanti il lettore RC522, questo lettore va a interrogare il database e vedere quali sono i diritti di questo pilota e azionare uno o piu relays per aprire il o i cassetti delle chiave per gli aerei.
Conosco l’arduino perché mi sono fabbricato un EFIS (Electronic Flight Instrument System) che funziona come una bomba, ma ho dei problemi di programmazione per fare communicare un arduino 2560 mega con shiel ethernet W5100 e il lettore RC522 con php MySql…
Un aiuto sarebbe il benvenuto
Grazie per avanzo