In questo tutorial, diviso in due parti, vedremo come utilizzare dei tag RFID (Radio-frequency Identification) con Arduino.
Nella prima parte collegheremo il lettore ad Arduino e scriveremo un semplice sketch per visualizzare l’ID del tag, mentre nella seconda parte realizzeremo un completo controllo accessi tramite tag RFID.
PN532
Ho scelto di utilizzare come lettore RFID una scheda basata sul chip PN532 di NXP. Questo chip è molto versatile: può funzionare sia come lettore/scrittore di tag, sia agire lui stesso come un tag RFID; inoltre supporta i bus di comunicazione I2C e SPI.
Adafruit ha realizzato una breakout board basata sul chip PN532 e delle librerie per Arduino che andremo ad utilizzare. In alternativa si trova su diversi store online questa scheda, che anch’io utilizzerò per questo tutorial:
Collegamenti
Come detto, il chip PN532 supporta sia I2C che SPI. Per semplicità utilizzerò il primo, collegando i pin SDA e SCL della scheda ai rispettivi pin di Arduino. Dobbiamo collegare anche il pin IRQ ad un pin digitale di Arduino (ho scelto il pin 2); attraverso questo collegamento il chip PN532 “avvisa” Arduino dell’avvenuta lettura di un tag:
Per attivare la modalità I2C, è necessario configurare i dip switch presenti sulla scheda come indicato in serigrafia:
Infine alimentiamo la scheda collegando i pin VCC e GND ai pin 5V e GND di Arduino.
Per completare il progetto, ho utilizzato la versione beta di un nuovo LCD shield di Lemontech. Questo shield ha la particolarità di gestire il display LCD tramite un expander I2C; inoltre tutti i pulsanti sono collegati al solo pin analogico A0. In questo modo praticamente tutti i pin di Arduino sono a disposizione per collegare altre periferiche. Il display ha indirizzo di default 0x27 (ma può essere cambiato) mentre il chip PN532 ha indirizzo 0x24, quindi non ci sono conflitti.
Per consentire il collegamento dei due dispositivi al bus I2C di Arduino ho dovuto aggiungere due resistenze di pull-up da 10Kohm secondo lo schema:
Per semplicità le ho collocate su una mini breadboard:
Per indicare con un segnale acustico l’avvenuta lettura del tag, ho collegato un mini altoparlante al pin 8 di Arduino e a GND:
Librerie
Per poter compilare lo sketch di questo tutorial dovete installare due librerie nel vostro IDE:
- Adafruit PN532 di Adafruit
- hd44780 di Bill Perry
Entrambe sono disponibili nel Library Manager:
Sketch
Lo sketch completo è disponibile nel mio repository Github.
Per utilizzare l’LCD è necessario definire la sua dimensione (righe x colonne), l’indirizzo I2C e i pin a cui è collegato. E’ quindi possibile inizializzarlo all’interno del setup():
#define LCD_COLS 16 #define LCD_ROWS 2 hd44780_I2Cexp lcd(0x27, I2Cexp_PCF8574, 0,1,2,4,5,6,7,3,HIGH); [...] if(lcd.begin(LCD_COLS, LCD_ROWS) != 0) { Serial.println("- Unable to initialize LCD!"); while(1); } |
Egualmente per il chip PN532 è necessario indicare il pin a cui è collegato il segnale IRQ (il RESET è opzionale) e procedere all’inizializzazione. Tramite il metodo getFirmwareVersion è possibile verificare il corretto funzionamento del chip e ottenerne la versione:
#define PN532_IRQ 2 #define PN532_RESET 3 Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); [...] nfc.begin(); uint32_t versiondata = nfc.getFirmwareVersion(); if(!versiondata) { Serial.println("- Unable to find a PN532 board"); while(1); } Serial.print("- found chip PN5"); Serial.println((versiondata>>24) & 0xFF, HEX); |
Infine dobbiamo chiamare il metodo SAMConfig() per configurare il chip in normal mode e utilizzare il pin di IRQ:
La lettura di un tag è molto semplice. Il metodo readPassiveTargetID restituisce true se un tag è vicino al lettore:
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength); if (success) { |
In questo caso possiamo emettere un suono e visualizzare l’ID letto sul display:
tone(SPEAKER_PIN, TONE_FREQ, TONE_TIME); lcd.clear(); lcd.print("Found RFID tag!"); lcd.setCursor(1,2); lcd.print("ID: 0x"); for(int i = 0; i < uidLength; i++) { if(uid[i] <= 0xF) lcd.print("0"); lcd.print(uid[i] & 0xFF, HEX); } |
Demo
(sottotitoli in italiano disponibili)
I noticed that you used manual configuration for the hd44780_I2Cexp constructor. Was the library not able to auto detect the parameters correctly?
If so, I’d like to see the schematic of the PCB for the LCD i/o expander to understand why it is failing.
BTW, hd44780 not contains a fatalError() function that can be called to indicate a fatal error code. hd44780::fatalError(errorcode);
If there is an onboard LED, it will blink the error code. See the HelloWorld
sketch for how to use it.
Hi, I had to manually configure the library because there’s another device connected to the i2c bus and this “disturbed” the autoconfig routine.
Buongiorno Luca,
sto impazzendo con il tuo progetto.
Ho acquistato il modulo NFC identico a quello utilizzato da te, ma non riesco a farlo funzionare.
Anche utilizzando gli esempi presenti nella libreria, il modulo si accende ma non comunica con arduino.
Potrebbe essere che sia guasto il modulo?
Come posso verificare il funzionamento?
Ti ringrazio per l’attenzione.
ciao Mauro! Sicuramente può essere rotto… prova a vedere se almeno è “raggiungibile” sul bus i2c. Esegui su Arduino lo sketch i2cScanner, il chip PN532 dovrebbe essere trovato sull’indirizzo 0x48.
Ciao Luca e complimenti. Vorrei realizzare un controllo accessi che legga non solo dei tag nfc ma anche ìlnfc di uno smartphone android così da usare il cellulare per accedere e attivare un relè apri porta.
Questo RP532 legge l’nfc di uno smartphone ? il modulo rc522 sembrerebbe che non legga l’nfc
buongiorno Graziano, non ho mai provato (non ho uno smartphone compatibile) ma da quanto leggo dovrebbe funzionare, ad esempio è citato nella guida di Seeedstudio.
Complimenti Luca,
come faccio invece se voglio vedere il contenuto della mia scheda RIFD, il mio intento è quello di poterci scrivere sopra in maniera molto veloce.
Ora per le mie schede uso lo smartphone con l’app Mifare Classic Tool con i quale vado a modificare il contenuto dei primi due byte del settore 2. L’ideale sarebbe poter tramite arduino, la PN532, e poi come comandi posso usare una shield simile alla tua che ho già in mio possesso con i tasti e display 16*2.
ciao Michele, ti consiglio uno degli ottimi tutorial che si trovano in rete…