domenica 2 agosto 2015

Apriporta RFID parte 2 - il software

In questa seconda parte completo il primo post sull'apriporta rfid descrivendone brevemente il codice.

Chiamata al server esterno

Al momento della "strisciata" con il badge rfid viene chiamato un servizio web esterno che effettua la validazione del codice rfid letto.
La chiamata è una semplice http get a un pagina web alla quale vengono passati il codice rfid letto e il gate, ovvero il codice della postazione.
Questo perchè il sistema è stato pensato per gestire un set di porte, gestite centralmente con un unico database.
La chiamata è del tipo GET /presenze.aspx?code=XXX&gate=YYY, dove XXX è il codice rfid e YYY è il codice della postazione.
Il servizio chiamato restituisce un "OK" se il codice rfid è valido, in tutti gli altri casi è sufficiente che la pagina web restituisca una stringa diversa.
Per questioni di sicurezza, al fine di avere sempre garantita l'apertura della porta  anche in caso di assenza di connettività verso il server, ho previsto fino a 10 card "master" il cui identificati rfid è cablato nel codice: in questo caso se viene rilevata uno di questi codici, la porta viene aperta istantaneamente senza alcun tipo di verifica sul server remoto. Queste card andranno utilizzate solo dai proprietari del sistema, mentre l'abilitazione di tutte le altre card potrà essere fatta dinamicamente attraverso il database.

Configurazione

