I.I.S. "PRIMO LEVI" - Torino AREA DI PROGETTO Progettazione e realizzazione di un sistema informatizzato per la gestione funzionale di un magazzino con l'utilizzo di codici a barre e Arduino Esecutori: Giuseppe CROCE Federico LORELLO 5°BN 5°BN Coordinatori: Prof. Mario MEZZO Prof. Francesco CORMAGGI Prof. Giorgio CARPIGNANO Anno scolastico 2013/14 Indice 1 Introduzione ............................................................................................. 6 1.1 Il concetto di magazzino ................................................................ 6 1.2 Lo stoccaggio della merce ............................................................. 7 2 Caratteristiche dei codici a barre ........................................................... 8 2.1 Cosa sono i codice a barre ............................................................. 8 2.2 Perché utilizzare i codici a barre .................................................... 8 2.3 Gli standard più diffusi .................................................................. 9 2.3.1 Codice EAN.................................................................... 10 2.3.2 Codice UPC .................................................................... 10 2.4 La stampa ..................................................................................... 11 2.5 Tecnologie di lettori ..................................................................... 11 2.5.1 Scanner a laser ................................................................ 12 2.6 Trasmissione dati ......................................................................... 13 2.7 RFID, tecnologie a confronto ...................................................... 13 2.7.1 Importanza e diffusione .................................................. 13 2.7.2 Descrizione fisica ........................................................... 14 2.7.3 Tag .................................................................................. 16 2.7.3.1 Modalità read-only e read/write ...................... 18 2.7.3.2 Vantaggi rispetto a codici a barre .................... 18 2.7.4 Applicazioni RFID ......................................................... 19 2.7.4.1 Logistica magazzini ......................................... 19 2.7.4.2 Antitaccheggio ................................................. 19 3 Generalità sulle reti ............................................................................... 20 3.1 Classificazioni .............................................................................. 20 3.2 Il wireless ..................................................................................... 22 3.2.1 Caratteristiche tecniche e architettura ............................ 23 3.2.2 Le classi .......................................................................... 24 3.2.3 Tecniche di trasmissione Spread Spectrum .................... 24 3.2.3.1 Descrizione ...................................................... 25 3.2.3.2 Frequency hopping .......................................... 26 3.2.3.3 Direct sequence ............................................... 27 4 Progettazione e realizzazione del prototipo ........................................ 28 4.1 Caratteristiche per gli utenti finali ............................................... 28 4.2 Funzioni principali del sistema .................................................... 28 4.3 Caratteristiche dell'hardware........................................................ 29 4.4 Componenti .................................................................................. 30 pag. 3 4.4.1 4.5 4.6 4.7 4.8 5 Arduino ........................................................................... 31 4.4.1.1 Introduzione alla scheda .................................. 31 4.4.1.2 Caratteristiche tecniche di Arduino Yun ......... 32 4.4.1.3 Alimentazione.................................................. 34 4.4.1.4 Input e Output .................................................. 35 4.4.1.5 Bridge .............................................................. 35 4.4.2 Scanner di codici a barre ................................................ 36 4.4.2.1 Il protocollo PS2 .............................................. 36 4.4.3 Tastiera ........................................................................... 39 4.4.3.1 Tastiera a matrice ............................................ 39 4.4.4 Display LCD ................................................................... 40 4.4.5 Batteria da 9V ................................................................. 40 Progettazione dello schema elettrico ........................................... 41 4.5.1 Circuito di alimentazione ............................................... 41 4.5.2 Connessione con l'LCD .................................................. 42 4.5.3 Tastiera analogica ........................................................... 43 4.5.4 Trigger per il tastierino ................................................... 45 4.5.5 Interfacciamento con il connettore PS2 .......................... 46 Realizzazione pratica della scheda elettrica ................................. 47 4.6.1 Design ............................................................................. 47 4.6.2 Costruzione del PCB ...................................................... 48 Sviluppo del software .................................................................. 49 4.7.1 Casi d'uso ........................................................................ 49 4.7.1.1 Identificazione merci ....................................... 50 4.7.1.2 Carico merci .................................................... 50 4.7.1.3 Scarico merci ................................................... 51 4.7.2 Database ......................................................................... 51 4.7.2.1 Cos'é un database ............................................. 51 4.7.2.2 Scelta del tipo di database ............................... 52 4.7.2.3 SQLite.............................................................. 52 4.7.2.4 Tabelle SQL e Query ....................................... 53 4.7.3 L'architettura del web server .......................................... 55 4.7.3.1 Interfaccia web ................................................ 56 4.7.4 Sketch Arduino ............................................................... 59 4.7.4.1 Comunicare con il database ............................. 60 4.7.4.2 Riconoscimento del tasto ................................. 61 Tabella riassuntiva dei costi finali ............................................... 63 Conclusioni ........................................................................................ 64 Appendice A - Schema circuitale ......................................................... 65 pag. 4 Appendice B - Circuito stampato ......................................................... 66 B.1. PCB................................................................................. 66 B.2. Lato componenti ............................................................. 67 B.3. Lato saldature ................................................................. 68 Appendice C - Fotografie ...................................................................... 69 C.1. Visione dall'alto .............................................................. 69 C.2. Visione di lato................................................................. 70 C.3. Visione da dietro............................................................. 70 Appendice D - Sketch ............................................................................ 71 Sitografia ................................................................................................ 82 pag. 5 Scanner Barcode pag. 6 Capitolo 1 Introduzione Il progetto è stato svolto durante l'anno scolastico con l'obbiettivo di realizzare l'hardware e il software necessario a fornire un sistema informatizzato per la gestione delle giacenze di un magazzino, delle operazioni di carico e di scarico delle merci mediante l'utilizzo dei codici a barre per identificare i prodotti. Le aziende che scelgono di non affidarsi a queste tecnologie si rimettono solitamente alle conoscenze che il magazziniere possiede dello stato del magazzino, il quale basa i propri controlli su riscontri puramente visivi e che quindi può incorrere nell'errore umano. Il sistema in esame si propone di automatizzare le operazioni di carico e di scarico delle merci, eliminando le problematiche che possono sorgere nelle fasi di consegna e spedizione. In un mercato sempre più competitivo diventa della massima importanza gestire il magazzino in modo rapido e preciso. I codici a barre applicati sui prodotti e sulle merci in giacenza aiutano in questo compito. La possibilità di fare un inventario di magazzino passa attraverso una operazione fondamentale: tutto il materiale posto a magazzino deve portare un'etichetta con codice a barre in grado di identificarlo. 1.1 Il concetto di magazzino Da sempre il magazzino è parte integrante di tutte le realtà aziendali e viene considerato uno dei punti vitali dell'impresa a cui il management dedica particolare attenzione vista la funzione essenziale che espleta all'interno dell'azienda ed in tutto il processo produttivo. Il termine "magazzino" si riferisce ad un locale adibito al deposito e alla conservazione delle merci. Da un punto di vista economico-aziendale questa definizione risulta riduttiva poiché con lo stesso termine si fa riferimento ad una struttura logistica in grado di ricevere merci, custodirle, conservarle e di renderle disponibili per lo smaltimento e la consegna. Il ruolo assolto dal magazzino va quindi ben oltre a quello di mero deposito merci. Esso garantisce la continuità del processo produttivo e la tempestività nel soddisfacimento dei bisogni della clientela. Grazie all'utilizzo di un magazzino si può provvedere agli approvvigionamenti secondo i ritmi giudicati più opportuni e nei tempi in cui i prezzi si ritengono più convenienti. pag. 7 1.2 Lo stoccaggio della merce Un magazzino risulta efficiente quando è possibile reperire in tempi abbastanza brevi tutti i prodotti richiesti. È essenziale che ogni addetto al magazzino debba conoscere quali prodotti siano in stoccaggio e in quale quantità. In tal senso gli indici delle scorte forniscono dati importantissimi su cu il management può basare l'intera strategia aziendale. Un livello di scorte eccessivo o insufficiente può generare nei casi più gravi il fallimento dell'azienda, o, nei casi blandi il ritardo nelle consegne, il sottoutilizzo delle risorse, l'obsolescenza dei materiali presenti nelle scorte. Per una corretta gestione delle scorte non è sufficiente individuare il livello della scorta minima di sicurezza per cui serve richiedere il riordino della merce, ma bisogna tenere sotto controllo anche altri fattori, che seppur non vitali, servono per una oculata gestione. Il parametro più utilizzato ed efficace per apprezzare la velocità di circolazione delle merci è l'indice di rotazione delle scorte. Esso indica il numero delle volte in cui avviene il completo rinnovo della merce in stoccaggio in un determinato periodo di tempo ed è utile per individuare quali articoli tendono a sostare troppo a lungo in magazzino. Una volta calcolato tale indice bisogna interpretarlo tenendo conto delle caratteristiche svolte dall'azienda e dei beni che essa tratta. Risulta intuibile che un magazzino di una impresa che tratta prodotti deperibili (come la frutta) debba avere un indice di rotazione più elevato di un'altra che tratta tutt'altra categoria di prodotti. Un elevato indice di rotazione indica che le scorte sono rimaste in magazzino per un periodo limitato e l'impresa è così riuscita a rientrare dell'investimento impiegato per l'acquisto. Al contrario una lenta rotazione significa che le risorse investite sono rimaste immobilizzate a lungo, creando tensione finanziaria. Il calcolo dell'indice di rotazione può essere effettuato in base al rapporto tra le quantità vendute (o utilizzate) in un determinato periodo di tempo e la quantità delle scorte medie registratasi nello stesso periodo. Figura 1.1. Formula per calcolare la velocità di rinnovo di singole merci. La scorta media si può calcolare in due modi: dividendo per 13 la somma del numero delle scorte iniziali con quelle rilevate alla fine di ciascun mese solare, oppure con la semisomma della quantità delle scorte esistenti all'inizio del periodo che si vuole analizzare (Si) con quella in rimanenza alla fine del medesimo (Sf). Figura 1.2. Formula per calcolare la scorta media pag. 8 Capitolo 2 Caratteristiche dei codici a barre 2.1 Cosa sono i codice a barre I codici a barre sono stati introdotti negli anni 70 e la loro adozione è sempre più ampia per i riconosciuti vantaggi che offre. Esprimono alcuni elementi dei prodotti commerciali, come il prezzo e il codice di magazzino. Possono essere definiti come una simbologia o un alfabeto per la codifica di informazioni in un formato tale da poter essere acquisiti automaticamente da opportuni lettori. Si presenta come una immagine composta da bande di linee verticali di spessore variabile, leggibili attraverso un sensore e convertite in numeri da un apposito lettore. Figura 2.1. Esempio di codice a barre I codici a barre permettono quindi la memorizzazione di informazioni in maniera non volatile su di un supporto, e la possibilità di recuperarle in seguito con semplici apparati di lettura di tipo ottico. 2.2 Perché usare i codici a barre Il computer è stato protagonista dello sviluppo tecnologico degli ultimi decenni grazie alla sua capacità di elaborare enormi quantità di dati in tempi brevi. Tali dati sono però forniti dal mondo esterno e le modalità di acquisizione influiscono sulla rapidità e sulla correttezza delle operazioni. Solitamente l'acquisizione dei dati avviene tramite l'operatore umano, mediante l'uso di terminali. Da ciò derivano problemi quali la lentezza della digitazione dei dati e l'alta probabilità di errore dovuta alla digitazione degli stessi. Per questo si è reso necessario un sistema di codifica adatto ai sistemi automatici di rilevamento. La tecnologia dei codici a barre è una di queste. pag. 9 I codici a barre si sono imposti nel tempo come la tecnologia vincente nel settore dell'Identificazione Automatica e per tale motivo ha trovato impiego in tutti i principali settori dell'industria e del commercio. Un sistema di identificazione basato su codici a barre deve tenere conto di quattro caratteristiche fondamentali: o Automazione – mediante l'utilizzo di lettori, decodificatori e scanner industriali. Essi danno la possibilità di leggere il codice a barre in modo automatico e senza la presenza dell'operatore. Ciò permette la costruzione di linee automatiche o robotizzate. o Attendibilità – i codici a barre si sono rivelati uno dei sistemi più attendibili grazie all'uso di due parametri: una cifra di controllo e un numero fisso di cifre. o Precisione – da studi e ricerche presso Università americane si è constatato che si può verificare un errore di lettura ogni 4.4 milioni di caratteri. o Velocità – l'acquisizione dei dati avviene più velocemente di quella fatta manualmente. Grazie ai codici a barre è possibile identificare e inventariare merci di qualsiasi genere tramite il semplice passaggio di dispositivi ottici. 2.3 Gli standard più diffusi La standardizzazione dei codici a barre è stata e continua ad essere essenziale per la crescita e la diffusione di questa tecnologia, consentendo ai fornitori di produrre etichette, stampanti, scanner, unità di controllo ed interi sistemi che possono interagire tra di loro in un ambiente aperto. Le diverse logiche di codifiche dettate da diverse esigenze applicative ha portato alla creazione di diversi tipi di codici a barre, alcuni ampiamente diffusi, altri limitati a precisi settori, altri ancora solo per determinati paesi. Agli inizi sono state proposte diverse tecniche di codifica, alcune sono quasi completamente sparite dall'uso pratico, mentre altre si sono evolute nel tempo. Attualmente solo una decina di codifiche sono usate. A seconda della codifica utilizzata i codici a barre possono codificare solo dati numerici, oppure tutto o parte dell'insieme di caratteri ASCII. In genere sotto i codici a barre sono presenti anche i caratteri che essi rappresentano, rendendo possibile all'operatore umano la lettura senza scanner ottici. pag. 10 2.3.1 Codice EAN È il codice più utilizzato per la codifica dei prodotti. Ne esistono due versioni: EAN-13 e EAN-8, entrambe rappresentano un codice esclusivamente numerico a lunghezza fissa: 13 caratteri per il primo e 8 per il secondo. Il formato è leggibile in entrambe le direzioni, ed è compatibile con il sistema UPC. È usato per la marcatura dei prodotti destinati alla vendita al dettaglio. Figura 2.2. Esempio di codice EAN-13 È un codice estremamente affidabile e segue il seguente schema: le prime due cifre identificano il paese dove è stata richiesta la codifica (ad esempio 80 è riservato all'Italia), le successive cinque cifre identificano il produttore (nell'esempio di figura 2.4 sono le cifre "12345"), mentre le ulteriori cinque cifre identificano il prodotto all'interno dell'azienda (nell'esempio sono "67890"). L'ultima cifra è il codice di controllo che viene calcolato automaticamente mediante l'algoritmo del codice stesso. 2.3.2 Codice UPC Compatibile con il codice EAN, rappresenta il codice numerico di ogni articolo soggetto alle norme UPC (Universal Product Code) in uso negli Stati Uniti. Un codice UPC è un numero di 12 cifre. Figura 2.3. Esempio di codice UPC pag. 11 2.4 La stampa I codici a barre possono essere prodotti in molti modi: con stampanti laser o a getto d'inchiostro, per marcatura diretta, o più semplicemente prestampando delle etichette da incollare successivamente al prodotto portatore. È di fondamentale importanza una stampa precisa, perché da essa dipende il successo della lettura del codice a barre. Esistono alcune regole generali da rispettare durante la stampa, al fine di non avere problemi durante la lettura. Le dimensioni ideali di riferimento sono basate su rapporti proporzionali ben definiti (fattori di ingrandimento). Per ogni fattore di ingrandimento esistono tolleranze accettabili. Le dimensioni minime suggerite per l'EAN-13 sono di 29.8mm per 20.7mm. È indispensabile non usare colori ombreggianti e materiali riflettenti (come l'alluminio). Occorre poi stampare il codice all'interno dei margini: se decentrata ne potrebbe conseguire una perdita di informazioni. Figura 2.4. Applicazione non corretta del barcode. 2.5 Tecnologie di lettori Dopo che il codice a barre è stato stampato si presenta la necessità di leggerlo con sistemi automatici. I dispositivi destinati allo scopo sono denominati lettori o scanner, e ne esistono di sofisticati e avanzati. Che siano portatili, con memoria o wireless, avranno il semplice compito di leggere il codice e di trasformarlo in un numero. È necessario che i lettori siano in grado di decodificare correttamente e velocemente i codici applicati sugli oggetti, considerando che un errore di identificazione potrebbe creare situazioni problematiche. pag. 12 2.5.1 Scanner a laser Nella forma più semplice il dispositivo si presenta come una pistola che l'operatore punta e allinea sul codice a barre che intende leggere. Alla pressione del grilletto lo scanner emette un raggio laser che, opportunamente deflesso, percorre tutta l'ampiezza del codice e ne permette la lettura. Gli scanner laser effettuano molte letture per migliorare l'affidabilità del sistema e ridurre così la possibilità di errori nella decodifica. Figura 2.5. Modalità di lettura di uno scanner laser. Il dispositivo è normalmente costituito da tre unità funzionali: una sorgente di luce fissa (normalmente un diodo laser), un sistema ottico di prismi rotanti e/o a specchio oscillante che servono a deflettere il fascio laser emesso dal diodo e un fotorivelatore che raccoglie la luce riflessa e traduce l'intensità della stessa in un segnale elettrico che può essere successivamente interpretato e tradotto. Lo scanner laser converte quindi l'intensità luminosa in un segnale elettrico avente fluttuazioni di ampiezza correlate alla riflettenza della superficie del simbolo, e che quindi potrà essere elaborata per estrarre l'informazione desiderata. Figura 2.6. Segnale elettrico corrispondente ad un codice a barre. pag. 13 2.6 Trasmissione dei dati La scelta della porta di comunicazione per l'invio del codice scansionato tra il dispositivo di lettura ed il terminale permette di stabilire in modo definitivo i requisiti hardware che il progetto deve possedere. Sono disponibili diverse interfacce e ciascuna possiede le proprie caratteristiche. I moderni lettori di codici a barre sono normalmente disponibili con l'uscita seriale RS232, l'uscita USB o con porta PS2 in modalità Emulazione di tastiera. Ciascuna delle tre opzioni ha caratteristiche diverse e il software dipenderà da quale interfaccia si adotta. 2.7 RFID, tecnologie a confronto In telecomunicazioni ed elettronica con l'acronimo RFID, Radio Frequency Identification, si intende una tecnologia per l'identificazione e/o la memorizzazione dati automatica di oggetti, animali o persone (automatic identifying and data capture, AIDC), basata sulla capacità di memorizzazione di particolari dispositivi elettronici, detti tag o transponder. I tag hanno la capacità di rispondere all'interrogazione a distanza da parte di appositi apparati fissi o portatili, chiamati per semplicità lettori a radiofrequenza (in realtà sono anche scrittori), comunicando le informazioni che essi stessi contengono. In un certo senso possono quindi essere assimilati a sistemi di lettura e/o scrittura senza fili, con svariate applicazioni. 2.7.1 Importanza e diffusione La tecnologia RFID prende origine dalla seconda guerra mondiale e si sviluppa a partire dagli anni Sessanta come derivazione a scopi civili del sistema militare a radiofrequenza di Identification Friend or Foe, ma la sua diffusione è avvenuta principalmente dagli anni Novanta in poi. I transponder IFF inventati in Gran Bretagna nel 1939, basati su una tecnologia analoga, vennero ampiamente utilizzati dagli alleati durante la seconda guerra mondiale per identificare gli aerei individuando i mezzi amici e i nemici. I transponder vengono impiegati ancora oggi sui velivoli, sia per scopi militari che commerciali. Il primo brevetto in cui figura la sigla RFID è stato depositato da Charles Walton nel 1983, brevetto USA 4.384.288, ma in realtà la tecnologia è stata depositata nell’agosto del 1973 con il brevetto USA 3.752.960, e da allora ne sono stati registrati quasi altri 4000 (al 2011). pag. 14 2.7.2 Descrizione fisica Un sistema RFID è costituito da tre elementi fondamentali: o Un apparecchio di lettura e/o scrittura (lettore). o Una o più etichette RFID (o tag o transponder) o Un sistema informativo di gestione dati, per il trasferimento dati da e verso i lettori. L'etichetta RFID può essere attiva, passiva, semi-passiva o semi-attiva. La RFID attiva dispone di: o Una batteria per alimentarla. o Una o più antenne per inviare il segnale di lettura e ricevere le risposte anche su frequenze diverse. o Uno o più transponder/tag RFID. Questi tipi di etichette possono contenere dei sensori. In genere hanno distanze operative maggiori dei tag passivi ed arrivano al massimo a 200 metri. La RFID passiva contiene semplicemente un microchip con un identificativo univoco ed eventuale memoria, privo di alimentazione elettrica, un'antenna ed un materiale che fa da supporto fisico chiamato "substrato" e che viene eccitato o scritto al passaggio di un lettore che emette un segnale radio a frequenze basse o medie o di alcuni gigahertz (sotto le diverse bande usate). La radiofrequenza attiva il microchip e gli fornisce l'energia necessaria a rispondere al lettore, ritrasmettendogli un segnale contenente le informazioni memorizzate nel chip. Il lettore, come abbiamo già detto, può anche scrivere dati sul tag. La RFID semi-passiva è dotata di batteria; questa è usata solo per alimentare il microchip o apparati ausiliari (sensori), ma non per alimentare un trasmettitore, in quanto in trasmissione si comporta come un'etichetta RFID passiva. La RFID semi-attiva, infine, è dotata di batteria che alimenta il chip ed il trasmettitore; per risparmiare energia, l'etichetta RFID è disattivata e viene attivata tramite un ricevitore con la tecnologia dei tag passivi, quindi in assenza di interrogazioni il tag può operare per tempi lunghi. L'elemento principale che caratterizza un sistema RFID è l'etichetta RFID o transponder o tag ed è costituito da: o Un microchip che contiene dati in una memoria (tra cui un numero Univoco universale scritto nel silicio). o Un’antenna. pag. 15 o Un supporto fisico che tiene insieme il chip e l'antenna chiamato "substrato" e che può essere in Mylar, film plastico (PET, PVC, ecc.), carta o altri materiali. o In rari casi viene usata una batteria. Quando l'antenna riceve un segnale, lo trasforma in energia elettrica secondo il principio dell'induzione; questa va ad alimentare il microchip. Il chip così attivato trasmette i dati in esso contenuti tramite l'antenna (circuito di trasmissione del segnale) all'apparato che riceve i dati. In sintesi, un tag RFID è in grado di ricevere e di trasmettere via radiofrequenza le informazioni contenute nel chip ad un transceiver RFID. Il lettore emette un campo elettromagnetico/elettrico che tramite il processo della induzione genera nell'antenna del tag una corrente che alimenta il chip. Il chip così alimentato comunica tutte le sue informazioni che vengono irradiate tramite l'antenna verso il Lettore; quest’ultimo può anche scrivere i dati sul tag. RFID Technology • RFID = Radio Frequency IDentification Antenna Power & Commands Data 01010110 10101011 RFID Reader Figura 2.7. Tecnologia RFID. RFID Tag pag. 16 2.7.3 Tag L'elemento che caratterizza un sistema RFID è il transponder o tag. Il tag è un dispositivo elettronico composto da un chip ed un'antenna RF montati su un "substrato" che ha anche il compito di sostenerli. Il chip, della grandezza di pochi millimetri, è costituito da una memoria non volatile ed un codice in genere univoco, che viene trasmesso tramite l'antenna RF (la spira risonante o circuito di trasmissione del segnale wireless) all'apparato lettore, il quale leggerà i dati ricevuti o li aggiornerà. Nei tag passivi, il lettore emette un campo elettromagnetico o elettrico - a seconda delle frequenze - che tramite induzione genera nell'avvolgimento elicoidale del tag una tensione che a sua volta alimenta il chip. Il chip così attivato comunica tutte le sue informazioni irradiandole tramite l'avvolgimento verso il Lettore. I tag attivi invece sono alimentati da una piccola batteria interna (RFID attivi). Gli RFID si possono realizzare in tantissimi formati: inseriti in etichette simili a quelle utilizzate nei capi di abbigliamento, oppure sotto forma di adesivi da applicare sulle confezioni di cartone dei prodotti, o all'interno di tessere formato carta di credito. Per estrarre le informazioni contenute nell'etichetta è necessario un lettore fisso o portatile. Il vantaggio offerto da questo tipo di tecnologia rispetto ai sistemi di identificazione attualmente più utilizzati (come i codici a barre e lettori a banda magnetica), è che il lettore non deve necessariamente avere la visibilità ottica dell'etichetta; inoltre il funzionamento è estremamente veloce, in quanto la lettura avviene in circa 1 decimo di secondo. Esistono numerosi tipi di tag RFID, alcuni dei quali normati da standard ISO e bande di frequenza operative ben definite, di cui le principali sono quelle indicate sotto: o 125/134 kHz – LF, Low Frequencies, valida in tutto il mondo. o 13,56 MHz – HF, High Frequencies, valida in tutto il mondo. o 433 MHz – UHF, Ultra High Frequencies bassa, solo per tag Attivi, solo in Europa. o 860-960 MHz – UHF, Ultra High Frequencies media, a seconda dei continenti che hanno potenze massime e bande di frequenza diverse. o 2,4 GHz – UHF Alta, principalmente per attivi, anche se esistono anche tag passivi, in tutto il mondo. pag. 17 o 5,8 GHz – SHF Super High Frequencies, solo tag attivi, esempio è il tag attivo "Telepass" molto diffuso nelle auto in Italia per l'accesso automatico alle Autostrade a pagamento. o > 5,8 GHz – UWB Ultra Wide Band (3.1 GHz-10.6 GHz), solo tag attivi. I tag 125 kHz e 13,56 MHz sono previsti dalle norme ISO come passivi quindi senza batterie, mentre tra i tag RFID UHF e Ultrawide Band ne esistono di attivi, semi-attivi e di passivi. I tag attivi sono alimentati da batterie; i tag semiattivi sono alimentati da batterie solo per mantenere attiva la parte circuitale interna, mentre per l'irradiazione utilizzano una parte dell'energia ricevuta dall'onda radio che trasmette e informazioni. Infine i tag passivi non hanno una fonte di alimentazione interna, ma traggono l'energia dall'onda radio inviata dal lettore che li interroga per attivarsi e ritrasmettere i dati. RFID Tag Features LF 125 kHz HF 13,56 MHz UHF 850-950 MHz MW 2.54 GHz Read range (passive tag) 0.5 m 1 – 1.5 m 3m 5 – 10 m Data rate scarce good high very high good fair scarce poor very large large medium small access control, animal tracking access control, object tracking pallet and container tracking, electronic fee collection supply chain, electronic fee collection Read capability metals/liquids Size Typical applications Figura 2.8. Tipi di tag RFID. pag. 18 2.7.3.1 Modalità read-only e read/write La modalità read-only consente di utilizzare la tecnologia RFID in sostituzione del codice a barre sfruttando i seguenti vantaggi: o Affidabilità della lettura. o Eliminazione della necessità di "vedere" l'etichetta (le etichette radio possono essere contenute all'interno dei prodotti ed essere lette anche in più esemplari contemporaneamente). o Capacità di lavorare in ambienti contaminati e sporchi. o Capacità di resistere, con opportune protezioni, all'aggressione di agenti chimici e ambientali e di poter operare immerso in un fluido dentro l'oggetto che si vuole identificare, oppure all'interno di un altro contenitore (purché non completamente metallico). o Possibilità di leggere, nello stesso contenitore, il codice di decine o centinaia di etichette in un lasso temporale di pochi secondi, e di trasmetterlo al sistema informativo di gestione. I tag dotati di memorie non volatili (qualche kilobyte) possono contenere informazioni molto articolate sull'oggetto cui sono associate. La modalità read/write permette non solo una trasmissione di informazioni ma un loro aggiornamento sul chip. Il tag diventa un sistema di identificazione che può tenere traccia della storia di un prodotto fin dalla fase di lavorazione ed essere poi utilizzata in modo interattivo lungo tutta la filiera fino alla distribuzione al dettaglio e in alcuni casi anche fino all’arrivo al consumatore. 2.7.3.2 Vantaggi rispetto a codici a barre e bande magnetiche La tecnologia RFID presenta alcuni semplici vantaggi rispetto alle tradizionali tecnologie dei codici a barre e delle bande magnetiche: o L’oggetto non deve essere a contatto del lettore per essere decodificato come le bande magnetiche. o Non deve essere visibile per essere letto come per i codici a barre. o Si possono anche aggiungere informazioni sui chip in funzione della tipologia del chip: Read Only: si possono solo leggere le informazioni contenute; Write Once, Read Many: si possono scrivere nel chip le informazioni una sola volta, ma leggerle un numero illimitato di volte; Read and Write: si possono leggere e memorizzare informazioni per un numero limitato ma piuttosto grande di volte. o L'identificazione e la verifica avvengono in 1/10 di secondo. o La comunicazione può essere in chiaro o cifrata. pag. 19 2.7.4 Applicazioni RFID Le soluzioni su tag 13,56 MHz trovano applicazioni in: o standard ISO 15693 fino ad 1m, per la tracciabilità (alimentare, di prodotti vari, ecc). o standard ISO 14443 (ad alta sicurezza), fino a 10 cm, per carte bancarie, tessere, documenti di identità elettronici, titoli di viaggio elettronici, sistemi di bigliettazione elettronica per metropolitane, treni, autobus, moneta elettronica per macchine distributrici di prodotti alimentari, ecc. o le soluzioni con tag UHF ISO 18000 fino a circa 10 m, sono dedicate alla logistica d’azienda. o le soluzioni con tag 2,4 GHz per la mobilità (Telepass) e per gli interporti. 2.7.4.1 Logistica magazzini Identificare ogni contenitore e ogni scaffale di magazzino con tag riduce gli errori nei prelievi e fornisce una identificazione certa dell'item (in funzione delle entità controllate si parla di Item Tagging, ovvero oggetto unico o Box Tagging). Non è necessario aprire gli imballaggi per verificare il contenuto cercando il codice a barre, così come non è più necessario effettuare il conteggio manuale per la verifica dell'inventario fisico; con una serie di scansioni a distanza è possibile identificare e verificare la presenza di specifici oggetti in magazzino. Infatti, questo sistema permette di leggere contemporaneamente più etichette (tag), in generale fino a 100. Questa tecnologia permette di conoscere in tempo reale le giacenze di magazzino e di riordinare i capi esauriti con un click. 2.7.4.2 Antitaccheggio Il primo aiuto tecnologico, oggi largamente utilizzato su scala mondiale, è arrivato dalla EAS (Electronic Article Surveillance). Mediante l'applicazione di un piccolo tag chipless (senza chip) agli oggetti in vendita, un negozio può rilevare un eventuale transito non autorizzato di un articolo attraverso un varco. Il varco, composto da antenna, è collegato ad un dispositivo di segnalazione acustica e visiva. pag. 20 Capitolo 3 Generalità sulle reti 3.1 Classificazioni Un insieme di computer messi in grado di comunicare e condividere risorse hardware e software costituisce una rete dati. Vi sono vari modi di classificazione di una rete, anche in dipendenza dell'area geografica ricoperta; si utilizzano dunque i seguenti acronimi: o PAN – Personal Area Network, sono essenzialmente reti di piccole dimensioni (una stanza). o LAN – Local Area Network, sono reti che possono coprire un’area limitata, ad esempio una proprietà privata, come un edificio, un complesso industriale, ecc. o CAN – Campus Area Network, sono reti di dimensioni maggiori di una LAN, che coprono un’area di qualche edificio. o MAN – Metropolitan Area Network, sono reti che collegano più computer e/o delle LAN e possono ricoprire un'area metropolitana. o WAN – Wide Area Network, sono reti che coprono intere regioni o nazioni. o GAN – Global Area Network, sono realizzate dall’unione di più reti WAN. A seconda dell’architettura delle reti è possibile distinguere tra varie topologie: o A BUS: In questa configurazione vi è un solo cavo (bus) che collega in parallelo tutti i terminali di una LAN. Dato che i terminali ricevono lo stesso segnale, un’interruzione o un cortocircuito in un punto qualsiasi del cavo coassiale provoca l’interruzione di tutta la rete. pag. 21 o AD ANELLO: questa topologia prevede un solo cavo come quella a bus, ma i computer in questo caso sono connessi in serie, formando così un percorso chiuso. La comunicazione tra i terminali avviene in modo che una stazione riceve i dati da quella precedente e li invia a quella successiva: se questa non è la stazione terminale, la precedente provvederà ad inviarli alla postazione seguente, finché il dato non avrà raggiunto il destinatario finale. o A STELLA: in questo tipo di rete vi è un computer centrale (server) che ha il compito di smistare i dati ai vari client interconnessi. Ciò può avvenire tramite un hub, operando solo a livello fisico per rigenerare i dati, oppure operando sia a livello fisico sia a livello data link, tramite uno switch, in grado di analizzare e filtrare i frame in transito. Fisicamente tale rete presenta tanti cavi quanti sono i client connessi al server centrale. Questo collegamento garantisce buona affidabilità; infatti, se si venisse a creare un’interruzione in un punto qualsiasi del cavo, ciò non comprometterebbe la caduta della linea nelle altre stazioni. Per questi motivi esso è utilizzato per il cablaggio delle reti LAN Ethernet. Figura 3.1. Tipologia di reti. pag. 22 3.2 Il wireless Il termine wireless (dall'inglese senza fili) indica una comunicazione tra dispositivi elettronici che non fa uso di cavi. I sistemi tradizionali sono invece detti wired in quanto si basano su connessioni cablate. Generalmente il wireless utilizza onde radio a bassa potenza; tuttavia comprende anche i dispositivi, meno diffusi, che sfruttano la radiazione infrarossa o il laser. La comunicazione e i sistemi wireless trovano diretta applicazione nelle reti wireless di telecomunicazioni fisse e mobili e in generale nelle radiocomunicazioni. Esistono diversi gruppi di reti wireless, che si differenziano tra loro non solo per la velocità di trasmissione dati, ma anche per l'uso per il quale sono state create: o PAN wireless: tecnologia ad onde radio che permette la connessione tra portatili, PDA, cellulari, lettori MP3 e macchine fotografiche, rendendo semplice la sincronizzazione di dati, fotografie, musiche ed altri contenuti. Le PAN (Personal Area Network) hanno un raggio d'azione tipicamente limitato a pochi metri di distanza. Di questa categoria fa parte il Bluetooth. o LAN wireless: applicazione di maggior rilievo che consente la connettività ad una LAN cablata, utilizzando dispositivi detti punti d'accesso (o semplicemente AP). Il suo raggio di copertura in campo aperto arriva fino a 400 metri. o MAN wireless: è un campo di applicazione del Broadband Wireless o Wireless Local Loop che consente la distribuzione di dati come internet, telefonia, ecc, su un agglomerato urbano. o WAN wireless: nella categoria delle Wide Area Network fa parte il dominio che prevede la diffusione delle applicazioni previste sia per le reti cablate (LAN) che per le MAN, ma con copertura totale, anziché localizzata in prossimità dei punti d'accesso. A questa categoria appartiene per esempio la telefonia GPRS, EDGE, UMTS. pag. 23 3.2.1 Caratteristiche tecniche e architettura La rete Wi-Fi è una rete di telecomunicazioni paragonabile ad una rete a copertura cellulare a piccola scala (locale); può essere interconnessa con la rete Internet tramite dispositivi di ricetrasmissione radio quali gli access point (AP) in sostituzione delle tradizionali stazioni radio base delle reti radiomobili (modello di architettura client-server). Dato che la potenza di trasmissione di un access point è limitata da normative di sicurezza per il rischio elettromagnetico (100mW), per aumentarne il range di connettività (100m circa) si usano generalmente più access point - e relative celle di copertura - collegati tra loro tramite cablaggio in rete locale. In tal modo si può coprire totalmente una determinata area. La parte radio o interfaccia radio Access Point-Utente costituisce la rete di accesso, mentre la LAN cablata che collega tutti gli access point è la rete di trasporto. Le celle di copertura degli AP sono spesso parzialmente sovrapposte per creare un'area di copertura totale del segnale detta ESS (Extended Service Set) evitando buchi di copertura. La parte cablata è generalmente una rete Ethernet che può essere a bus condiviso oppure commutata o switchata. I singoli AP hanno funzionalità di bridge ed hanno il compito di inviare in broadcast l'SSID che identifica le reti che stanno servendo, alle stazioni ricetrasmittenti wireless nel loro raggio di copertura. L'insieme delle stazioni servite dagli AP è detto BSS (Basic Service Set). La rete totale così ottenuta può essere interallacciata alla rete Internet tramite un router usufruendo dei servizi di internetworking. Si possono avere architetture completamente wireless senza alcun access point (modello di architettura peer-to-peer) con ciascuna stazione base che riceve/trasmette direttamente da o verso altre stazioni (IBSS Indipendent Basic Service Set o rete ad-hoc mobile). Le reti Wi-Fi sono infrastrutture relativamente poco costose e a rapida attivazione e permettono di realizzare sistemi flessibili per la trasmissione di dati usando frequenze radio, estendendo o collegando reti esistenti o creandone di nuove. pag. 24 3.2.2 Le classi Esistono varie classi del wireless con prestazioni diverse (come specificato meglio nei dettagli dello standard IEEE802.11). Le principali sono: o Classe b a 11 Mb/s; opera a 2,4 GHz. o Classe g a 54 Mb/s; opera a 2,4 GHz. o Classe n a 300Mb/s; frequenze operative 2,4/5 GHz (dual band). Figura 3.2. Rappresentazione grafica dei canali WiFi nella banda di 2.4 GHZ. Le WLAN a standard IEEE 802.11b e 802.11g dividono la banda totale (83,5MHz) in 14 canali radio da 22 MHz ciascuno. I canali adiacenti si sovrappongono, perché le loro frequenze centrali sono separate solamente da 5 MHz. I due gruppi di canali 1, 6, 11 e 2, 7, 12 non si sovrappongono fra loro e vengono utilizzati negli ambienti con altre reti wireless. In Europa possono essere impiegati al massimo 13 canali. Gli unici canali utilizzabili in tutto il mondo sono il 10 e l’11. Le WLAN operano in una banda radio che non è soggetta a licenza (ISM), quindi chiunque la utilizzi non deve recare disturbo ad altri e per tale motivo si devono utilizzare particolari tecniche di trasmissione chiamate Spread Spectrum (spettro espanso). 3.2.3 Tecniche di trasmissione Spread Spectrum Un po’ di storia L'espansione di spettro mediante il salto di frequenza (frequency-hopping spread spectrum) è stata inventata nel giugno 1901 da Nikola Tesla . L'idea gli venne dopo aver presentato il primo sommergibile al mondo radiocomandato, nel 1898, quando fu chiaro che i segnali radio che controllavano il battello dovevano essere sicuri dall'essere “disturbati, intercettati o messi in interferenza in qualsiasi modo”. pag. 25 Questa tecnica fu poi brevettata nei primi anni '40 dall’attrice australiana Hedy Lamarr. Prima di sfuggire al nazismo tedesco, l'attrice si sposò con il mercante di armi austriaco Fritz Mandl, che le insegnò i segreti per bloccare i segnali radio per il controllo dei siluri. Lamarr intuì che il controllo remoto radio dei siluri era un’area fondamentale di ricerca per i venditori d’armi. Quando scoprì che il marito vendeva armi ad Hitler, fuggì a Hollywood per proseguire la sua carriera da attrice. Qui, nel tempo libero, inventò la tecnica del frequency hopping per aiutare gli Alleati: il suo sistema utilizzava 88 frequenze (corrispondenti al numero dei tasti del pianoforte). Insieme al compositore George Antheil, ottenne il brevetto per la sua invenzione, ma non venne presa in considerazione dalle forze armate statunitensi. Le tecniche a salto di frequenza furono usate per la prima volta dalle navi americane durante la Crisi missilistica cubana. Ci vollero anni perché la tecnologia spread spectrum diventasse commercialmente disponibile. Al giorno d’oggi, le tecnologie spread spectrum sono utilizzate nei telefoni mobili, nelle LAN wireless a banda larga e nei dispositivi su bande ISM senza licenza. Hedy Lamarr morì nei primi anni 2000, quando il mercato LAN wireless stava iniziando ad espandersi. 3.2.3.1 Descrizione Con il termine Spread Spectrum si indica una tecnica di trasmissione digitale che distribuisce lo spettro in potenza di un segnale contenente informazione su una banda molto più larga rispetto a quella del segnale originario (R), in modo tale che la potenza per unità di frequenza (Watt per Hz) del segnale inviato sul canale sia molto piccola, paragonabile a quella del rumore bianco. In ricezione si esegue il processo inverso, ovvero quello di despreading, moltiplicando il segnale in ricezione per uno di despreading analogo a quello usato in trasmissione; quindi il segnale in questione viene riportato nella sua originaria banda stretta. Lo scopo principale è migliorare il rapporto segnale/rumore eliminando il maggior numero di interferenze in modo da consentire l'utilizzo contemporaneo della stessa gamma di frequenze a più utenti; altro scopo è quello di mimetizzare il segnale radio trasmesso abbassandone la potenza specifica e portandolo come già detto a confondersi con il rumore radio di fondo, in modo da sfuggire al rilevamento da parte delle stazioni di intercettazione radio. pag. 26 Figura 3.3. Spread Spectrum e soppressione delle interferenze. Principalmente si adottano due metodi per ottenere uno spettro diffuso: il frequency hopping e il direct sequence. 3.2.3.2 Frequency hopping Questo metodo lavora modulando il segnale su una portante che si sposta “saltellando” di frequenza in frequenza più volte nel tempo, su di un’ampia porzione di banda, secondo un ben definito pattern (hopping pattern). Questa tecnica di modulazione ha il pregio di ridurre le interferenze poiché un segnale interferente proveniente da un sistema a banda stretta causerà problemi solo nel caso in cui stia avvenendo una trasmissione proprio a quella frequenza ed in quel preciso momento. Caso tutto sommato relativamente poco frequente, cosicché il sistema di modulazione risulta poco affetto da errori. pag. 27 Figura 3.4. Andamento temporale di FSSS. 3.2.3.3 Direct sequence Questa tecnica di modulazione, come la precedente, ha come scopo la diffusione dello spettro del segnale. Lo scopo viene qui raggiunto combinando il segnale da trasmettere con un segnale con un più alto bit rate, chiamato chipping code. Il chipping code è composto da una serie di bit, chiamati chip, la cui combinazione col segnale permette di ottenere il risultato desiderato, cioè uno spettro diffuso. Il meccanismo è abbastanza semplice: viene inizialmente assegnato un chipping code per rappresentare rispettivamente lo zero e l’uno e quando si trasmette il segnale in realtà viene inviato il codice corrispondente. Se per esempio assegniamo allo ZERO il codice 11101011001 ed all’UNO il codice 00010100110, la trasmissione della sequenza 011 diviene 111010110010001010011000010100110; in questo modo il metodo DSSS per ogni bit da spedire non fa altro che inviare una stringa di bit, corrispondente al chipping code. Tipicamente il numero di chip varia tra 10 e 20; inoltre, tanto più è elevato il loro numero nel chipping code, tanto più aumenta la resistenza del segnale alle interferenze. pag. 28 Capitolo 4 Progettazione e realizzazione del prototipo 4.1 Caratteristiche per gli utenti finali Gli utenti che si interfacceranno e usufruiranno del sistema in esame interagiranno con esso sfruttandone le funzionalità in base al ruolo ricoperto nell'azienda. Nella progettazione si sono tenuti in considerazione le esigenze del magazziniere e del responsabile azienda. o Il magazziniere gestisce fisicamente la logistica del magazzino, caricando e scaricando i prodotti. Sarà equipaggiato con un dispositivo portatile per la lettura dei codici a barre, in modo da poter reperire le informazioni desiderate in modo semplice. Il suo compito sarà di passare in successione i prodotti in giacenza allo scopo di inventariarli: leggendo il codice a barre ed introducendo sulla tastiera la quantità del prodotto. o Il responsabile azienda come coordinatore dei diversi reparti ha anche la responsabilità dell'operato svolto dai magazzinieri. Dovrà quindi avere a disposizione strumenti necessari per il reperimento delle informazioni riguardanti le giacenze in magazzino e per analizzare i dati riguardanti l'andamento aziendale. 4.2 Funzioni principali del sistema L'idea di base su cui si fonda il progetto è quello di sviluppare un dispositivo portatile in grado di effettuare la lettura dei codici a barre che, con un apposito software, sia in grado di gestire opportunamente i dati raccolti. Originariamente il dispositivo doveva poter effettuare la lettura del codice a barre e comunicare l'informazione ad un database esterno. Si è successivamente preferito integrare il database nel dispositivo stesso e di lasciare la possibilità di farlo comunicare con l'esterno come funzione opzionale. Questo gli consente di non dipendere dalla connessione o dai cavi di rete per poter funzionare e ciò lo rende realmente "portatile". Tale database sarà poi consultabile sia da un display LCD integrato nel dispositivo che da una interfaccia web disponibile dopo averlo connesso in rete. pag. 29 Il dispositivo deve poter soddisfare efficacemente i seguenti compiti: o Verifica degli articoli: si vuole dare la possibilità di interrogare il database ricavandone così informazioni per effettuare molteplici operazioni quali controlli da parte del magazziniere circa articoli prelevati o riferiti ad un determinato ordine di spedizione, controlli degli articoli in entrata ed in uscita dal magazzino, controlli giacenze da parte del responsabile dell'azienda e controlli riguardanti lo stato dei diversi articoli. o Movimentazione merci: il sistema individua l'ingresso e l'uscita delle merci durante la lettura del codice a barre effettuato da un operatore/magazziniere. Tali informazioni saranno poi aggiunte o andranno ad aggiornare l'inventario che verrà immediatamente reso disponibile per la consultazione. 4.3 Caratteristiche dell'hardware Nella progettazione dello schema circuitale del prototipo si è tenuto in considerazione principalmente di tre proprietà caratterizzanti: o Mobilità: è la prerogativa più importante tra quelle individuate. Essa si riflette sulla necessità di dotare il dispositivo di una batteria per l'alimentazione. Rimuovendo ogni vincolo legato alla staticità della posizione si ottiene così una libertà assoluta rispetto alla dimensione spaziale, rendendolo così utilizzabile ovunque. o Modularità: lo schema del circuito di implementazione del dispositivo è stato pensato prevedendo di realizzare un'espansione di una piattaforma preesistente, così da consentire lo sviluppo di nuove funzionalità attraverso l'aggiunta di moduli supplementari che, connettendosi a quello base, permettono di sfruttare le proprietà di cui è portatrice. Ciò ha avuto un impatto anche a livello economico non facendo lievitare eccessivamente i costi e riducendo notevolmente la complessità del lavoro. o Flessibilità: il fatto che sia possibile utilizzarlo ovunque e di ampliarne le funzionalità con moduli aggiuntivi lo rende flessibile. Questo comporta che nella prospettiva di uno sviluppo futuro sarà possibile fornire nuovi contributi al progetto. L'hardware presentato è l'insieme dei componenti utilizzati nella realizzazione del dispositivo e provvede a soddisfare le esigenze sopraelencate. pag. 30 4.4 Componenti Il processo di individuazione e selezione dei componenti da assemblare per comporre il prototipo è stato influenzato dalla ricerca di particolari elementi qualitativamente idonei e al contempo in grado di mantenere bassi i costi. La soluzione prevista per questo progetto consiste nella realizzazione di uno shield per Arduino YUN. Arduino ha una struttura modulare: sono infatti disponibili in commercio numerose schede che integrano hardware per svariati utilizzi ed è possibile collegarli semplicemente impilandoli l'uno all'altro. Nel nostro caso non esisteva uno shield adatto alle nostre specifiche esigenze ed è stato necessario realizzarne uno per implementare una interfaccia adatta a connettere un lettore di codici a barre, un tastierino numerico e un display LCD. Il prototipo deve inoltre essere equipaggiato con una batteria da 9V per l'alimentazione esterna. Figura 4.1. Blocchi fondamentali del sistema pag. 31 4.4.1 Arduino 4.4.1.1 Introduzione alla scheda Arduino è una scheda elettronica open source di dimensioni ridotte che fornisce all'utente finale una piattaforma hardware e software per l'implementazione semplificata dei prototipi. Il concetto open fa sì che le schede vengano costantemente migliorate dalla grande comunità di sviluppatori che seguono il progetto. Il basso costo è sicuramente uno dei fattori che ha reso questa scheda un progetto di successo così come la ricca documentazione disponibile e la facilità d'uso che l'ha resa accessibile a tutti. Figura 4.2. Visione dall'alto delle schede Arduino UNO e Arduino YUN Ad oggi sono disponibili 25 diversi modelli di schede elettroniche ufficiali e riconosciute dal team Arduino, adattati per ogni esigenza. Quelle standard sono Arduino UNO e Arduino YUN. Quest'ultima rappresenta il top della gamma. Tutte queste schede condividono alcune specifiche comuni. Il cuore di tutte le schede è un microcontrollore della ATMEL, di cui può variare il modello in funzione della scheda utilizzata. Arduino può gestire segnali da molteplici sensori e gestire attuatori di vario genere tramite ingressi e uscite digitali e analogiche. Figura 4.3. Interazione con il mondo reale pag. 32 Arduino viene fornito di un semplice ambiente di sviluppo comune a tutte le schede che consiste in un IDE cross platform, cioè disponibile in tutti i sistemi operativi più diffusi e che rende facilmente programmabile il microcontrollore. Infatti se prima dell'avvento di Arduino programmare un microcontrollore significava scrivere codice Assembly o C, ora grazie al linguaggio di programmazione utilizzato nell'IDE di Arduino, Wiring, un linguaggio simil-C, anche chi non ha una conoscenza dell'elettronica avanzata può programmare un microcontrollore. I programmi di Arduino sono chiamati sketch. Grazie ad essi la scrittura dei comandi per le operazioni di input/output sono enormemente semplificate. 4.4.1.2 Caratteristiche tecniche di Arduino YUN In questa applicazione è stato scelto Arduino YUN. Il microcontrollore di cui è dotato è l'ATmega32u4. Esso possiede 32Kb di memoria flash dove caricare il programma (di cui 4Kb già utilizzati per il bootloader), 2.5Kb di SRAM utilizzata per le variabili e 1Kb di EEPROM per salvare dati e parametri di configurazioni utili per il nostro programma in modo permanente. Arduino YUN si distingue dagli altri modelli perché può comunicare con la distribuzione Linux basata su OpenWRT chiamata Linino, in grado di assicurare tempi di startup rapidi, installata sul processore dell'Atheros AR9331 e offre così un potente computer connesso con il microcontrollore di Arduino in grado di fornire un web server e un database SQL dove immagazzinare i dati. È inoltre completo di Ethernet, Wi-Fi, slot MicroSD e 20 pin I/O disponibili. Figura 4.4. Disposizione dei componenti dell'Arduino YUN. pag. 33 Caratteristiche tecniche del microcontrollore AVR Arduino Microcontroller ATmega32u4 Operating Voltage 5V Input Voltage 5V Digital I/O Pins 20 PWM Channels 7 Analog Input Channels 12 DC Current per I/O Pin 40 mA DC Current for 3.3V Pin 50 mA Flash Memory 32 Kb SRAM 2.5 Kb EEPROM 1 Kb Clock Speed 16 MHz Caratteristiche tecniche del microprocessore Linux Processor Atheros AR9331 Architecture MIPS @400MHz Operating Voltage 3.3V Ethernet IEEE 802.3 10/100/Mbit/s Wi-Fi IEEE 802.11b/g/n USB Type-A 2.0 Host/Device Card Reader Micro-Sd only RAM 64 MB DDR2 Flash Memory 16MB PoE compatible 802.3af card support pag. 34 4.4.1.3 Alimentazione Arduino YUN può essere alimentato con 5V da un connettore micro-USB o da un'alimentazione esterna che può essere fornita da una batteria al pin Vin. La scheda non dispone di un regolatore di tensione, per cui tensioni più alte potrebbero danneggiarla. 4.4.1.4 Input e Output I principali pin del microcontrollore sono disposti attraverso connettori posti ai bordi della scheda. Si dispone in totale di 20 pin input/output digitali, di cui 7 possono essere utilizzati come output PWM e 12 come input analogici. Ciascuno di questi pin può essere pilotato in maniera indipendente dal software. La tensione di uscita di ogni output è di 5V ed è in grado di lavorare al massimo con 40mA. Ogni pin ha inoltre la possibilità di abilitare internamente resistenze di pull-up di 20/50kOhms (disconnesse di default). Alcuni di questi pin hanno comportamenti specifici: o I pin 0 (Rx) e 1 (Tx) possono essere utilizzati per la comunicazione seriale. o I pin 0, 1, 2, 3 e 7 possono essere configurati come trigger per eventi esterni, come ad esempio il rilevamento di un fronte di salita o di discesa di un segnale di ingresso. o I pin 3, 5, 6, 9, 10, 11 e 13 possono essere configurati per generare segnali PWM con risoluzione di 8 bit. Tramite un filtro RC è possibile ottenere tensioni continue di valore variabile. o Il pin 13 è connesso a un LED interno alla scheda, risulta utile in situazioni di debug. o I pin A0-A5 e A6-A11 (sui pin digitali 4, 6, 8, 9, 10 e 12) sono gli ingressi analogici. Ognuno di questi pin possono essere utilizzati come I/O digitali. Ogni ingresso analogico fornisce 10 bit di risoluzione (cioè 1024 valori differenti). Di default gli ingressi analogici hanno un range che va da massa a 5V, anche se è possibile cambiare l'estremità superiore con il pin AREF. Non è possibile per l'Atheros AR9331 accedere direttamente ai pin I/O: tutte le linee sono collegate al microcontrollore. pag. 35 4.4.1.5 Bridge Arduino YUN integra il microcontrollore ATmega32u4 e l'Atheros AR9331 in cui "gira" Lenino, una distribuzione di Linux. Il "Bridge" è una libreria che mette in comunicazione questi due componenti. Figura 4.5. Comunicazione tra ATmega32U4 e Atheros AR9331. Dalla figura 4.5 si nota come la microSD, l'interfaccia Wi-Fi e Ethernet non siano direttamente connesse al microcontrollore; quest'ultimo non ha direttamente accesso se non tramite il microprocessore. Il Bridge consente quindi ad Arduino di interfacciarsi con queste periferiche. pag. 36 4.4.2 Scanner di codici a barre È stato scelto di utilizzare un lettore CCD, Charge-Coupled Device, della Manhattan® (visibile in figura 4.6.) con connettore PS2 e modalità di funzionamento ad emulazione di tastiera, visualizza cioè i dati come se fossero inseriti da tastiera. Il lettore è leggero ed ergonomico. La lettura del codice avviene con il semplice contatto tra l'ottica del lettore ed il codice a barre stesso. Supporta le codifiche più popolari e la tensione di alimentazione è compatibile con le caratteristiche elettriche di Arduino (5V) con un consumo elettrico pari a 130mA. Figura 4.6. Lettore scanner codici a barre CCD - Manhattan® 4.4.2.1 Il protocollo PS2 Il PS2 è un protocollo seriale, sincrono e bidirezionale utilizzato al giorno d'oggi per far comunicare tastiere e mouse con il computer. Il lettore scelto per leggere i codici a barre ha in dotazione un connettore PS2 come quello presente in figura 4.7. Figura 4.7. Porta PS2 a 6-pin Mini-DIN pag. 37 Per semplicità nella trattazione si farà riferimento alla tastiera e ai suoi tasti per indicare il "device" utilizzato, chiarendo che il funzionamento è analogo sia per i mouse e, come nel caso in questione, sia al lettore di codici a barre. Inoltre ci si riferirà ad Arduino con il termine più generale "host". Tutta la comunicazione si basa su un bus formato da due linee bidirezionali: la linea di clock e la linea dati. L'host ha sempre il controllo finale sul bus e può in ogni momento inibire la comunicazione ponendo la linea di clock ad uno stato logico basso. Solo alla tastiera spetta il compito di generare il clock. I dati spediti dalla tastiera sono letti dall'host sul fronte di discesa del clock, al contrario quelli trasmessi dall'host alla tastiera sono letti sul fronte di salita. La frequenza del clock può variare dai 10KHz ai 16.7KHz. Se assumiamo quindi il clock come un'onda quadra e si calcola il periodo della stessa, ci si rende conto che il clock deve rimanere alto per almeno 30 ÷ 50 μs. Questi parametri sono cruciali per evitare conflitti nella trasmissione dati tra l'host e la tastiera. o Modalità della comunicazione dati dall'host alla tastiera: quando l'host vuole trasmettere dei dati deve innanzitutto inibire la comunicazione mettendo a massa il clock per almeno 100 μs, quindi mettere a massa anche la linea dati e rilasciare il clock. Questa sequenza fa capire alla tastiera che sono in arrivo dei dati, e quest'ultima inizia a generare il clock. Tutti i dati sono trasmessi in modo seriale un byte alla volta. Ogni byte viene inserito in un frame di undici bit: uno di start (sempre posto a 0), otto bit di dati (ordinati dal meno significativo al più significativo), un bit di parità e un bit di stop (sempre posto a 1). Figura 4.8. Frame di undici bit dall'host alla tastiera. Alla fine di questo frame l'host si aspetta un acknowledge bit da parte della tastiera per verificare che il dato sia stato correttamente ricevuto da quest'ultima, e quindi rilascia la linea dati. Se l'host non la rilascia dopo l'undicesimo ciclo di clock la tastiera capisce che c'è stato un errore nella comunicazione e continua a generare il clock finché la linea dati non pag. 38 viene rilasciata dall'host. o Modalità della comunicazione dalla tastiera all'host: quando la tastiera vuole inviare un dato, come prima cosa controlla lo stato della linea di clock per verificare che sia in uno stato logico alto. Se non lo è significa che l'host sta inibendo la comunicazione e la tastiera deve quindi bufferizzare i dati da spedire finché la linea di clock non viene rilasciata per almeno 50 μs, passati i quali può procedere all'invio. Per trasmettere i dati la tastiera usa lo stesso formato di undici bit. Figura 4.9. Frame di undici bit dalla tastiera all'host. I codici inviati dalla tastiera vengono detti "scan codes" e indicano qual è tasto che l'utente ha premuto, rilasciato o tenuto premuto. Quando si preme un tasto viene generato un codice chiamato "make code", mentre quando il tasto viene rilasciato viene generato un "break code". La tastiera supporta inoltre una funzionalità di ripetizione tasti detta typematic con un delay pre-ripetizioni e una velocità di ripetizione configurabili. Il make code è composto da un byte con il codice del tasto che rappresenta, mentre il break code è lo stesso byte preceduto però da un altro byte di valore 0xF0. Ad ogni tasto viene associato un'unica coppia make code e break code, in modo che l'host può determinare esattamente cos'é successo e a quale tasto. Bisogna inoltre avere presente che i codici inviati identificano i tasti della tastiera e non i caratteri che essi rappresentano. Sarà quindi compito dell'host tradurre gli scan code ricevuti in codici ASCII. pag. 39 4.4.3 Tastiera Il tastierino è una periferica di input, ed in questo progetto viene utilizzato per introdurre dati numerici nel sistema. Per tali ragioni è stato scelto un tastierino a matrice a 12 pulsanti, 4 righe e 3 colonne, che rappresenta i numeri da 0 a 9, più due pulsanti utili all'utente per poter tornare indietro o confermare l'operazione intrapresa. Figura 4.10. Tastiera numerica 4x3 4.4.3.1 Tastiera a matrice Nella configurazione a matrice si dispongono i tasti secondo N righe e M colonne, in modo che la pressione di un tasto metta in comunicazione la relativa riga con la corrispondente colonna. Figura 4.11. Collegamenti interni di una tastiera a matrice. pag. 40 Esistono vari sistemi per la lettura di una tastiera a matrice. Il più comune consiste nell'inviare ciclicamente un particolare livello logico ad una colonna per volta e controllare successivamente se lo stesso livello si presenta in una delle righe. Quando una riga presenta quel livello logico, e sapendo qual è l'unica colonna attiva in quel momento, si può dedurre quale tasto è stato premuto. Questa continua operazione di lettura e verifica dei tasti prende il nome di Scanning. Il principale vantaggio di questa tecnica consiste nell'adoperare N + M linee di I/O per poter acquisire N x M tasti. Nel caso particolare della tastiera a matrice presente in figura 4.11 i 12 pulsanti possono essere gestiti con 7 linee di I/O. 4.4.4 Display LCD Un'altra modalità per la visualizzazione dei dati è quella che dà l'opportunità a qualsiasi utente di leggere le informazioni riguardo un prodotto direttamente dal dispositivo. Esso è quindi dotato di un piccolo schermo a cristalli liquidi (LCD). Figura 4.12. Display LCD 2x16. 4.4.5 Batteria da 9V Il requisito minimo stabilito era di dotare il dispositivo di un'autonomia di almeno un'ora. Per l'alimentazione esterna della scheda Arduino e dei circuiti logici aggiuntivi è stata quindi scelta una batteria ricaricabile da 9V in grado di erogare 500mAh. Arduino YUN con Wi-Fi abilitato consuma all'incirca 250mA; l'LCD tra i 120mA e i 160mA; 130mA lo scanner. Si arriva così ad una media di 500mA, variabili a seconda dell'utilizzo più o meno frequente dello scanner. Figura 4.13. Batteria da 9V ricaricabile. pag. 41 4.5 Progettazione dello schema elettrico 4.5.1 Circuito di alimentazione Uno dei principali aspetti da tenere in considerazione era di fornire ad Arduino YUN un'alimentazione stabilizzata a 5V. Una soluzione economica per ottenere un'alimentazione di qualità è stato l'impiego di un regolatore di tensione tipo LM7805. Figura 4.14. Stabilizzatore di tensione. pag. 42 4.5.2 Connessione con l'LCD L'LCD scelto è dotato di 16 pin e ha una interfaccia parallela, il che significa che il microcontrollore deve gestire diversi pin contemporaneamente per controllare il display. La tabella di figura 4.15 illustra le funzioni di ogni piedino. Figura 4.15. Funzioni dei singoli pin dell'LCD. Si può notare come il numero di linee di controllo necessarie a pilotare il display sia elevato. Per cui abbiamo scelto di utilizzare la modalità a 4 bit per ridurre il totale di uscite digitali necessarie a sei (quattro per la trasmissione dati, più due linee di controllo). La tipologia dei collegamenti è illustrata in figura 4.16. pag. 43 Figura 4.16. Tipologia di collegamenti tra il display LCD e Arduino. 4.5.3 Tastiera analogica Mentre si era partiti dall'idea di decodificare i tasti del tastierino a matrice utilizzando il sistema di scanning illustrato nel capitolo 4.4.3.1, si è successivamente preferito il controllo analogico. Con questo sistema si utilizza un solo ingresso per decodificare i dodici tasti, a differenza delle sette linee inizialmente previste. Il controllo è completamente analogico e fa uso del convertitore A/D a 10 bit presente in Arduino. Ogni pulsante del tastierino è collegato ad una diversa resistenza, di conseguenza alla pressione di un tasto corrisponde un valore di tensione caratteristico e ben distinto da quella degli altri tasti; questo permette di identificarli univocamente. Il riconoscimento di ogni tasto viene fatto quindi in base al livello di tensione convertito dal modulo A/D. Il circuito con i valori delle resistenze scelte per questo progetto è presente in figura 4.17. pag. 44 Figura 4.17. Rete resistiva per un tastierino 4x3. La massima tensione assunta è pari a 5V, ed essendo il convertitore a 10 bit la conversione avviene mediante “quanti” di valore pari a: Si è quindi proceduto a calcolare le tensioni teoriche e i valori in digitale ad essi corrispondenti per verificare che tali valori siano il più possibile equidistanti tra loro, consentendo una identificazione univoca. La tabella con i valori calcolati è presente in figura 4.18. pag. 45 Figura 4.18. Tabella con i valori di tensione corrispondenti a ogni tasto. 4.5.4 Trigger per il tastierino L'operazione di conversione A/D di Arduino per poter decodificare un tasto è particolarmente onerosa. Occorrono all'incirca 100μs per completare la lettura, e il più delle volte solo per notificare l'assenza di tasti premuti. Si è reso quindi quasi obbligatorio generare un evento per avvisare il microcontrollore della pressione di un tasto, per poi solo in quell'occasione effettuare la lettura del pin analogico per poterlo identificare dagli altri. Dalla tabella di figura 4.18 si può constatare come il più piccolo valore di tensione ottenibile dalla pressione di un pulsante sia di 248mV. Tenendo quindi conto delle tolleranze delle resistenze, si è stabilito un valore di circa 150mV per cui si considera premuto un qualsiasi tasto. Si utilizzerà quindi l'uscita di un comparatore con questa tensione di riferimento per attivare un interrupt, permettendo così ad Arduino di non dover convertire ripetutamente un canale analogico anche in assenza di tasti premuti. Il comparatore scelto in questa applicazione è l'LM311, un integrato molto versabile che fornisce ottime prestazioni per quanto riguarda la precisione della risposta. Può essere alimentato con 5V a singola alimentazione, e questo ha consentito una notevole semplificazione dei circuiti di alimentazione. pag. 46 Figura 4.19. Comparatore LM311. 4.5.5 Interfacciamento con connettore PS2 Per la comunicazione con la porta PS2 del lettore e Arduino è stato utilizzato un adattatore seriale a 9 pin (DB9) come quello presente in figura 4.20. Figura 4.20. Adattatore seriale DB9/PS2. Figura 4.21. Pinout adattatore per PS2 a seriale DB9. pag. 47 4.6 Realizzazione pratica della scheda elettrica 4.6.1 Design L'orientamento seguito durante la fase di sbrogliatura del circuito è stato fortemente influenzato dall'idea di realizzare un dispositivo dalla forma compatta, maneggevole e funzionale. La disposizione dei componenti doveva poter dare risalto all'LCD e avere un accesso ottimale per la digitazione sulla tastiera. A partire da queste motivazioni si è giunti all'idea di realizzare quanto presente in figura 4.22 e 4.23. Figura 4.22. Prospettiva laterale Figura 4.23. Prospettiva frontale pag. 48 4.6.2 Costruzione del PCB Il PCB, Printed Circuit Board, o Circuito Stampato, consiste in un insieme di elementi elettronici ed elettrici collegati opportunamente tramite delle piste conduttive. Un'opportuna foratura della basetta consente di inserire i reofori dei componenti, fissandoli tramite saldature alle piste ed assicurando così un buon aggancio e garantirne la stabilità meccanica. I componenti sono disposti solo su una faccia della basetta, chiamato generalmente lato componenti, mentre l'altro lato viene chiamato lato saldature. Il disegno del circuito è stato fatto su computer usando il software Orcad. Tramite esso è stato rappresentato lo schema elettrico del circuito dal punto di vista funzionale. Gli schemi elettrici sono stati poi sbrogliati curando la disposizione dei componenti secondo il design visto nel capitolo 4.6.1 e stampati su fogli acetati trasparenti. Lo shield è stato realizzato fisicamente su una basetta ramata a doppia faccia, utilizzando un processo fotografico con bromografo a LED ultra-violetti. Successivamente è stato necessario asportare il rame dalla superficie della scheda, utilizzando l'acido cloruro ferrico. Il risultato è di queste operazioni è presente in figura 4.24 Figura 4.24. Circuito stampato del prototipo. pag. 49 4.7 Sviluppo del software 4.7.1 Casi d'uso Per poter sviluppare un software di qualità che rispecchi le esigenze dell'utente finale è necessario raccogliere i requisiti funzionali che si vogliono raggiungere in maniera completa e non ambigua. Ciò viene fatto attraverso i casi d'uso. Figura 4.25. Diagramma dei casi d'uso. o Scarico merci: il magazziniere preleva i prodotti dal magazzino per poterli poi spedire, vendere o utilizzare. Per effettuare questa operazione legge il codice a barre del prodotto in questione e tramite tastiera digita la quantità in uscita. o Carico merci: il magazziniere provvede a ricevere e prelevare gli articoli consegnati dal fornitore. Prima di mettere la merce in giacenza effettua la lettura del codice a barre dei singoli prodotti e tramite l'aiuto della tastiera ne specifica la quantità. o Identificazione prodotto: tramite la lettura del codice a barre di un articolo in magazzino l'operatore ottiene le informazioni ad esso associate, come il nome e la quantità di prodotto in giacenza. o Analisi di mercato: il responsabile dell'azienda usa i dati riguardanti i prodotti in giacenza e la lista di movimenti dei prodotti per analizzare l'andamento aziendale. pag. 50 4.7.1.1 Identificazione merci Figura 4.26. Diagramma di flusso delle operazioni di identificazione del prodotto. 4.7.1.2 Carico merci Figura 4.27. Diagramma di flusso delle operazioni di carico merci. pag. 51 4.7.1.3 Scarico merci Figura 4.28. Diagramma di flusso delle operazioni di scarico merci. 4.7.2 Database 4.7.2.1 Cos'é un database Un database può essere definito come un insieme di dati strettamente correlati, memorizzati su un supporto di memoria di massa, che possono essere manipolati dall'applicazione. È quindi una sorta di versione informatica di un archivio, un luogo dedicato all'organizzazione e alla consultazione delle informazioni. Per usare le informazioni contenute in un database occorre l'utilizzo di un Database Management System (DBMS). Si tratta di una serie di programmi software che consentono di immettere, selezionare e organizzare le informazioni nel database. Esistono diverse modalità tramite le quali un DBMS può implementare queste funzionalità, ma negli anni la tipologia che è risultata di gran lunga più popolare è quella che si basa sul modello dati relazionale. pag. 52 4.7.2.2 Scelta del tipo di database Il primo importante passo per la realizzazione del sistema è stato quello di scegliere l'RDBMS (Relational Database Management System) adatto al compito che avrebbe dovuto svolgere. Si è quindi proceduto a stilare le caratteristiche essenziali che il database avrebbe dovuto possedere. o Leggerezza: requisito fondamentale poiché l'ambiente su cui viene fatto girare ha risorse e spazio limitato. o Buone performance: nel contesto in cui il database viene adoperato le tabelle possono assumere dimensioni importanti. Deve quindi essere in grado di rispondere alle query in tempi ragionevoli. o Funzionalità SQL: si richiede al database di poter gestire della business logic di elevata complessità. È quindi importante che disponga di un ampio set di istruzioni SQL. o Buona documentazione: essenziale per poter rispettare i termini di tempo imposti per lo sviluppo. Delineati i requisiti sopraelencati si è proceduto ad un'analisi comparativa delle funzioni e delle performance di tre database relazionali: MySQL, PostgreSQL e SQLite. Nonostante le prestazioni elevante, la possibilità di inserire grandi quantità di dati e il disporre di una abbondante documentazione, abbiamo infine escluso l'utilizzo di MySQL e PostgreSQL. Si è ritenuto che non fossero una soluzione mirata alle esigenze del prototipo, in quanto le tante funzionalità evolute che entrambi possiedono, come la gestione degli utenti, il sistema di autenticazione e la gestione granulare dei permessi di accesso alle tabelle, sarebbero state superflue e non richieste. Benché più limitato funzionalmente, la scelta è quindi ricaduta su SQLite. 4.7.2.3 SQLite SQLite è una semplicemente libreria OpenSource scritta in linguaggio C che richiede solo pochi Kb per poter funzionare. Essa fornisce un database relazionale sviluppato con lo scopo di fornire un sistema comodo di gestione dati senza l'introduzione di risorse accessorie aggiuntive introdotte dai classici DBMS. È famoso per la sua alta portabilità, la compattezza e la facilità d'uso. Il sistema è il più performante fra tutti e poiché l’applicativo richiede frequenti operazioni di SELECT, INSERT e UPDATE, ciò ha garantito efficienza e affidabilità superiori alle altre soluzioni. La compattezza di SQLite permette una pag. 53 installazione semplice e leggera, che viene integrata direttamente nell'applicazione che ne fa uso, e adatta quindi al nostro ambiente di lavoro. Un ulteriore vantaggio della sua adozione riguarda la sua struttura dati costituita da un file di formato fisso e identico per tutte le piattaforme. Ciò consente al database di poter essere spostato tra sistemi diversi con una semplice operazione di copia. 4.7.2.4 Tabelle SQL e Query L'obbiettivo era implementare una tabella che consentisse la visualizzazione di una lista di prodotti e che nel contempo fosse in grado di operare efficacemente la modifiche della quantità in giacenza dei prodotti stessi. Il parametro passato dall'utente per poter identificare il prodotto è un codice a barre numerico. Da queste considerazioni iniziali si è definita una tabella denominata "items", con i seguenti campi: o item_gtin (INT, NOT NULL, PRIMARY KEY) o item_name (TEXT, NULL) o item_quant (INT, NOT NULL, DEFAULT 0) item_gtin è il campo destinato al codice a barre (definita come chiave primaria), item_name è per il nome opzionale del prodotto e item_quant indica la quantità in giacenza. Con una sola tabella tutte le operazioni per la selezione ed estrazione dei dati sono immediate: SELECT * FROM items WHERE item_gtin = '123'; così come l'inserimento e la modifica dei dati: INSERT INTO items (item_gtin) VALUES ('123'); UPDATE items SET item_quant = item_quant + 2 WHERE item_gtin = '123'; Tuttavia questa soluzione non ci ha soddisfatto particolarmente. L'intento era di dare all'utente la possibilità di visualizzare tutte le operazioni legate alla modifica delle quantità dei prodotti con un alto livello di granularità dei dati. È stato quindi necessario spostare il dato relativo alla quantità dalla tabella items in una nuova tabella. La tabella items è stata perciò ristrutturata in questo modo: o item_id (INT, NOT NULL, PRIMARY KEY, AUTO_INCREMENT) o item_gtin (INT, NOT NULL, UNIQUE KEY) o item_name (TEXT, NULL) pag. 54 Ed è stata creata una nuova tabella chiamata "stocks" per contenere le movimentazioni dei prodotti e garantire così un alto livello di dettagli sulle operazioni di carico e scarico merci. I campi scelti sono i seguenti: o o o o o stock_id (INT, NOT NULL, PRIMARY KEY, AUTO_INCREMENT) stock_item_id (INT, NOT NULL) stock_quant_in (INT, NOT NULL, DEFAULT 0) stock_quant_out (INT, NOT NULL, DEFAULT 0) stock_date (DATETIME, NOT NULL, DEFAULT CURRENT_TIME) Il campo item_quant viene quindi sostituito da stock_quant_in e stock_quant_out, due campi che specificano le quantità in entrata e in uscita dei singoli movimenti, stavolta datati. Le due tabelle vengono associate con stock_item_id come chiave esterna della chiave primaria dell'altra tabella, così da vincolare la lista dei movimenti dei prodotti con i dati dei prodotti stessi. Infine si sono aggiungi altri campi aggiuntivi e una tabella chiamata "category" per poter ordinare i prodotti in categorie. Il risultato finale di questo lavoro è presente in figura 4.29. Figura 4.29. Schema del database. pag. 55 L'architettura finale delle tabelle ha avuto come conseguenza un notevole aumento di complessità nelle operazioni di recupero dati. Ad esempio la query per recuperare i dati relativi ad un prodotto con la quantità residua in magazzino è diventata: SELECT i.*,(SUM(s.stock_quant_in)-SUM(s.stock_quant_out)) stock FROM items i LEFT JOIN stocks s ON i.item_id = s.stock_item_id WHERE i.item_gtin = '123' GROUP BY i.item_id; AS Ma con questa configurazione è divenuto possibile recuperare tutti i singoli movimenti, rendendo l'estrazione dei dati una operazione molto più selettiva e flessibile. 4.7.3 Architettura del web server Il web server funge da intermediario tra l'utente e il database. Il suo compito è quello di prelevare i dati, elaborarli e presentarli all'utente. Arduino YUN ci è stato fornito con una versione pre-installata del web-server uHTTPd, e poiché non ha avuto bisogno di configurazione ulteriore per poter funzionare abbiamo optato per tenerlo come rimpiazzo del più comune Apache. La scelta delle tecnologie da impiegare per la realizzazione del sito web è stata fatta in accordo a esperienze pregresse avute con il linguaggio di programmazione PHP, adatto a sviluppare robuste applicazioni web lato server. Si è dunque proceduto a installare i pacchetti software aggiuntivi e le dipendenze necessarie, scegliendo di includere anche il modulo CLI che consente di lanciare script PHP da linea di comando e che ha permesso ad Arduino, tramite il Bridge, di comunicare con il database stesso. pag. 56 4.7.3.1 Interfaccia web Nella realizzazione del sito web si è prestato attenzione al design dell'interfaccia d'utente il quale doveva risultare semplice e accessibile. La divisione in categorie ha reso i prodotti facilmente ricercabili. Oltretutto la presentazione dei dati è stata studiata in modo tale da avere sempre una buona panoramica sulla situazione delle giacenze. Tutti i dati vengono messi a disposizione immediatamente, il che consente di seguire in tempo reale le operazioni di carico/scarico merci intraprese dal magazziniere. L'utente interagisce con il sistema tramite quattro schermate, corrispondenti alle quattro funzionalità principali. Di seguito alcuni screenshot dell'interfaccia. Figura 4.30. Sito web - Pagina principale. pag. 57 Figura 4.31. Sito web - Pagina relativa ad una categoria di prodotti. pag. 58 Figura 4.32. Sito web - Lista movimenti di un prodotto. pag. 59 Figura 4.33. Sito web - Pagina per la modifica dei dati dei prodotti. 4.7.4 Sketch arduino Il programma è un file in formato INO contenente due funzioni, la prima denominata setup(), la quale comprende le operazioni che vengono compiute una sola volta all'accensione del sistema, e la seconda detta loop(), che raccoglie una serie di azioni da ripetere ciclicamente finché la scheda non viene riavviata o spenta. pag. 60 Figura 4.34. Ciclo di esecuzione Arduino Il software che è stato sviluppato per permette il controllo del dispositivo tramite una interfaccia visibile sul display LCD, dentro la quale è possibile "navigare" tramite l'uso della tastiera. 4.7.4.1 Comunicare con il database Grazie alla libreria Bridge, creata appositamente per delegare tutte le connessioni network ed i processi delle comunicazioni HTTP alla macchina Linux, è possibile lanciare programmi e script da linea di comando passando loro dati sotto forma di parametri e poter leggere i risultati delle operazioni. Questo è ciò che viene fatto sommariamente da Arduino per comunicare con la base dati: Process p; p.begin(F("php-cli")); p.addParameter(F("/mnt/sda1/www/bin/console")); p.addParameter(F("get:item")); p.addParameter(barcode); p.run(); Process è una classe della libreria Bridge usata per comunicare con la console di linux. php-cli è l'interprete che ci consente di eseguire lo script PHP (in questo caso localizzato in mnt/sda1/www/bin/console), e che ha il compito di comunicare con il database. Le operazioni che la pagina PHP deve eseguire sono specificate attraverso l'aggiunta di un parametro alla linea di comando. In pag. 61 questo caso get:item informa la pagina PHP che ha il compito di recuperare i dati riguardante un codice a barre, inserito poi come secondo argomento, e di stamparli a video per renderli disponibili ad Arduino. 4.7.4.2 Riconoscimento del tasto Per poter decodificare un tasto della tastiera analogica bisogna per prima cosa attivare l'interrupt sul piedino scelto per ricevere l'uscita del comparatore visto nel capitolo 4.5.4. Lo facciamo con questa istruzione: attachInterrupt(1, interrupt_handler, FALLING); Il primo argomento della funzione è il numero del pin, il secondo è un callback ad una subroutine nel caso si verifichi l'evento, mentre il terzo descrive le modalità per cui esso si verifica. Si è scelto FALLING perché il comparatore ha in uscita una tensione alta, per poi commutare in caso di pulsante premuto. È quindi necessario campionare l'ingresso dell'ADC solo nei momenti immediatamente successivi a quando il comparatore passa da uno stato alto ad uno basso ( sul fronte di discesa ). Quando ciò accade il normale ciclo del programma viene interrotto per eseguire questo programma: void interrupt_handler() { static unsigned long last_interrupt_time = 0; unsigned long interrupt_time = millis(); if (interrupt_time - last_interrupt_time > 250) { scanKeys(); } last_interrupt_time = interrupt_time; } La funzione scanKeys() è quella che si occupa di effettuare la lettura del pin analogico. Per riuscire a identificare il tasto premuto è stato scelto l'utilizzo di una tabella con i valori dei singoli pulsanti (char). Ad ogni pulsante è stato associato un range di valori accettabili (minimo e massimo) che il valore digitalizzato dell'ingresso all'A/D deve possedere affinché si abbia una corrispondenza. La tabella è strutturata come segue: pag. 62 #define NUM_KEY 12 typedef struct KEYPAD_TABLE { char val_key; int analog_min; int analog_max; } KEYPAD_TABLE; static const KEYPAD_TABLE PROGMEM keypadData[NUM_KEY] = { {'1', 42, 50}, {'2', 76, 88}, {'3', 120, 126}, {'4', 180, 190}, {'5', 291, 298}, {'6', 390, 396}, {'7', 495, 526}, {'8', 640, 660}, {'9', 720, 748}, {'Y', 795, 818}, {'0', 850, 882}, {'N', 898, 918}, }; Ogni riga di questa tabella occupa 5 byte (un byte per il char e quattro byte per i due int) e poiché la tabella ha 12 righe, le dimensioni totali sono di 60 byte. Si è quindi preferito salvare la tabella nella memoria flash (usando PROGMEM) anziché usare la SRAM. scanKeys() itererà la tabella in questo modo per identificare il tasto premuto: analogValue = analogRead(A0); for (int i=0; i<NUM_KEY; i++) { if ( analogValue > pgm_read_word(&keypadData[i].analog_min) && analogValue < pgm_read_word(&keypadData[i].analog_max) ) { anyKeyIsPressed = true; keypad_index = i; break; } } pag. 63 4.8 Tabella riassuntiva dei costi finali Costi relativi ai componenti Universal CCD Scanner PS2 € 35.10 Arduino YUN € 52.00 MicroSD da 2GB € 4.95 Display LCD HD44780 16x2 € 3.48 Tastierino 4x3 € 5.00 LM7805 € 0.23 LM311 € 0.30 Adattatore DB9 € 2.97 Costi di progettazione Hardware: 35 ore € 35.00 Software: 50 ore € 40.00 Totale 179.03 € pag. 64 Capitolo 5 Conclusioni L'obbiettivo che ci siamo imposti all'inizio del progetto è stato quello di creare un dispositivo capace di fornire ad una azienda di piccole dimensioni un sistema essenziale di inventariato delle merci. È stato stuzzicante prendere parte alla progettazione di un prototipo dal suo stato embrionale. Essere messi di fronte a delle scelte progettuali ci ha costretto a prendere decisioni studiate e ponderate che ci hanno aperto a soluzioni che prima non conoscevamo. Il risultato finale del lavoro è una soluzione originale che ci ha soddisfatto particolarmente. Tutto il software dedicato alla gestione dei dati si trova nel dispositivo stesso: non c'è perciò la necessità di utilizzare componenti esterni per poter funzionare. Trattandosi di una implementazione prototipale, lo sviluppo del dispositivo ha rappresentato la prima tra le numerose fasi che dovranno essere in seguito realizzate per poter arrivare ad un ipotetico prodotto commerciale. Ciò che ha reso il lavoro particolarmente interessante, oltre alla fase evolutiva di progettazione che il prototipo ha vissuto già dai suoi primi giorni, è stato l'utilizzo della neo-nata scheda Arduino YUN. La possibilità di poter sfruttare una scheda che integra wifi, ethernet e l'ambiente Linux ci ha aperto a molte opportunità affascinanti, che abbiamo cercato di sfruttare saggiamente. In conclusione riteniamo che l'esperienza fatta con la progettazione e la realizzazione di questa scheda ci ha permesso di approfondire e di toccare molti argomenti rilevanti nelle discipline tecniche studiate quest'anno. In sintonia con la filosofia open source dei componenti utilizzati in questo progetto abbiamo voluto aprire i codici sorgenti del sito web, dello sketch e degli schemi del circuito sbrogliato. Tutti i file sono disponibili all’indirizzo: http://www.istitutoprimolevi.gov.it/magazzino/web/tesina.zip pag. 65 Appendice A Schema circuitale pag. 66 Appendice B Circuito stampato B.1. PCB pag. 67 B.2. Lato componenti pag. 68 B.3. Lato saldature pag. 69 Appendice C Fotografie C.1. Visione dall'alto pag. 70 C.2. Visione di lato C.3. Visione da dietro pag. 71 Appendice D Sketch /** * Area di progetto 2013/2014 * I.I.S PRIMO LEVI * * by Lorello Federico - 5°BN */ #include #include #include #include #include <Process.h> <JsonParser.h> <PS2Keyboard.h> <LiquidCrystal.h> <MenuBackend.h> void setup() { menuSetup(); apiSetup(); scannerSetup(); keypadSetup(); } void loop() { mainMenu(); } struct item_t { char* name; long stock; }; // Inizializza la libreria per la comunicazione con Linux void apiSetup() { Bridge.begin(); } // Configura manualmente l'orologio del sistema int timerSetup(int year, int month, int day, int hours, int minute) { Process p; char command[20]; sprintf(command, "%d.%d.%d-%d:%d", year, month,day, hours, minute); pag. 72 p.begin(F("date")); p.addParameter(F("-s")); p.addParameter(command); p.run(); if (p.exitValue() != 0) { return 0; } return 1; } // Comunica con il database attraverso la console l'operazione di carico e scarico. // Restituisce 1 in caso di successo, 0 in caso di errore. int addStock(char* barcode, int qIn, int qOut) { char param[16]; Process p; p.begin(F("php-cli")); p.addParameter(F("/mnt/sda1/www/bin/console")); p.addParameter(F("add:stock")); p.addParameter(barcode); if (qIn > 0) { sprintf(param, "--qIn=%d", qIn); p.addParameter(param); } if (qOut > 0) { sprintf(param, "--qOut=%d", qOut); p.addParameter(param); } p.run(); if (p.exitValue() != 0) { return 0; } return 1; } // Recupera le informazioni di un prodotto dal database attraverso la console. I dati restituiti sono codificati in JSON. // Restituisce 1 in caso di successo, 0 in caso di oggetto non trovato, o -1 se la funzione non riesce a decodificare il testo recuperato dall'API. int getItem(char* barcode, struct item_t* item) { Process p; p.begin(F("php-cli")); p.addParameter(F("/mnt/sda1/www/bin/console")); pag. 73 p.addParameter(F("get:item")); p.addParameter(barcode); p.run(); if (p.exitValue() != 0) { return 0; } char json[64]; int index = 0; while (p.available() > 0) { json[index++] = (char) p.read(); } json[index] = '\0'; JsonParser<5> parser; JsonHashTable hashTable = parser.parseHashTable(json); if (!hashTable.success()) { return -1; } (*item).name = hashTable.getString("name"); if (strcmp((*item).name,"null") == 0) { (*item).name = ""; } (*item).stock = hashTable.getLong("stock"); return 1; } // Da implementare.. void reboot() { // ?? } // Inizializza LCD LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // Inizializza menù MenuBackend menu(menuUseEvent, menuChangeEvent); MenuItem MenuItem MenuItem MenuItem miInfo("Info", 'I'); miCarica("Carica", 'C'); miScarica("Scarica", 'S'); miConfig("Config", 'Z'); // Inizializza menù e lcd void menuSetup() { // inizializza lcd lcd.begin(16, 2); lcd.print(F("Caricamento...")); pag. 74 // popola menù menu.getRoot().add(miInfo).add(miCarica).add(miScarica).add(miCo nfig); } // Questa funzione gestisce l'azione di selezione del menù dall'utente. void menuUseEvent(MenuUseEvent used) { if (used.item == miInfo) { infoMenu(); } else if (used.item == miCarica) { caricaMenu(); } else if (used.item == miScarica) { scaricaMenu(); } else if (used.item == miConfig) { configMenu(); } } void menuChangeEvent(MenuChangeEvent changed) { } // Menù principale, permette di accedere ai vari sottomenù. void mainMenu() { lcd.clear(); lcd.print(F("1.Info 2.Carica")); lcd.setCursor(3, 1); lcd.print(F("3.Scarica")); waitForKey(); switch(getKey()) { case '1': menu.use('I'); break; case '2': menu.use('C'); break; case '3': menu.use('S'); break; case '9': menu.use('Z'); break; } } pag. 75 // Menù per la configurazione dell'orologio di linux. void configMenu() { char date[20]; int y=2014, m=0, d=0, h=0, mm=0; lcd.clear(); lcd.print(F("Configurazione")); delay(2000); askNumber("Anno: ", &y) && askNumber("Mese: ", &m) && askNumber("Giorno: ", &d) && askNumber("Ora: ", &h) && askNumber("Minuti: ", &mm); sprintf(date, "%d/%d/%d %d:%d", d, m,y, h, mm); lcd.clear(); lcd.print(date); lcd.setCursor(0, 1); lcd.print(F("Confermi?")); delay(500); while (true) { waitForKey(); char c = getKey(); if (c == 'N') { break; } else if (c == 'Y') { lcd.clear(); if (timerSetup(y, m, d, h, mm)) { lcd.print(F("Salvataggio...")); reboot(); } else { lcd.print(F("Formato invalido")); } delay(2500); return; } } } // Menù per recuperare il nome e la quantità in giacenza dalla lista dei prodotti. void infoMenu() { char barcode[13]; if (askBarcode(barcode)) { item_t item; if (getItem(barcode, &item) == 1) { int str_len = strlen(item.name); lcd.clear(); pag. 76 if (str_len == 0) { lcd.print(barcode); } else if (str_len > 15) { item.name[14] = '\0'; lcd.print(item.name); lcd.print(F("..")); } else { lcd.print(item.name); } lcd.setCursor(0, 1); lcd.print(F("Quantita': ")); lcd.print(item.stock); } else { lcd.clear(); lcd.print(F("Il prodotto non")); lcd.setCursor(0, 1); lcd.print(F("e' in inventario")); } waitForKey('Y'); } } void caricaMenu() { stockItem(true); } void scaricaMenu() { stockItem(false); } // Gestisce l'operazione di carico e scarico merci. void stockItem(bool toAdd) { char barcode[13]; if (askBarcode(barcode)) { int q=0; delay(2500); askNumber("Quantita': ", &q); if (q > 0) { int ret = 0; if (toAdd) { ret = addStock(barcode, q, 0); } else { ret = addStock(barcode, 0, q); } if (ret == 0) { pag. 77 lcd.clear(); lcd.print(F("Errore")); } else { lcd.clear(); lcd.print(F("Il prodotto e'")); lcd.setCursor(0, 1); lcd.print(toAdd ? F("stato caricato") : F("stato scaricato")); } delay(2500);//waitForKey('N'); } } } // Chiedi all'utente un numero da digitare attraverso la tastiera. int askNumber(const char* msg, int *n) { lcd.clear(); lcd.print(msg); lcd.setCursor(0, 1); lcd.print(*n); lcd.blink(); while (true) { int s = getNumberFromKeypad(n); if (s == 2) { lcd.noBlink(); return 1; } else if (s == -1) { lcd.noBlink(); return 0; } else if (s == 1) { lcd.setCursor(0, 1); lcd.print(F(" lcd.setCursor(0, 1); lcd.print(*n); } delay(250); } } // Chiedi per un codice a barre. int askBarcode(char *barcode) { lcd.clear(); lcd.print(F("Codice prodotto:")); lcd.setCursor(0, 1); lcd.blink(); ")); pag. 78 while (!getBarcode(barcode)) { if (isPressed('N')) { lcd.noBlink(); return 0; } delay(250); } lcd.noBlink(); lcd.print(barcode); return 1; } PS2Keyboard scanner; // Inizializza lo scanner. void scannerSetup() { scanner.begin(4, 3); } // Funzione asincrona per recuperare il barcode. // Restituisce 1 se 'data' viene popolata correttamente, 0 in caso contrario. int getBarcode(char *data) { // può essere utile pulire il buffer alla prima chiamata: // questo per evitare di restituire barcode non richiesti dal programma. static bool cleanBufferFirst = true; if (cleanBufferFirst) { while(scanner.available()) { scanner.read(); } cleanBufferFirst = false; } // non-blocking: se non è presente alcun dato restituisci 0 // e dai la possibilità di gestire l'evento. if (!scanner.available()) { return 0; } int i=0; cleanBufferFirst = true; do { delay(5); // ? if (scanner.available()) { data[i++] = scanner.read(); } else { pag. 79 return 0; } } while(i < 13); data[13] = '\0'; return 1; } #define NUM_KEY 12 typedef struct KEYPAD_TABLE { char val_key; int analog_min; int analog_max; } KEYPAD_TABLE; // Tabella con i valori del tastierino, con associati il relativo range di tensione in cui devono cadere. static const KEYPAD_TABLE PROGMEM keypadData[NUM_KEY] = { {'1', 42, 50}, {'2', 76, 88}, {'3', 120, 126}, {'4', 180, 190}, {'5', 291, 298}, {'6', 390, 396}, {'7', 495, 526}, {'8', 640, 660}, {'9', 720, 748}, {'Y', 795, 818}, {'0', 850, 882}, {'N', 898, 918}, }; volatile bool anyKeyIsPressed = false; volatile byte keypad_index = 0; void keypadSetup() { attachInterrupt(1, interrupt_handler, FALLING); } // Analizza l'input analogico, e verifica se e quale pulsante è stato premuto. void scanKeys() { int n = 10; // n. letture da fare. int analogValue = 0; // @TODO: ho notato che fare la media di una decina di letture del valore analogico rende la lettura più "stabile" e veritiera.. // il problema è che questa routine viene eseguita da interrupt, e non dovrebbe impiegare più di qualche ms per essere eseguita. // ma solo per fare la media di questa tensione ci mettiamo più di 20ms... for (int c=0; c<n; c++) { analogValue += analogRead(A0); pag. 80 } // recupero del valore digitalizzato della tensione analogValue = analogValue/n; for (int i=0; i<NUM_KEY; i++) { if (analogValue > pgm_read_word(&keypadData[i].analog_min) && analogValue < pgm_read_word(&keypadData[i].analog_max)) { anyKeyIsPressed = true; keypad_index = i; break; } } } // E' stato premuto un pulsante per la tastiera? bool isKeyPressed() { return anyKeyIsPressed; } // Restituisci il valore associato al pulsante premuto. // Ho ritenuto che l'utilizzo di un buffer per riuscire a recuperare il valore di più pulsanti quando il programma è bloccato // fosse più svantaggioso che altro: se il programma non rileva la pressione di un pulsante allora ripremilo di nuovo! char getKey() { if (anyKeyIsPressed) { anyKeyIsPressed = false; return pgm_read_word(&keypadData[keypad_index].val_key); } } // Gestione interrupt void interrupt_handler() { static unsigned long last_interrupt_time = 0; unsigned long interrupt_time = millis(); if (interrupt_time - last_interrupt_time > 250) { scanKeys(); } last_interrupt_time = interrupt_time; } // helper bool isPressed(const char c) { if (isKeyPressed()) { char key = getKey(); if (key == c) { pag. 81 return true; } } return false; } // helper void waitForKey(const char c) { while(!(getKey() == c)) { delay(500); } } // helper void waitForKey() { while(!isKeyPressed()); } int getNumberFromKeypad(int *n) { if (isKeyPressed()) { char key = getKey(); if ('Y' == key) { return 2; } else if ('N' == key) { if (*n == 0) { return -1; } else { *n=0; return 1; } } else if (key >= '0' && key <= '9') { *n=*n*10+(key-48); return 1; } } return 0; } pag. 82 Sitografia [1] Agus G. – Il magazzino virtuale di Unitec: Applicazione ad un distretto sanitario. http://www.unitec.it/ita/tesi/agus/tesi_agus.html [2] Manuale del codice a barre http://www.codiceabarre.it/bcmanu.htm [3] Panoramica su codici a barre e tipi di lettori http://www.gestionalev5.it/panoramica-su-codici-a-barre-e-tipi-di-lettori/ [4] Bresil A. – Analisi tecnica del riconoscimento dei codici a barre http://xoomer.virgilio.it/andrea_bresil/2.htm [5] Which Barcode Scanner Interface is right for me? http://www.taltech.com/barcodesoftware/articles/which_barcode_scanner_interface [6] Arduino.cc http://arduino.cc/ [7] Nepori A. – Arduino, Una rivoluzione open source http://camillomiller.com/arduino/index.html [8] Tastiera e la PS2 http://www2.units.it/marsi/elettronica2/tesine_elettro/eco/il_progetto_file/TASTIERA%2 0E%20LA%20PS2.pdf [9] Bernando G. –Gestione di un tastierino a matrice http://www.settorezero.com/wordpress/corso-programmazione-picmicro-in-capprofondimenti-gestione-di-un-tastierino-a-matrice/ [10] Connection to an ADC with a resistor matrix http://www.avr-asm-tutorial.net/avr_en/keypad/keyboard.html#adc [11] Maffucci M. – Appunti su Arduino: pilotare un display LCD http://www.maffucci.it/2012/02/17/appunti-su-arduino-pilotare-un-display-lcd/ [12] Stabilizzatore LM78XX / LM79XX http://www.grix.it/viewer.php?page=7751 [13] Ceratto F. – Analisi comparata di MySQL, PostgreSQL e SQLite. http://www.roberto.foglietta.name/pub/docs/Comparazione_RDBMS-14a.pdf pag. 83 [14] SQLite http://www.xenialab.it/meo/web/white/oracle/sqlite.htm [15] Benfante L. – Il modello relazionale http://www.html.it/pag/31720/il-modello-relazionale/
© Copyright 2024 Paperzz