Visualizzazione post con etichetta Rilevatore presenze. Mostra tutti i post
Visualizzazione post con etichetta Rilevatore presenze. Mostra tutti i post

giovedì 26 febbraio 2015

Bus SPI e cavi lunghi

Ho recentemente montato una versione del mio progetto di rilevazione presenze con rfid, adattandolo ad apri porta con validazione lato server.
Non ripropongo qui il progetto perchè è una leggerissima variante di quello già postato in precedenza per il rilevatore presenze.
La cosa interessante su cui volevo soffermarmi è la difficoltà di portare lontano le periferiche dalla board arduino, in particolare quelle basate sul bus SPI.
Nel progetto incriminato utilizzavo una mega 2560 con a cavallo una ethernet shield e un relè, che doveva costituire la centralina base del mio apriporta e posizionata all'interno dell'abitazione.
All'esterno dell'abitazione veniva posizionato il lettore rfid rc522, un led e un buzzer di segnalazione.
In mezzo, circa 3m di cavo, su cui girava il bus spi e i pin di controllo per led+buzzer.
Sia la ethernet shield che l'rfid utilizzano il bus SPI, alternandosi tramite attivazione via software (pin SDA).
Ho perso circa 2gg a cercare di capire il perchè il tutto funzionasse perfettamente sul tavolo di casa ma appena montato nella sua sede definitiva smettesse di funzionare, in particolare la schede ethernet che pensavo, essendo montata direttamente sopra la board arduino, dovesse essere l'ultima ad avere problemi.
Il problema è che il bus SPI non è fatto per le grandi distanze, anzi è fatto per gestire collegamenti diretti molto molto brevi tra shield.

Dalle specifiche dello standard SPI:

The serial peripheral interface (SPI) bus is an unbalanced or single-ended serial interface designed for short-distance communication between integrated circuits

Appena si introduce un cavo lungo, anche nell'ordine di 1 o pochi metri, si vanno a introdurre disturbi sul bus SPI che alterano in modo sistematico e a volte randomico il funzionamento.
Il bus SPI infatti "gira" a una frequenza tipicamente 1/4 della frequenza del nostro arduino. Su un arduino Uno o Mega 2560, il clock 16MHz va a formare il clock al SPI  con una frequenze pari a 1/4, ovvero 4MHz. Un segnale digitale a 4MHz su un cavo inadatto o in ambiente rumoroso (cavi 220V nelle vicinanze, citofoni, campanelli, ecc) può essere davvero un gran problema.
Uno dei problemi che riscontravo era che nonostante l'rfid fosse scollegato, il solo cavo volante connesso lato arduino al bus SPI portasse gravi disagi all'ethernet shield posta a 1cm dall'arduino board.

Ci sono vari trick&tips per la soluzione del problema.

Consiglio #1

Attenzione al cavo: evitiamo cavi elettrici sfusi o da antifurto. Un cavo di rete cat5/6 può andare benissimo, meglio se schermato (stp). La particolare conformazione del cavo di rete, a coppie twistate, permette scegliendo bene la combinazione di segnali di proteggersi meglio dal rumore.
Ad esempio accoppiando SCK con GND, MISO con Vdd, MOSI con Vdd ho ottenuto ottimi risultati. Tra tutti quandi direi che il segnale di clock SCK è quello più sensibile al rumore.

Consiglio #2

Un'altro fattore importantissimo da non sottovalutare è la frequenza del clock. Più il cavo è lungo, più effetto capacitivo ed induttivo viene introdotto, alterando la forma del segnale digitale. Quello maggiormente sensibile è proprio il segnale di clock (SCK, a volte indicato come CLK).
La frequenza può però essere ridotta via software, impostando un divisore maggiore della frequenza base.

Questa semplice istruzione ad esempio imposta il clock a 16MHz / 128 = 125KHz

SPI.setClockDivider(SPI_CLOCK_DIV128); 

Altri consigli

Ho trovato vari articoli, ma questo mi è stato particolarmente utile:
http://neophob.com/2012/03/lpd6803-spi-and-long-distance
In particolare qui si cita la necessità di introdurre sui pin dati del spi (miso , mosi e anche sul clock sck) una resistenza di basso valore (33-51-100Ohm) al fine di implementare un terminatore per ridurre le reflextion del segnale.
Nel mio caso non ho provato perchè la semplice adozione del cavo twistato e l'abbassamento del clock ha permesso di far funzionare tutto egregiamente, però immagino che nel caso avessi adottato un cavo più lungo tale consiglio sarebbe stato essenziale.
Altri consigliano di mettere una resistenza tra il SCK e la GND, pari a 1K o più.

Parola d'ordine: SPERIMENTARE!





lunedì 6 gennaio 2014

Rilevatore presenze - parte 4 - il codice (client)

Nel precedente post ho mostrato le porzioni principali del codice su Arduino.
Per effettuare la chiamata al server, viene invocata una chiamata HTTP in modalità GET, ovvero passando i parametri direttamente in query string.

