RFID e Arduino (1)

luca 04/09/2017 2

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:

rfid-03 rfid-04

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:

rfid-06 rfid-07

Per attivare la modalità I2C, è necessario configurare i dip switch presenti sulla scheda come indicato in serigrafia:

rfid-05

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.

rfid-10 rfid-11jpg

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:

rfid-13

Per semplicità le ho collocate su una mini breadboard:

rfid-08

Per indicare con un segnale acustico l’avvenuta lettura del tag, ho collegato un mini altoparlante al pin 8 di Arduino e a GND:

rfid-09

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:

rfid-01

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:

rfid-02

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)

2 Comments »

  1. bperrybap 15/09/2017 at 23:48 - Reply

    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.

    • luca 16/09/2017 at 15:57 - Reply

      Hi, I had to manually configure the library because there’s another device connected to the i2c bus and this “disturbed” the autoconfig routine.

Leave A Response »

Questo sito usa i cookie per poterti offrire una migliore esperienza di navigazione maggiori informazioni

Questo sito utilizza i cookie per fonire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o clicchi su "Accetta" permetti al loro utilizzo.

Chiudi