Pagine

venerdì 27 novembre 2009

Arduino e lettore RFID ID-12 Innovations

Premessa: RFID

RFID significa Radio Frequency IDentification ed è un sistema di identificazione di oggetti, animali e persone.
Questo sistema richiede un lettore ed uno o più TAG (o transponder) che non sono altro che oggetti "montati" in qualche modo sull'oggetto da riconoscere.
Quando il TAG passa in prossimità del lettore invia un identificativo univoco (solitamente in formato esadecimale).
La portata di questo sistema è di pochi centimetri ma, grazie ad antenne, è possibile anche arrivare a distanza di qualche metro: tale caratteristica rende questa tecnologia particolarmente interessante.
Facciamo un paio di esempi per semplificare il tutto: un utilizzo classico può trovarsi in fabbrica.
Quando arrivano dei rotoli di metallo ci applico un tag rfid e lo registro. Tutte le volte che un rotolo di metallo esce dal magazzino passa sotto un lettore rfid che identifica l'uscita del rotolo stesso (non DI UN rotolo ma proprio DI QUEL rotolo...) aggiornando la quantità nel database...
Un altro esempio può essere un sistema di tibratura aziendale: all'ingresso dell'ufficio metto un lettore RFID e metto a disposizione di ciascun dipendente un badge che non è altro che un TAG RFID: quando il dipendente entra o esce passa il badge sul lettore che registra ingresso e uscita.
In questo articolo vedremo come montare un lettore RFID su arduino e inviare il segnale al computer. Questo esperimento è stato fatto in collaborazione con Enkel.

Componenti

Gli elementi che servono sono i seguenti:

  • Un arduino da usare come gestore di input ed output tra il lettore, il led ed il PC
  • Un modulo lettore RFID: io ho scelto l'Innovations ID-12
  • Un adattatore di piedinatura per il modulo necessario perchè l'ID-12 ha una piedinatura non compatibile per una breadboard.
  • Uno o più TAG a 125kHz a forma di badge, disco, portachiavi o altro.
  • Componentistica varia (led, buzzer, resistenze)

Procedimento

Prima di tutto occorre saldare il modulo ID-12 (di cui potete trovare il datasheet) sull'adattatore di piedinatura per renderlo compatibile con i fori della breadboard.
Successivamente bisogna collegare i piedini come l'immagine che segue. Alcuni esempi, compreso il datasheet, propone anche di utilizzare un BJT sul piedino del led in modo da amplificare il segnale.
Così facendo, oltre al LED disegnato in figura, è possibile anche inserire un buzzer che permette, nel momento in cui si avvicina il TAG, di segnalare il recepimento della informazione sia in modo visivo (LED), sia in modo sonoro (BUZZ).

Usando una foto effettuata da noi:


La cosa più interessante è stato il codice utilizzato. Abbiamo usato lo sketch per arduino in questa pagina: http://www.arduino.cc/playground/Code/ID12.
Lo riporto di seguito per completezza:

// RFID reader ID-12 for Arduino
// Based on code by BARRAGAN
// and code from HC Gilje - http://hcgilje.wordpress.com/resources/rfid_id12_tagreader/
// Modified for Arudino by djmatic
// Modified for ID-12 and checksum by Martijn The - http://www.martijnthe.nl/
//
// Use the drawings from HC Gilje to wire up the ID-12.
// Remark: disconnect the rx serial wire to the ID-12 when uploading the sketch


void setup() {
Serial.begin(9600); // connect to the serial port
}

void loop () {
byte i = 0;
byte val = 0;
byte code[6];
byte checksum = 0;
byte bytesread = 0;
byte tempbyte = 0;

if(Serial.available() > 0) {
if((val = Serial.read()) == 2) { // check for header
bytesread = 0;
while (bytesread < 12) { // read 10 digit code + 2 digit checksum
if( Serial.available() > 0) {
val = Serial.read();
if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) { // if header or stop bytes before the 10 digit reading
break; // stop reading
}

// Do Ascii/Hex conversion:
if ((val >= '0') && (val <= '9')) {
val = val - '0';
} else if ((val >= 'A') && (val <= 'F')) {
val = 10 + val - 'A';
}

// Every two hex-digits, add byte to code:
if (bytesread & 1 == 1) {
// make some space for this hex-digit by
// shifting the previous hex-digit with 4 bits to the left:
code[bytesread >> 1] = (val | (tempbyte << 4));

if (bytesread >> 1 != 5) { // If we're at the checksum byte,
checksum ^= code[bytesread >> 1]; // Calculate the checksum... (XOR)
};
} else {
tempbyte = val; // Store the first hex digit first...
};

bytesread++; // ready to read next digit
}
}

// Output to Serial:

if (bytesread == 12) { // if 12 digit read is complete
Serial.print("5-byte code: ");
for (i=0; i<5; i++) {
if (code[i] < 16) Serial.print("0");
Serial.print(code[i], HEX);
Serial.print(" ");
}
Serial.println();

Serial.print("Checksum: ");
Serial.print(code[5], HEX);
Serial.println(code[5] == checksum ? " -- passed." : " -- error.");
Serial.println();
}

bytesread = 0;
}
}
}