per la configurazione sono necessarie alcune costanti:
  • const IPAddress server(82,63,171,50) : indirizzo del nostro server
  • const int       serverPort = 80 : porta del server
  • const String    gate = "SEDE1" : identificativo della postazione (gate)
  • byte            mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0xE5, 0x0F } : mac address della ethernet shield (attenzione: deve coincidere con quello riportato sull'etichetta sul dietro della scheda)
  • const String master0 = "2590ab25" : identificativo della card master (fino a 10)
  • const int       activateTime = 1000 : tempo di attivazione del relè (consigliato >500ms)

Attenzione: se lavorate con ip address statico, settate la variabile myip[] e scommentate la riga successiva, altrimenti verrà acquisito un indirizzo dinamico via dhcp

  byte myip[] = { 10, 10, 30, 89 };   
 // Ethernet.begin(mac, myip);

Funzionamento

Il main è un ciclo infinito:
viene fatto lampeggiare il led, viene letto l'rfid, vengono aspettati 200ms e poi si ripete nuovamente il ciclo.
In caso di lettura di un rfid, viene verificato se il codice coincide con una delle card master, in tal caso viene attivato immediatamente il relè. Se il codice non è relativo a una card master, allora viene invocato il servizio esterno chiedendo la verifica sul codice rfid letto. Se la risposta è affermativa allora viene eccitato il relè.

Lo sketch

Scarica qui lo sketch completo

Non posto la parte serve in quanto davvero semplice. Nel mio caso si trattava di una pagina aspx che andava a effettuare una query su una tabella contenente le card abilitate. Al momento della chiamata veniva inoltre scritta una tabella di log riportante codice, ora, gate ed esito.






sabato 1 agosto 2015

Apriporta RFID parte 1 - il progetto

Ho avuto qualche richiesta di pubblicazione del progetto apriporta rfid, che avevo brevemente postato tempo fa su youtube.


Il progetto è un derivato diretto dal progetto di rilevazione presenze, dal quale eredita la gestione dell'Rfid e della chiamata http per validare il dato.
Ovviamente trattandosi di un apri porta è presente in più un relè che serve ad eccitare l'apriporta.

Come funziona un apriporta

Per aprire una porta con arduino è necessario che questa sia dotata di una serratura elettrica. Nella maggiorparte dei casi le porte di ingresso degli uffici sono dotati di un incontro elettrico. L'incontro non è la serratura, bensì il "fermo" che sta sulla parte opposta, sulla quale il catenaccio aperto dalla maniglia va ad incastrarsi. Nelle porte normali non elettrificate questa componente è fissa ed è semplicemente un foro, mentre nelle porte elettrificate diventa una parte mobile che può essere sbloccata elettricamente permettendo alla porta di essere aperta.
Per chi interessa c'è un bel video della Viro che spiega come montarne uno. Tra l'altro il costo è veramente ridottissimo, circa 30 euro uno di buona marca.


Di fatto per arduino l'incontro elettrico viene "nascosto" dietro un relè da eccitare per qualche decina di millisecondi, al quale sarà collegato appunto l'incontro elettrico.

Per questo progetto non ho utilizzato il classico arduino uno, bensì un arduino mega, in quanto avevo la necessità di tenermi la porta aperta (scusate il gioco di parole visto che si tratta di un apriporta...) in caso di future espansioni di questo progetto.

Ecco la lista della spesa:

  • 1 Arduino Mega 2560 R2
  • 1 proto shield
  • 1 ethernet shield (without poe)
  • 1 scheda relè 5v
  • 1 alimentatore 12v
  • 1 display 16x2
  • 1 modulo rfid 522
  • 1 level converter
  • 1 buzzer
  • 1 led
  • cavo di rete cat 5


Il cavo di rete ci servirà in quanto il modulo rfid, il led di controllo e il buzzer saranno montati lontani dalla centralina arduino. Questo perchè nella mia installazione il modulo rfid/led/buzzer sono all'esterno della porta di casa, sotto il citofono, mentre la centralina arduino + relè sono all'interno. Un po' per questioni di sicurezza (ci vuole un secondo a cortocircuitare un relè e aprire la porta), un po' perchè la parte elettronica principale preferivo non esporla alle intemperie e agli sbalzi termici (vivo in Trentino, qui d'inverno fa anche -10°C).
Non sottovalutate i cavi troppo lunghi, ho scritto un interessante post in passato, ci sono disturbi di tutti i tipi in agguato, nell'insieme questo è un progetto davvero molto sensibile ai disturbi.
Per questo ho usato twistare i segnali sulla massa in modo indipendente, nell'utilizzare il cavo di rete.

Sull'utilizzo del level converter ho scritto un precedente post, se non fosse chiaro l'utilizzo prego darvi una rapida letta.

Wiring

Per l'assemblaggio ho usato una scatola di derivazione dove ospitare l'arduino, la scheda di rete, il relè, mentre all'esterno ho utilizzato una scatola stagna per campanelli, dove viene ospitato il lettore rfid, il led e il buzzer.
Per la connessione tra le 2 scatole ho usato 2 cavi di rete cat 6, per un totale di 16 poli disponibili, di cui però ne ho usato solo una parte

Cavo 1 (cavo di rete cat 6): si usano tutte le coppie

ARDUINO          LEVEL CONVERTER                                                            RFID
50 (miso)   --->  B4 level converter     A4 ---> Marrone (twistato con B/marrone + 3.3V) --> miso 
51 (mosi)   --->  B3 level converter     A3 ---> Verde (twistato con B/verde +3.3v)      --> mosi 
8  (sda)    --->  B2 level converter     A2 ---> Arancio                                 --> sda  
9  (rst)    --->  B/Arancio                                                              --> rst  
52 (sck)    --->  Blu  (twistato con B/blu gnd)                                          --> sck  
+3.3V       --->  B/verde + B/marrone + pin LV scheda level converter                    --> +3.3V 
gnd         --->  B/blu + pin GND scheda level converter                                 --> gnd  
+5V         --->  pin HV scheda level converter

Cavo 2 (cavo di rete cat 6): si usano solo 3 cavi

ARDUINO

2  (+buzzer) --->  B/Verde   cavo 2   ----> +buzzer
53 (+led)    --->  Verde     cavo 2   ----> +led
Gnd          --->  B/Marrone cavo 2   ----> resistenze 100 ohm verso polo (-) buzzer e led
           

Connessione alla scheda Rfid (cavo 1)

arancio   ---| SDA
blu       ---| SCK
verde     ---| MOSI
marrone   ---| MISO
non coll. ---| IRQ
b/blu     ---| GND
b/arancio ---| RST
b/verde   ---| +3.3V

Buzzer e led (Cavo 2)


      LED               BUZZER
     +   -             -      +
     |   |             |      |
  verde  |             |   B/verde
         |             |
         +-100R-+-100R-+
                |
                |
               gnd
            B/Marrone
           
Connessione al relè

Arduino                 Relè
7 Polo controllo Blu -> In1 
Gnd Bianco           -> Gnd 
+5V Rosso            -> Vcc

Display

Ho utilizzato un display 16x2 montato su un connettore che ne permettesse facilmente la rimozione.
Questa componente è opzionale, ma direi indispensabile in una prima fase di test, in quanto permette agevolmente di capire se arduino è collegato in rete, se ha preso l'indirizzo dal dhcp, se l'rfid legge, ecc.

47 -> RS
43 -> enable
41 -> D4
35 -> D5
33 -> D6
31 -> D7
oltre a gnd e +5V 

Ecco alcune foto della realizzazione:














Nel prossimo post: il software dell'apriporta