E' previsto un unico tipo di chiamata, usato indifferentemente sia per l'entrata che per l'uscita.
Si noti che non è il client arduino a decidere se si tratta di una timbratura di entrata o di uscita, bensì il server secondo delle logiche applicative ben precise, dovute alla sequenza di chiamate.

La sintassi della chiamata è la seguente:

http://SERVER/presenze.aspx?code=CODICERFID&dataora=DATAORA

dove SERVER è ovviamente l'ip del vostro web server, presenze.aspx il nome della pagina aspx invocata, CODICERFID il codice della tag rfid rilevata e DATAORA la data/ora in formato yyyymmddhhMMss letta dalla rtc shield montata su Arduino.

La risposta del server è una stringa in questo formato
  • XyyyymmddhhMMss 
dove:
  • X: vale E per entrata, U per uscita
  • yyyymmddhhMMss :data/ora del server

Il valore X serve per determinare il messaggio da mostrare all'utente quale conferma della timbratura.

domenica 8 dicembre 2013

Rilevatore presenze - parte 3 - il codice (client)

Il codice di controllo è molto banale, astraendoci dal funzionamento delle singole librerie.
Vediamo brevemente il controllo delle periferiche:

Buzzer

è basato su un'unico pin. Il buzzer si attiva inviando lo stato HIGH all'uscita. Per ottenerere un beep udibile è sufficiente un impulso di qualche decina di millisecondi. 

const int chipBuzzerPin =2; 

void beep()
{
   digitalWrite(2, HIGH);
   delay(120);   
   digitalWrite(2, LOW);
   delay(120);   
}

void beepLong()
{
   digitalWrite(2, HIGH);
   delay(2000);   
   digitalWrite(2, LOW);
   delay(120);   
}

void setupBuzzer()
{
  pinMode(chipBuzzerPin,OUTPUT);    
  digitalWrite(chipBuzzerPin, LOW);    
}

venerdì 29 novembre 2013

Rilevazione presenze con Rfid - parte 2 - La postazione di rilevazione

Vediamo nel dettaglio le componenti della postazione di rilevazione:

a) un lettore rfid costituito da una scheda Mifare Rc522 che si trova facilmente su ebay in accoppiata a una card o tag rfid.


La scheda utilizza lo standard SPI per la comunicazione con arduino. il collegamento é quello classico delle periferiche Spi: 2 piedini di alimentazione 3.3V e Gnd, 5 pin per la comunicazione : miso, mosi, sck, sda e rst. In questa scheda esiste un ottavo piedino scollegato denominato NC.
Per il controllo non ci si deve preoccupare perché esistono in rete molte librerie di controllo giá pronte all'uso. Nel mio caso ho preferito prendere una libreria esistente ed includerla nel progetto, in modo da ripulirla dalle funzioni in eccesso.Tuttavia se preferite utilizzarne una fatta e finita cercate in google con le keyword 'MFRC522 library arduino'
b) una scheda real time clock, ovvero un vero e proprio orologio in grado di fornire l'ora e la data. Tale scheda è autonoma in quanto possiede una batteria tampone che gli permette di mantenere l'ora corrente anche in caso di mancanza di tensione. Io ho utilizzato una Shield basata sul chip DS1307. La comunicazione è basata sullo standard I2C.

mercoledì 27 novembre 2013

Rilevazione presenze con Rfid - parte 1 - Introduzione

Oggi vorrei descrivere una semplice soluzione pensata per la rilevazione delle presenze in azienda. La soluzione, davvero economica, permette di registrare gli ingressi ed uscite dei dipendenti dotandoli di un chip rfid personale, di quelli che ormai si trovano in tutte le forme: portachiavi, tessere, adesivi, ecc. La registrazione dei dati avviene su un database Sql Server (ma la soluzione é facilmente adattabile ad altri db) e la soluzione é completa di interfaccia web per la consultazione dei report mensili di presenza.

Il sistema di fatto é una piccola soluzione client-server dove il client é costituito da un lettore rfid collegato a un Arduino Uno interfacciato via rete lan con un server Windows, dove i dati vengono scambiati con Arduino mediante un semplice protocollo rest basato su un server IIS. 

Descriverò passo passo tutte le componenti, in modo che possiate facilmente replicare e personalizzare questo progetto.


Cosa serve per iniziare:

  • una scheda Arduino Uno (circa € 25)
  • una Ethernet Shield  (circa € 30)
  • un display lcd grafico 84x48 retroilluminato NOKIA 5110 ( circa € 5) 
  • un modulo Lettore RFID mifare RC522 reader (circa € 15)
  • una scheda clock  DS 1307 RTC real time clock  (circa € 5)
  • un buzzer e una resistenza da 220 Ohm ( < € 1 )
  • una protoboard 
  • uno o più chip rfid a standard mifare (€ 3 cadauno)