L'ouput di questo sketch, passando sopra i vari TAG è stato il seguente:

5-byte code: 01 06 8E 2C 95
Checksum: 30 -- passed.
5-byte code: 01 07 84 6B 3F
Checksum: D6 -- passed.
5-byte code: 01 06 8E 1E DE
Checksum: 49 -- passed.
5-byte code: 01 06 8E 2C 95
Checksum: 30 -- passed.


E per chiudere, una foto con birra sullo sfondo e i TAG in primo piano:

34 commenti:

  1. Ciao cuginetto,
    sai che dovremmo parlare bene a 4 occhi del RFID, la storia del rotolo che esce dalla fabbrica, proprio quel rotolo, se questa fosse una cosa tasta e funzionante a 100%, ho un ideuccia in mente!

    RispondiElimina
  2. Ciao Vittorio interessante il tuo progetto! Complimenti sarei intensionato anch'io a fare ciò, ma guardando bene le foto da te scattate ..
    noto che il collegamento dei fili sulla breadboard non seguono l'ordine del disegno soprastante..Mi spiego meglio, il filo giallo sia sotto che sopra e stato messo a massa ma nella foto soprastante indica che va a +5v ...
    adesso mi chiedevo si sarà confuso per via di quella Moretti??? xD
    Mi preoccupo perchè visto che anch'io sono intensionato di svillupPare conoscenza sull'RfiD,non vorrei rischiare di bruciare tutto al primo tentativo... lo sò tentar non nuoce! ma alla mia tasca si !!! xD
    GRAZIE di tutto saluti cj-dos

    RispondiElimina
  3. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  4. Ciao, effettivamente tra le varie prove le fotografie scarseggiavano per le "combinazioni" provate.
    Tieni conto che è praticamente impossibile bruciare qualcosa se utilizzi i 5V con un sistema RFID.
    Se effettui qualche prova fammelo sapere: mi farebbe molto piacere sapere che questo articolo ti è stato utile :-P

    RispondiElimina
  5. ok grazie della risposta! gentilissimo anche nel rispondermi grande Vittorio!!! :-)
    Ascolta oggi pomeriggio ho ordinato tutto il materiale in vaRi shoponline.. penso che per il 10 settembre ho tutto sulla scrivania , poi farò test contrO test e sperando che festeggi anch'io!!! non ti preoccupare che gia mi sei stato d'aiuto già nel decidere cosa prendere perchè effettivamente il modulo id12 rfid lo vidi gia non molto tempo fà ma non sapevo che poteva essere pilotato da un semplice arduino!!!
    Comunque ti terrò aggiornato volendo ti passo tutto ciò che vuoi perchè adoro coloro che mi stanno vicino a farmi compagnia nelle mie curiosità...
    GRAZIE di tutto!!
    a presto, Saluti Cj-DoS

    RispondiElimina
  6. ciao vittorio il materiale mi e arrivato prima del previsto ho provato a eseguire come nelle tue foto ma niente di che...
    carico lo steck ma rimane il red rosso acceso e mi da vari problemi Con il software dell'arduino mi dice di andare a visitare il sitoforum /uploading/arduino... mi sa che e molto più dura di quando pensavo forse dovrò registrarmi nel forum di arduino, ha dimenticavo tu hai collegato solo il filo di RX io prima senza e poi con TX...
    SALUTI CJ-DOS

    RispondiElimina
  7. Ciao CJ-DOS, personalmente non ho incontrato grossi problemi con questa tecnologia.
    Devi solo fare molta attenzione ai PIN RX e TX perchè effettivamente si possono avere dei problemi se si scambiano i PIN.
    Segui bene lo schema iniziale, la figura stilizzata per intenderci e dovresti andar liscio come l'olio :-)

    RispondiElimina
  8. ciao
    dovrei fare questo progetto per l'esame di maturità....
    però ad ogni codice dei tag dovrei associare un nome di studente per creare una specie di registro di frequenza a scuola potresti indicarmi un modo per farlo ??
    grazie in anticipo

    RispondiElimina
  9. Ciao,
    effettivamente il tutto è nato proprio con questo scopo. Inizialmente volevo fare un registro di timbratura per l'azienda per mio padre.
    In realtà quello che mi chiedi... è già fatto!!!
    Una volta che tu assegni ogni tag RFID ad uno studente, basta che ti annoti l'associazione tag-studente ed il gioco è fatto!
    Certo... lato computer devi gestire la comunicazione con un database e li sta alla piattaforma che vuoi utilizzare come storage delle informazioni.

    RispondiElimina
  10. è proprio quello ke intendevo io devo creare un database di nomi ke segna le presenze e non ho la minima idea di come farlo :)

    RispondiElimina
  11. Beh questo, però, è un argomento decisamente diverso dal post :-)
    Dipende da quanti dispositivi e persone si collegano contemporaneamete. Da questo dipenderà la tecnologia che dovrai usare: un file piatto, un server sql o un sistema di database più modesto.
    Inoltre oltre ad arduino dovrai conoscere un linguaggio che faccia da tramite come python o VB o C o perl o qualcosa che legga da seriale e scriva su disco.
    Insomma non è un discorso che si può affrontare in poche righe :-)

    RispondiElimina
  12. Ciao Vittorio,

    complimenti per il progetto che ho seguito alla lettera....ho solo un porblema: nel serial-monitor non mi compare nulla la passaggio del tag.
    La COm è settata correttamente, il cicuito funziona anche perchè il led si accende al passaggio del tag e poi misurando col multimetro la tensione a RX "succede qualcosa"..suggerimenti?

    RispondiElimina
  13. A che velocità è impostata la COM?
    Forse è solo un problema di baud. Non ricordo a quanto deve essere impostata ma prova a cambiare i valori. Dovrebbe funzionare.

    RispondiElimina
  14. ciao ho montato il tutto xo nn mi stampa il codice sul serial monitor, c'è per caso un modo con cui devo salvare le tag? e poi su arduino devo collegare su rx o su tx ?
    grazie :)

    RispondiElimina
  15. Ciao Anonimo,
    l'rfid va su RX della seriale di Arduino mentre il TX va al PC.
    Al ritorno dalle ferie, comunque, pubblicherò una applicazione pratica del rfid che ho implementato il mese scorso.
    Come direbbero gli inglesi, stay tuned :-)

    RispondiElimina
  16. grazie:) cmq vorrei capire perchè non mi stampa sul serial monitor .... vedo che non sono l'unico con questi problemi fammi sapere grazie :)

    RispondiElimina
  17. ciao vittorio !
    dovrei farti una domanda...
    hai per caso il flow chart del programma dell'rfid?
    se si potresti inviarmelo a ciccio_993@hotmail.it
    grazie mille !!

    RispondiElimina
  18. Bisognerebbe controllare bene il circuito ma... ad ogni modo entro metà settembre posto una applicazione su questo elemento.

    RispondiElimina
  19. Ciao ciccio, non ho il flowchart del programma.
    Come ho scritto prima, però, ho in programma di inserire la mia applicazione entro settembre che, essendo scritta a "stati finiti", è estremamente facile da comprendere a livello di flusso.

    RispondiElimina
  20. Buongiorno. Premetto che sono un programmatore e sono poco ferrato di elettronica.
    E' possibile acquistare una scheda già printa con interfaccia ethernet e 2 (meglio 3) ingressi per lettori rf, 2 (meglio 3) relé con i quali pilotare serrature? A quale costo e dove le vendono?

    RispondiElimina
  21. Ciao Denis, proprio tutto pronto direi di no...
    Esiste uno shield (una scheda da inserire sopra arduino) ethernet che ti da la porta di rete.
    Vi è la possibilità di pilotare più relè anche in tensione di rete tramite dei transistor e vi è la possibilità di gestire lettori RFid.
    Non c'è un prodotto già pronto all'uso ma è da assemblare e programmare.
    Su questa pagina puoi vedere i seller italiani dove trovare tutto il materiale che ti serve:
    http://arduino.cc/en/Main/Buy
    Magari potresti creare il prodotto e poi rivenderlo :-)

    RispondiElimina
  22. Ho implementato anche io un'interfaccia simile:
    http://www.csshl.net/content/modulo-id12 (descrizione e codice)
    http://www.csshl.net/content/tutto-insieme (foto)

    Ho aggiunto un diodo per non dover disconnettere l'ID12 quando invio uno sketch.
    A livello sw è parecchio diverso, poiché uso un sistema a multitasking cooperativo (alla fin fine una macchina a stati che esegue un passo ogni volta che viene richiamata loop() ).

    RispondiElimina
  23. Ottimo riferimento.
    Pubblico volentieri

    RispondiElimina
  24. salve, non sono un arduinista, ma vorrei sapere se possibile creare un rfid reader/writer basato sul arduino, che mi 'permette' di clonare i chip dei toner. lo so che esiste http://www.cutedigi.com/product_info.php?products_id=4325 , ma no so su quale frequenza funzionano questi chip che montano sul toner.
    qualcuno di voi ha qualche idea o esperienza nel 'leggere/scrivere' dati sul questi chip?

    RispondiElimina
  25. Mi dispiace ma purtroppo non ho alcuna esperienza in merito :-(

    RispondiElimina
  26. Complimenti per l'articolo ben dettagliato e esaustivo. Volevo sapere se hai realizzato altri progetti con gli RFID e se pubblicherai qualche altro articolo in merito.

    RispondiElimina
  27. Ciao,
    si ho realizzato una sorta di "segnalatore presenze" in ufficio.
    Da tempo ho in cantiere un articolo in merito ma per il momento ancora non l'ho concluso.
    Puoi comunque seguirmi con l'RSS feed e/o Twitter :-)

    RispondiElimina
  28. ciao
    prima di trovare il tuo circuito avevo già realizzato un circuito che avevo trovato con relè, transistor, un pulsante e due led, che mi permetteva di registrare i tag o cancellarli premendo adeguatamente il pulsante. il programma però è complicato. vorrrei sapere se utilizzando lo sketch che hai riportato posso registrare tag appena comprati o se non è neanche necessario ma basta utilizzare questo sketch per leggerli già la prima volta.
    grazie

    RispondiElimina
  29. Ciao Romolo. Complimenti!
    Volevo porti alcune domande, ma prima la mia idea:
    vorrei realizzare un robot che venga svegliato dalla suo stato di standby da un segnale infrarosso, e in particolare egli poi si approssimi presso la persona che indossa un TAG e la segua mantenendosi ad una distanza di 50 cm circa.
    Non ho problemi nella fase di sveglia del robot, al contrario sono interessato all'avvicinamento (rapido ed esatto, cioè guidato da un sistema di riferimento ...) presso il soggetto che indossa il Tag. Le mie domande sono:
    1) se il luogo dove mettere in opera tutto ciò fosse una stanza abbastanza grande esiste un tag che emetta un segnale che raggiunga i 20 metri?
    2) il tag dispone delle informazioni su latitudine e longitudine del punto esatto in cui si trova?
    3) questo tipo di tag è passivo?
    Grazie per la tua attenzione.

    RispondiElimina
    Risposte
    1. 1) Non è il Tag che trasmette il segnale, ma il lettore che lo "legge" quando è in prossimità, 15/20 cm al massimo.
      2) Assolutamente no, i tag rfid sono passivi e non hanno GPS o altro al loro interno.
      3) Sì, sono tag passivi come detto prima.

      Non credo la tua idea sia realizzabile usando la tecnologia RFID.

      Elimina
  30. Ciao Romolo. Complimenti!
    Volevo porti alcune domande, ma prima la mia idea:
    vorrei realizzare un robot che venga svegliato dalla suo stato di standby da un segnale infrarosso, e in particolare egli poi si approssimi presso la persona che indossa un TAG e la segua mantenendosi ad una distanza di 50 cm circa.
    Non ho problemi nella fase di sveglia del robot, al contrario sono interessato all'avvicinamento (rapido ed esatto, cioè guidato da un sistema di riferimento ...) presso il soggetto che indossa il Tag. Le mie domande sono:
    1) se il luogo dove mettere in opera tutto ciò fosse una stanza abbastanza grande esiste un tag che emetta un segnale che raggiunga i 20 metri?
    2) il tag dispone delle informazioni su latitudine e longitudine del punto esatto in cui si trova?
    3) questo tipo di tag è passivo?
    Grazie per la tua attenzione.

    RispondiElimina
  31. Ciao Vittorio,
    complimenti per l'interessantissimo articolo: una domanda... in fase di programmazione è possibile associare anche il tempo cosi da realizzare una sorta di rilavamento tempi per gare podistiche?
    A tuo parere, con adeguate antenne, potrebbe diventare un sistema affidabile, tenendo in considerazione le velocità degli atleti?
    Ancora complimenti e grazie.
    Ciao, Michele.

    RispondiElimina
  32. Assolutamente no. Vedrei meglio un lettore ad infrarossi :-)

    RispondiElimina
  33. Ciao Vittorio,
    sono interessato a questo progetto (vorrei fare un rilevatore di entrate ed uscite collegando arduino ad un database MySQL tramte una Shield Ethernet) ma purtroppo le foto non sono più visibili, non è che le potresti riuppare per cortesia?
    Ciao Gianluca

    RispondiElimina