Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in Misure per l’automazione e produzione industriale Reti di sensori wireless per il monitoraggio di grandezze elettriche Anno Accademico 2016/2017 Candidato: Mario Esposito matr. N46001530 1 Alla mia famiglia che con grande sacrificio mi ha permesso di raggiungere questo traguardo. Al mio amico e compagno di studi Giuseppe che tra libri, battute e difficoltà mi ha accompagnato in questo percorso. E a mia madre che silenziosamente mi ha sempre guidato. 2 Indice Introduzione 4 1 Panoramica su WSN e IoT 1.1 Wireless Sensor Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Internet of Things . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 7 8 2 Realizzazione del nodo sensore 2.1 Sensori e Condizionamento . . 2.1.1 ACS712T . . . . . . . 2.1.2 Circuito per la tensione 2.2 Conversione . . . . . . . . . . 2.3 Misurazione potenza . . . . . 2.4 Trasmissione . . . . . . . . . 2.4.1 USART . . . . . . . . 2.4.2 Modulo ESP8266 . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 13 13 14 16 24 25 25 28 Conclusioni 29 Ringraziamenti 30 Bibliografia 31 3 Introduzione Nell’era del progresso tecnologico l’informazione acquisisce un significato sempre più profondo grazie alla quale è possibile mettere in atto procedure logicoorganizzative finalizzate alla gestione dei più svariati processi. Uno dei tanti modi per acquisire l’informazione è quello di piazzare un certo numero di sensori in un’area di interesse e permettere una comunicazione senza fili tra questi ultimi al fine di raccogliere una "informazione globale" che potrà essere fine a sè stessa nel caso di studi statistici o potrà essere utilizzata per l’analisi e altri studi. Un sistema così organizzato è detto Rete di sensori wireless o Wireless sensor network (WSN) e può essere applicato in diversi settori. Questo elaborato ha come obiettivo quello di mostrare il funzionamento di una rete di sensori per il monitoraggio dei consumi elettrici in un’abitazione. Cercheremo, innanzitutto, di capire cos’è effettivamente una WSN e quali sono i suoi possibili utilizzi, poi vedremo brevemente cos’è l’IoT (Internet of Things), la naturale estensione di una WSN. La maggior parte del lavoro sarà successivamente dedicata alla realizzazione di un nodo sensore tramite la board STM32F303 Discovery con il quale prima acquisiremo i dati e successivamente li trasformeremo in informazioni sui consumi. 4 Capitolo 1 Panoramica su WSN e IoT 1.1 Wireless Sensor Network Con il termine Wireless Sensor Network ci si riferisce ad una particolare tipologia di rete distrubuita composta da tanti dispositivi elettronici in grado di prelevare informazioni dall’ambiente circostante e di comunicare tra di loro. I dispositivi elettronici sono detti nodi sensore (o sensor node) e sono disposti in modo tale da poter monitorare un fenomeno, una grandezza o, in generale, un evento e scambiare le informazioni acquisite con un nodo centrale detto gateway o base station che, a sua volta, invierà i dati ad un dispositivo di controllo per un’ulteriore elaborazione. I nodi sensore sono dispositivi caratterizzati da costo, peso e dimensione molto contenuti e sono dotati di un riserva energetica che permette loro di lavorare senza alcun collegamento alla rete elettrica. L’intera struttura gestisce il flusso di dati tramite un collegamento wireless. L’assenza di cablaggio rende ogni nodo libero di essere riposizionato a patto di mantenere determinate distanze. I consumi di tali dispositivi sono molto ridotti, questo è dovuto anche al fatto che le batterie che li alimentano non sono di grandi dimensioni, per questo motivo essi devono essere in grado di lavorare e mantenere molto basso il consumo in modo da avere un ciclo di vita più lungo. I sensor node che costituiscono una rete possono essere centinaia o migliaia in modo da avere un buon numero di informazioni utili, questo ci suggerisce la presenza di un nodo speciale che coordina il trasferimento dati e gestisce tutte le informazioni tramesse dai nodi. Questo nodo speciale, come già detto, è chiamato gateway e si occupa anche di trasferire i dati all’esterno della rete 5 rendendola, di fatto, una architettura Proxy-based. I nodi sensore sono spesso dotati di un processore, oltre che di un dispositivo di trasmissione e ricezione, per l’elaborazione dei dati acquisiti in modo tale da inviare al nodo gateway dati già elaborati e non grezzi al fine di minimizzare il carico di lavoro del nodo centrale. Come è facile pensare, una WSN ha i suoi vantaggi e i suoi svantaggi. Tra gli aspetti positivi possiamo enunciare: • i costi di realizzazione della rete • flessibilità dell’architettura semplicemente inserendo nella rete o eliminando dalla rete dei nodi sensore • possibilità di spostare geograficamente i nodi Tra gli aspetti negativi, invece, ci sono: • la limitata durata delle batterie in dotazione ai nodi • scarsa affidabilità del mezzo trasmissivo che può essere soggetto a interferenze e collisioni, a differenza di reti cablate La comunicazione all’interno di una rete di sensori è di tipo wireless a corto raggio, quindi, anche in reti di grandi dimensioni, le distanze tra i nodi non devono essere eccessivamente lunghe altrimenti questi ultimi non potrebbero comunicare tra di loro. Tuttavia, negli ultimi anni si sono sviluppate tecniche di comunicazioni a lungo raggio che risolvono il problema delle distanze tra i nodi arrivando a coprire anche svariati chilometri. L’area in cui tali nodi sono distribuiti è detta area di sensing. Le informazioni sono trasmesse al nodo centrale in maniera asincrona e in due casi: quando occorre un determinato evento, in questo caso il nodo decide autonomamente di inviare i dati, oppure quando il nodo centrale interroga tramite query un nodo sensore per prelevare i dati. Una WSN può essere vista, dunque, come un grande database distribuito in cui ogni nodo possiede parte dell’informazione totale e può essere interrogato attraverso un linguaggio SQL-like. Data la natura di queste reti che, come già detto, possono essere dotate anche di migliai di nodi sensore, esse necessitano di algoritmi di comunicazione e instradamento dei dati pensati e realizzati in maniera molto specifica. 6 1.2 Internet of Things Nell’ambito delle telecomunicazioni il termine IoT (Internet delle cose, dall’inglese Internet of Things) viene usato per riferirsi a quella particolare estensione di Internet grazie alla quale tutti gli oggetti concreti di utilizzo quotidiano acquisiscono una loro identità nella rete. Oggetti come radio, automobili, telecamere, lampadine, ecc diventano dei veri e propri oggetti intelligenti in grado di scambiarsi informazioni. Grazie a delle etichette elettroniche, dette tag, tali oggetti creano una mappa virtuale del mondo reale e assumono quindi un ruolo attivo dal momento che possono inviare dati su sè stessi e ricevere dati da altri dispositivi connessi, creando così un’infrastruttura di comunicazione che rende disponibili tali dati all’interno della rete e a dispositivi mobili, come smartphone e tablet, in modo da poter monitorare gli oggetti di interesse e fornire informazioni all’utilizzatore. Come accennato nella parte introduttiva, l’IoT è la naturale evoluzione di una WSN in cui gli oggetti intelligenti rappresentano proprio i nodi della rete. Ma cos’è effettivamente un oggetto intelligente? Per essere definito "Smart Object" un oggetto fisico deve godere di alcune proprietà: • self-awareness, ossia di identificazione univoca, capacità di localizzazione e diagnosi di stato • interazione con l’ambiente circostante, cioè la possibilità di acquisire dati e/o di rispondere a comandi - impartiti da remoto o autogenerati - per l’utilizzo di attuatori • elaborazione dati, ovvero la capacità di manipolare i dati primitivi raccolti e di analizzarli Una delle prime teconogie utilizzate per la realizzazione di una rete di oggetti "intelligenti" fu RFID (Radio Frequency Identification) basata sulla capacità dei tag (anche conosciuti come trasponder o chiavi elettroniche e di prossimità) di memorizzare informazioni e di rispondere alle richieste a distanza di un altro dispositivo che può, eventualmente, anche scrivere dati sul tag. I tag RFID sono ancora utilizzati in microchip degli animali, tessere, bagde, dispositivi antitaccheggio e in molteplici altre applicazioni ma nel corso degli anni sono nate 7 nuove tecnologie, come l’IEEE 802.15.4, che forniscono un livello di affidabilità più alto di quello delle radiofrequenze e che riescono a coprire distanze maggiori. Oggigiorno lo standard IEEE 802.15.4 rappresenta un punto fermo nella realizzazione dei livelli MAC e PHY (fisico) del modello ISO/OSI di una WSN. L’utilizzo dell’IoT previsto nei prossimi anni suggerisce un cambiamento radicale nella vita delle persone che potranno godere non solo di servizi su misura ma anche di un notevole risparmio energetico grazie alle capacità decisionali degli oggetti intelligenti. Nonostante ciò, non mancano le critiche a questa tecnologia sia dal punto di vista tecnico, dato che potrebbe soffrire di gravi problemi di sicurezza e di privacy dell’utilizzatore, sia da un punto di vista etico, dovuto proprio alle capacità decisionali degli oggetti intelligenti. 1.3 Applicazioni Esistono una varietà di sensori wireless utilizzati in un nodo ognuno dei quali in grado di misurare diverse grandezze come temperatura, umidità, accelerazione e inquinamento rendendosi, di fatto, utili per la realizzazione di WSN nei più disparati settori, come ad esempio: • militare, per il controllo dei campi di battaglia • civile, per il monitoraggio dell’ambiente • viabilità, per il controllo delle strade e dei veicoli • sorveglianza, per la realizzazione di sistemi di sicurezza • HCI (human-computer interaction), per il riconoscimento dei gesti • etc L’utilizzo dell’ IoT con le sue WSN intelligenti mira a migliorare e semplificare la vita di tutti i giorni. Attualmente, secondo la società Gartner, sono più di 5 miliardi i dispositivi nel mondo connessi ad internet e sono destinati ad aumentare in maniera esponenziale nei prossimi anni. Diversi progetti utilizzano l’IoT per fornire dei servizi, alcuni esempi sono: 8 • Smart roads: strade intelligenti in grado di comunicare con veicoli, semafori e segnaletica al fine di ottimizzare il traffico e ridurre l’inquinamento • Streetline: progetto già in prova a Los Angeles e Indianapolis che comporta l’utilizzo di sensori sulle strisce dei posti auto per determinare la presenza o meno di un veicolo in sosta in modo da stabilire, tramite un centro dati, quali sono i posti disponibili e inviare le informazioni agli automobilisti • Smart Grid: insieme di una rete di informazione e di una rete di distribuzione elettrica il cui obbiettivo è quello di consentire la gestione di tale rete elettrica in maniera intelligente. Soffermandoci in particolare sul concetto di Smart Grid, essa può essere vista come una rete composta di tante piccole reti che viaggiano tra produttori e consumatori scambiandosi informazioni per gestire con migliore efficienza i picchi di richiesta, evitando interruzioni di elettricità e riducendo il carico dove necessario. In questo elaborato verrà realizzata una piccola parte di una Smart Grid, ovvero quella interessata all’acquisizione dell’informazione sui consumi. 9 Capitolo 2 Realizzazione del nodo sensore La base di partenza per costruire una rete di sensori wireless è ovviamente la realizzazione dei nodi. Nel nostro caso, in cui vogliamo acquisire le informazioni circa i consumi di apparecchiature elettriche, avremo bisogno di prelevare i dati sulla potenza assorbita da tali apparecchiature e, successivamente, inviare tali dati mediante un trasmettitore. Possiamo, verosimilmente, immaginare di inserire i nodi sensore all’interno delle prese elettriche e prelevare le grandezze in uscita quando un carico è collegato. Figura 2.1: Modello semplificato di una WSN Ci occuperemo innanzitutto di raccogliere i dati sulla potenza e in un secondo momento di inviarli su rete. Che si tratti di televisori, phon, frullatori o qualsiasi altro elettrodomestico che fa da carico, lo schema è il seguente 10 Figura 2.2: Schema generale Come possiamo osservare, il nostro dispositivo sarà alimentato dalla rete elettrica di casa che è in corrente alternata con un valore efficace di 230 Volt e con una fase di 50 Herz. Molti dispositivi, pur prelevando i 230 V in forma alternata, funzioneranno a tensioni più basse ed eventualmente continue per cui saranno provvisti al loro interno di trasformatori e raddrizzatori che abbasseranno la tensione di esercizio e la trasformeranno in continua. Nello schema vediamo un Wattmetro che servirà per effettuare la misurazione di potenza. Questo dispositivo è costituito da due bipoli separati chiamati Voltmetro, che andrà disposto in parallelo al carico, e Amperometro, disposto in serie, che misurano rispettivamente la tensione applicata e la corrente assorbita dal carico. Figura 2.3: Disposizione di voltmetro e amperometro Nello specifico sarà realizzato un wattmetro numerico, ossia un dispositivo che preleva grandezze analogiche e le converte in digitale per poi elaborarle. Entrambi i blocchi di misura (voltmetro e amperometro) saranno composti da un elemento sensibile alla grandezza da misurare (sensore), da un blocco di condizionamento (per adattare il segnale alle esigenze del sistema di elaborazione) e da un convertitore A-D (per l’elaborazione da parte di un microcontrollore). 11 Al termine delle misurazioni, i risultati saranno elaborati per produrre i valori di potenza che ci interessano e successivamente trasmessi in rete. Figura 2.4: Schema di misurazione Per quanto riguarda il blocco di misura della corrente utilizzeremo il modulo ACS712T, mentre per il blocco di misura della tensione è stato realizzato in laboratorio un circuito specifico che prevede l’utilizzo di un trasformatore e di un amplificatore operazionale, analizzeremo in seguito i due blocchi. Per la parte di conversione A-D e trasmissione utilizzeremo la board STM32F303 Discovery. Questo dispositivo, basato sul core ARM Cortex-M4 a 32bit con una frequenza di clock massima pari a 72MH, garantisce buone performance ed è in grado di operare a basso consumo. Monta una memoria Flash da 256KB, una memoria SRAM da 48KB, 4 ADC (Analog to Digital Converter) a 12 bit con un range di conversione da 0 a 3V, 2 DAC (Digital to Analog Converter), 10 Timer, porte I/O di General Purpose, un controller DMA (Direct Memory Access) da 12 canali, nonchè di altre periferiche come giroscopio, accelerometro e magnetometro triassiali. Per la conversione utilizzeremo gli ADC dell’F3 che, però, non possono essere sottoposti a tensioni più alte di 3.3V ed è qui che entra in gioco il blocco di condizionamento. Inoltre, non è dotata di un trasmettitore, perciò la parte relativa alla trasmissione dei dati su rete sarà affidata ad un modulo esterno. Tuttavia non tratteremo questo aspetto in quanto saranno presentate nel dettaglio l’acquisizione e la manipolazione dei dati localmente alla board e il successivo invio al modulo esterno. Naturalmente è fondamentale interfacciare il sensore con la rete altrimenti non staremmo realizzando una WSN e il lavoro fatto per implementare il nodo sarebbe vano. 12 2.1 Sensori e Condizionamento Come già detto, il nostro blocco di misura avrà bisogno di opportuni sensori per prelevare le grandezze che successivamente andranno adattate al nostro sistema di elaborazione. Dobbiamo, quindi, realizzare un blocco di condizionamento che renda possibile la lettura delle misurazioni anche alla nostra scheda, in pratica dobbiamo rientrare nel range di valori convertibili dagli ADC. Analizzeremo prima il modulo ACS712T e in seguito il circuito realizzato in laboratorio. 2.1.1 ACS712T Il modulo ACS712T è un circuito integrato ad effetto Hall per misurazioni di corrente sia continua che alternata e si presta ad applicazioni come controllo di motori, rilevamento e gestione del carico, protezione contro i guasti di sovracorrente ecc. Questo modulo comprende sia il sensore, ovvero l’elemento di Hall, che una parte di condizionamento. La corrente applicata in ingresso scorre in una pista di conduzione in rame generando un campo magnetico che l’elemento di Hall converte in un valore proporzionale di tensione. Figura 2.5: ACS712T Il dispositivo presenta un offset e un rapporto di conversione che dipendono in maniera proporzionale dall’alimentazione applicata. Secondo il datasheet è richiesta un’alimentazione di 5V ma il dispositivo risulta funzionante anche con soli 3 V di alimentazione e presenta un offset di circa 1.5 V (più basso rispetto ai 2.5 V dell’alimentazione a 5 V). Per effettuare una conversione applichiamo tale alimentazione sui pin 8 e 5 (VCC e GND), dopodichè mettiamo in input un segnale di corrente sui pin 1-2 e 3-4 (IP+ e IP-) che verrà trasformato in valori 13 di tensione resi disponibili sul pin 7 di output (VOUT ). Il segnale da mettere in input proviene da uno dei cavi di fase o neutro (L o N) facendo in modo che l’ACS712T sia disposto in serie all’utilizzatore (fig. 2.5). La sensibilità del dispositivo è di circa 60 mV A con tale alimentazione, quindi per ogni Ampere assorbito dal carico il dispositivo genererà una tensione analogica di 60 mV (a cui verrà sommato l’offset). Questo dato è importante per il calcolo della potenza che vedremo in seguito. Per non avere problemi in fase di misurazione a causa dei rumori del segnale, prenderemo un carico che assorba una corrente minima di circa 100/150 mA (altrimenti non riusciremmo a distinguere i rumori dal segnale). Figura 2.6: Esempio di collegamento dell’ACS712T 2.1.2 Circuito per la tensione Al fine di misurare la tensione ai capi del carico è stato utilizzato come sorta di sensore un trasformatore nel cui secondario è indotta una tensione di 15VEFF . Il trasformatore offre anche un isolamento elettrico che serve da garanzia contro eventuali contatti che si rischierebbero con l’uso di un semplice partitore. Il fattore di trasformazione è dato dal rapporto tra il numero di avvolgimenti al primario (Np ) e il numero di avvolgimenti al secondario (Ns ). Tale tensione di uscita però non è adatta al nostro schedino che accetta in ingresso solo tensioni unipolari da 0V a 3V per cui c’è bisogno di un opportuno condizionamento che abbasserà ulteriormente la tensione e aggiungerà un offset in modo tale da avere il segnale desiderato. A tale scopo è stato utilizzato un amplificatore operazionale come differenziale la cui tensione di alimentazione è fornita dall’F3. Ricordiamo che un amplificatore differenziale realizzato con un operazionale 14 (fig 2.7) esegue la differenza tra gli ingressi V1 e V2 e fornisce una VOUT che, nel caso in cui R1 =R2 e R3 =R4 , è pari al prodotto tra la differenza degli ingressi e il fattore di amplificazione/attenuazione Ad = R3 R2 . Figura 2.7: Amplificatore operazionale come differenziale Nel nostro caso (fig 2.8), esso esegue la differenza tra gli ingressi A e B che identificano il secondario del trasformatore e fornisce in uscita una tensione alternata con un VPP (Valore di picco-picco) pari a 1.5 V intorno al valore 1.5 V, quindi con un’escursione di tensione da 0.75V a 2.25V. Il fattore di attenuazioed è stato ottenuto con una opportuna scelta dei valori delle ne è pari a 13 VmV EFF resistenze, mentre il condensatore è stato dimensionato in modo da avere un riferimento di offset stabile. Figura 2.8: Schema del circuito per la misurazione di tensione A questo punto abbiamo adattato i segnali di tensione e corrente al range di misura degli ADC. Una volta effettuate le conversioni è importante ricordarsi di riportare le grandezze ai valori reali moltiplicando quelle misurate per i fattori di conversione KI per le correnti e KV per le tensioni. 15 2.2 Conversione Una volta adattati i nostri segnali, sarà possibile applicarli al microcontrollore per l’acquisizione e la conversione dei valori misurati. A tal proposito è stato realizzato un algoritmo in linguaggio C tramite l’ambiente di sviluppo IAR Embedded Workbench della IAR Systems che comprende anche un compilatore e un debugger. Questo algoritmo prevede l’utilizzo di due ADC contemporaneamente per l’acquisizione, un timer per temporizzare il prelievo dei campioni e di due DMA per trasferire i campioni dal registro dati degli ADC ad un vettore di memoria in maniera indipendente dalla CPU. Innanzitutto ricordiamo che una conversione A-D è divisa in una fase di Campionamento, in cui un segnale tempo-continuo è trasformato in un segnale tempo-discreto raccogliendo un certo numero di campioni ad intervalli di tempo regolari, e in una fase di Quantizzazione, in cui i campioni ad ampiezza continua vengono codificati su strighe di bit che rappresentano valori di ampiezza discreti. Gli ADC dell’F3 sono di tipo SAR (Successive Approssimation Register) e come impostazione predefinita hanno una risoluzione di 12 bit, cioè il numero di valori discreti (codici) che possono produrre per rappresentare un segnale analogico è 212 = 4096. Naturalmente questi codici andranno trasformati in valori di tensione reali semplicemente moltiplicandoli per un fattore detto Quanto. Il quanto Q di un convertitore è il rapporto tra il suo fondoscala, ovvero il massimo valore in ingresso che riesce a convertire, e il numero di codici che riesce a produrre. Nei nostri ADC il quanto è pari a: Q= FS 2n = 3V 4096 = 0, 000732421875V L’utilizzo in contemporanea di due ADC è reso necessario dal fatto che abbiamo due segnali in ingresso all’F3: uno è l’uscita del blocco di misura della tensione e l’altro quella del ACS712T. L’F3 permette l’utilizzo in dual mode degli ADC 1-2 e degli ADC 3-4, in cui ADC1 e ADC3 fanno sempre da master e gli ADC2 e ADC4 fanno sempre da slave; nel nostro codice useremo ADC1 e ADC2. Passiamo ora all’analisi nel dettaglio dell’algoritmo. Le perifercihe interne hanno naturalmente delle connessioni per permettere la comunicazione, tali collegamenti sono i BUS. Andiamo, dunque, ad abilitare il 16 BUS a cui sono collegati sia i due ADC che i rispettivi pin a cui saranno applicati i segnali. Consultando sia il Reference Manual che il DataSheet, vediamo che il canale 3 dell’ADC1 è collegato al pin PA2 mentre il canale 2 dell’ADC2 è collegato al pin PA5, quindi abilitiamo sia le porte GPIOA che i due ADC; la periferica che gestisce il reset e il clock di tutte le altre periferiche della board è appunto l’RCC (Reset and Clock Control). ADC e GPIOA sono collegate al bus AHB, quindi tramite l’RCC settiamo i relativi bit nel registro AHBENR (AHB Peripheral Clock Enable Register): il bit 28 attiva entrambi gli ADC mentre il bit 17 attiva le porte GPIOA. Successivamente dobbiamo configurare la modalità di utilizzo di tali porte, l’F3 prevede quattro modalità: • input mode • general purpose output mode • alternate function mode • analog mode Dal momento che dobbiamo acquisire segnali analogici, andiamo a settare nel registro MODER della periferica GPIOA l’analog mode sulle porte 2 e 5 (PA2 e PA5). Gli ADC dell’F3 possono lavorare a frequenze diverse dividendo quella fornita dal bus AHB per un fattore di 1, 2 o 4, tali frequenze sono 72 MHz, 36MHz e 18MHz in accordo con i bit CKMODE[17:16] del registro comune CCR (Common Control Register); per comodità settiamo la massima frequenza. Prima di cominciare la vera e propria configurazione dei due ADC, bisogna ricordare che tali periferiche necessitano di una Stabilizzazione e di una Calibrazione al fine di ottenere una conversione più pulita e ridurre al minimo gli errori di non linearità dovuti ad imperfezioni fisiche. La stabilizzazione è fornita dal regolatore di tensione montato sulla scheda al quale deve seguire come suggerisce il Reference Manual - un’attesa di circa 10 microsecondi per la terminazione dell’operazione. Per abilitare il regolatore bisogna eseguire una precisa sequenza di istruzioni che prevede il passaggio dalla fase di reset, in cui il regolatore è disabilitato, ad una fase intermedia, poi dalla fase intermedia si passa alla fase di abilitazione; è possibile eseguire queste istruzioni settando i bit ADVREGEN[29:28] del registro CR (Control Register) di ciascun ADC. 17 La calibrazione invece è ottenuta alzando il bit ADCAL dello stesso registro e attendendo che esso si riabbassi. Per quanto riguarda invece l’attesa dei 10 microsecondi è possibile seguire due strade: una comporta l’utilizzo di un ciclo for senza istruzioni in cui il tempo è fatto scorrere semplicemente incrementando la variabile condizione del costrutto di un determinato numero di volte, l’altra soluzione (senza dubbio più elegante e precisa) comporta l’ultizzo di uno dei Timer di cui è dotata l’F3. Dal momento che sarà necessario l’utilizzo del timer anche in seguito, scegliamo proprio la seconda strada, quindi vediamo nel dettaglio come si evolve questa parte di algoritmo. L’F3 mette a disposizione tre tipi di timer: • Advanced-Control Timers (TIM1 e TIM8): utilizzati per generare forme d’onda per controllare, ad esempio, i motori oppure per calcolare la lunghezza d’onda di segnali in input • General-Purpose Timers (TIM2-TIM4 e TIM15-TIM17): utilizzati per vari scopi come le misurazioni di intervalli di tempo • Basic Timers (TIM6 e TIM7): utilizzati principalmente per controllare il DAC Il cuore di un timer è un contatore modulo N - dove N è il numero di bit di conteggio - che prende in ingresso un segnale di clock e ne conta gli impulsi fino ad un massimo di 2N-1 prima di azzerarsi e ripetere il conteggio. Conoscendo la frequenza di clock, e quindi il periodo, è possibile misurare il tempo necessario ad effettuare M conteggi semplicemente moltiplicando tale periodo per il numero di conteggi effettuati. 1 ∆ t = M·TCK = M· fCK I timer dell’F3 possono lavorare in due modalità: • Modalità base dei tempi: utilizzata per l’attesa di un determinato intervallo di tempo prima di effettuare un’operazione • Modalità contatore: utilizzata per misurare l’intervallo di tempo che intercorre tra due eventi 18 Dunque, per il nostro scopo, serve un timer di General-Purpose in modalità Base dei tempi, possiamo scegliere tra TIM2, TIM3, TIM4, TIM15, TIM16, TIM17. Usiamo il TIM2 che è l’unico timer a 32 bit, vale a dire che può effettuare un numero di conteggi pari a 232-1 = 2147483648. Come abbiamo fatto per gli ADC e le porte GPIOA, andiamo sul Reference Manual e vediamo che il TIM2 è collegato al bus APB1, quindi settiamo il bit TIM2EN nel registro APB1ENR (APB1 Peripheral Clock Enable Register) per attivare il timer. Il bus APB1 lavora ad una frequenza massima di 36 MHz ma TIM2, TIM3, TIM4, TIM6 e TIM7 possono lavorare ad una frequenza di 72 MHz e questo è importante perchè servirà per calcolare il numero di conteggi da effettuare. Dobbiamo dire ora al TIM2 che ci serve un’attesa di 10 microsecondi, per questo motivo andiamo a scrivere nel registro ARR (Auto-Reload Register) del TIM2 il numero di conteggi da effettuare per tale attesa. Ricaviamo il numero M di conteggi nel seguente modo: 1 ∆ t = M·TCK = M· fCK => M = ∆t·fCK = 10µs·72MHz = 720 Messa a punto questa parte preliminare, possiamo impostare la modalità di utilizzo dei due ADC e poi configurarli nel dettaglio. Tra le diverse opzioni messe a disposizione dell’F3 per far lavorare insieme più ADC, scegliamo la Dual Regular Simultaneous Mode impostando i bit DUAL[4:0] nel registro comune CCR degli ADC 1 e 2. Per quanto riguarda invece la configurazione degli ADC, procederemo in maniera del tutto analoga per entrambi, infatti le istruzioni sono identiche ad eccezione del nome di alcuni registri. Come già accennato, la prima cosa da fare è stabilizzare gli ADC tramite i bit ADVREGEN, poi facciamo partire il TIM2 alzando il bit CEN (Counter Enable) del registro CR1 (Control Register 1) e aspettiamo che conti i 10 microsecondi tramite un ciclo while in cui controlliamo quando il bit UIF (Update Interrupt Flag) del registro SR (Status Register) si alza (questo ci dice che il registro di conteggio CNT (Counter Register) è arrivato ad ARR). Dal momento che lo stesso timer verrà utilizzato per entambi gli ADC e dato che le configurazioni verranno effettuate in momenti diversi, reimpostiamo l’UIF, il CNT e il CEN. Passiamo poi alla fase calibrazione tramite 19 il bit ADCAL e aspettiamo la fine dell’operazione. Successivamente dobbiamo dire alla periferica quanti e quali canali sono interessati alla conversione e qual è il Sampling Time scelto per questi canali. Per Sampling Time si intende quella parte del Tempo totale di convesione di un campione (l’altra parte è il TSAR , ovvero il tempo di conversione vero e proprio necessario per la quantizzazione di un campione) assegnata al condensatore interno all’ADC affinchè esso si carichi al livello di tensione in input. Il Sampling Time è settabile su diversi valori in funzione di quanto veloce e precisa vogliamo che sia la conversione. Entrambi gli ADC avranno una sequenza composta da un solo canale (IN3 per ADC1 e IN2 per ADC2), quindi nel registro SQR1 (Regular Sequence Register) impostiamo a 0 i bit L[3:0] che contengono lo lunghezza della sequenza (0 vuol dire un solo canale) e nei bit SQ1[10:6] immettiamo il valore 3 per ADC1 e il valore 2 per ADC2. Scegliamo poi come Sampling Time il massimo valore settabile in modo da avere una conversione più precisa anche se più lunga, settiamo quindi il valore 0b111 nei 3 bit SMPx (dove x è il canale) del registro SMPR(Sample Time Register) del rispettivo ADC, in questo modo il tempo totale di conversione di un campione sarà all’incirca di 8,53µs. Ora dobbiamo dare informazioni agli ADC circa l’acquisizione dei segnali, l’inizio di una sequenza di conversione può essere innescato sia da software che da un evento esterno, come ad esempio il raggiungimento di un conteggio da parte di un timer. È proprio questo il nostro caso, in cui vogliamo che gli ADC acquisiscano i segnali ad intervalli di tempo regolari scanditi dal TIM2. A tal proposito impostiamo nel registro CR2 (Control Register 2) del TIM2 i bit MMS (Master Mode Selection) in modo che esso invii segnali di update agli ADC ogni volta che raggiunge un determinato numero di conteggi. Supponiamo, ad esempio, di voler raccogliere 100 campioni dei segnali di ingresso in 1 secondo, questo significa che tra un campione e l’altro intercorre un tempo di 10 ms. Con procedimento del tutto analogo al calcolo dei 10 µs, ricaviamo che il numero di conteggi da effettuare per 10 ms è di 720000 e inseriamo questo dato nell’ARR. Ora, per comunicare agli ADC che l’evento di trigger per iniziare una conversione è il raggiungimento dell’ARR, andiamo nel registro CFGR(Configuration Register) e settiamo il bit EXTEN a 1 per abilitare i trigger esterni e i bit EXTSEL[9:6] a 0b1011 per impostare il TRGO2 (Trigger Output TIM2) come 20 evento di trigger. Con questo si chiude la configurazione dei canali degli ADC ma l’algoritmo prevede ancora diversi passaggi per essere completato, infatti ora è il momento di configurare il DMA per il trasferimento dei campioni dal DR (Data Register) di ciascun ADC a due diversi vettori di memoria. Nel caso di conversioni simultanee con gli ADC, il Reference Manual ci informa che è possibile utilizzare separatamente due canali DMA (uno per il master e uno per lo slave) oppure un unico DMA nel caso in cui l’altro fosse impegnato in una diversa operazione; in questa configurazione i dati convertiti dai due ADC sarebbero letti dal registro CDR (Common Data Register) in cui i 16 bit più significativi conterrebbero il DR dello slave e i 16 bit meno significativi conterrebbero invece il DR del master. Dal momento che non ci serve un DMA per altre operazioni, possiamo utilizzarli entrambi e configurarli separatamente. Innanzitutto consultiamo il Reference Manual e vediamo che l’ADC1 è collegato al canale 1 del DMA1, mentre l’ADC2 è collegato al canale 1 del DMA2, quindi abilitiamo i DMA 1 e 2 che sono collegati al bus AHB come gli ADC e la GPIOA. Andiamo di nuovo nel registro CFGR degli ADC e alziamo il bit DMAEN in modo da specificare che sarà il DMA a raccogliere i dati non appena essi saranno disponibli. Ora dobbiamo dare al DMA una serie di informazioni circa le locazioni di memoria e le modalità di trasferimento. Per specificare quali sono le locazioni di memoria in cui scrivere e da cui leggere, scriviamo nel registro CMAR (Memory Address Register) l’indirizzo del vettore in cui vogliamo inserire i dati e nel registro CPAR(Peripheral Address Register) l’indirizzo di memoria del DR dell’ADC da cui vogliamo leggere. Successivamente, nel registro CNDTR (Number of Data Register) di ciascun DMA scriviamo il valore 100, che è il numero di trasferimenti da effettuare. In ultimo, andiamo nel registro CCR (Channel Configuration Register) e settiamo i seguenti bit: • PL[13:12] a 0b11 per impostare la priorità massima per il canale • MSIZE[11:10] e PSIZE[9:8] a 0b10 per impostare a 16 bit la dimensione dei dati per un corretto allineamento (il DR degli ADC è a 12bit) • MINC a 1 per abilitare l’auto-incremento della locazione di memoria, questo perchè ogni dato deve essere scritto in una diversa posizione del 21 vettore • PINC a 0 per disabilitare l’auto-incremento dato che l’indirizzo da cui leggere è sempre il DR • DIR a 0 per stabilire che la direzione del trasferimento è da periferica a memoria • EN a 1 per abilitare il DMA A questo punto l’intera configurazione può dirsi conclusa, non ci resta altro da fare che abilitare i singoli ADC dal registro CR, aspettare che il bit ADRDY del registro ISR (Interrupt Status Register) diventi alto, far partire il TIM2 per generare gli eventi di update e dare lo START agli ADC per iniziare le conversioni. Tutti i trasferimenti saranno terminati quando il bit TCIF1 (Transfer Complete Interrupt Flag 1) del registro ISR di ogni DMA sarà diventato alto. Dopo circa un secondo avremo 100 codici nel vettore delle correnti e 100 codici nel vettore delle tensioni. Questi codici vanno convertiti in valori di tensione sul range degli ADC, quindi li moltiplichiamo per il quanto Q (codice · 3 4096 ). I valori ottenuti saranno dunque indicativi della corrente assorbita e della tensione applicata, andranno successivamente riscalati con gli opportuni fattori per ottenere le reali misurazioni. Di seguito sono presentate alcune istantanee del codice. Si può notare che varie impostazioni sono state raggruppate in un numero minore di istruzioni per avere un codice più compatto Figura 2.9: Abilitazione dei bus e configurazione TIM2 22 Figura 2.10: Settaggio dual mode e configurazione ADC1 (per l’ADC2è stata adoperata una configurazione analoga) Figura 2.11: Configurazione dei DMA e attesa dei trasferimenti 23 2.3 Misurazione potenza In questa parte di algoritmo ci dedichiamo alla misurazione della potenza assorbita dal carico che è calcolata come prodotto tra la corrente che lo attraversa e la tensione applicata. Prima di tutto, dunque, è necessario trasformare i due vettori da 100 valori ciascuno in dati reali di corrente e tensione. Prendiamo dunque i due vettori e moltiplichiamo i valori per il fattore KI nel caso delle correnti e per il fattore KV nel caso delle tensioni. A questo punto la potenza è calcolata secondo il valore efficace (o Root Mean Square) utilizzato per confrontare la potenza di un segnale alternato con la potenza che si avrebbe se il segnale fosse in corrente continua semplificando, di fatto, l’espressione della potenza media ed evitando di analizzare il suo andamento in ogni istante. I valori efficaci di un segnale continuo x(t) con periodo T e di un segnale discreto di n campioni sono calcolati come: Nel caso, invece, di segnali provenienti dalla rete elettrica che hanno dunque un andamento sinusoidale, il valore efficace sarà pari a √1 2 volte l’ampiezza del segnale. Andando a moltiplicare i segnali sinusoidali v(t) = VM · sin(2πf t) e i(t) = IM · sin(2πf t + ϕ) otteniamo la potenza attiva la cui espressione è il seguente prodotto scalare: PA = Vrms · Irms · cos ϕ Dove ϕ è l’angolo di sfasamento tra il vettore tensione di valore efficace Vrms e il vettore corrente di valore efficace Irms che dipenderà dal carico. Avendo, però, campionato i segnali, l’espressione totale della potenza assorbita dal carico è calcolata come semplice media aritmetica delle potenze relative ai valori campionati: Pa = 1 n · Pn i=1 vi · ii = 1 n · Pn i=1 Pi A questo punto abbiamo la tanto attesa informazione sulla potenza assorbita dal nostro carico che potrà essere inviata al gateway e ad uno specifico dispositivo che elaborerà i dati sul consumo e li presenterà all’utente. 24 Figura 2.12: Calcolo potenza assorbita 2.4 Trasmissione In questa sezione, come già annunciato, non ci preoccuperemo dell’invio effettivo dei dati su rete, bensì dell’invio dei dati ad un modulo esterno all’F3 che si occuperà di tutta la parte relativa alla trasmissione su rete e che noi tratteremo come una scatola chiusa. L’F3 mette a disposizione dell’utente diverse perifericche di trasmissione dati denominate USART (Universal Synchronous/Asynchronous Receiver/Transmitter), mentre un esempio di modulo che poteremmo utilizzare è l’ESP8266 che descriveremo in seguito. 2.4.1 USART L’USART è una periferica di trasmissioni dati seriale che utilizza solo due cavi per la comunicazione. E’ una delle interfacce di comunicazione più diffusa nell’ambito dei microcontrollori anche se ultimamente è stata surclassata da altri tipi di comunicazioni seriali come l’USB. Esistono sostanzialmente due modalità di trasmissione: • Modalità asincrona (full-duplex), in cui trasmettitore e ricevente possono inviare dati in contemporanea • Modalità sincrona (half-duplex), in cui trasmissione e ricezione sono sincronizzate da un clock di sistema La modalità full duplex necessita di due canali separati per il trasferimento e quindi ci sarà un pin dedicato alla trasmissione (TX) ed un pin dedicato alla ricezione (RX). Nella modalità half duplex, invece, la linea dati è unica e quindi c’è l’esigenza di un clock fornito da un master per temporizzare l’accesso al ca25 nale; anche qui abbiamo due pin: uno per i dati (DT) e uno per il clock (CK). Nel caso specifico della nostra board, ogni trasferimento segue un preciso schema: 1 bit di start, 8 o 9 bit dati (detti word) ed uno o due bit di stop. Inoltre è fornita la possibilità di scegliere il Baud Rate ovvero il numero di simboli trasmessi in un secondo, da non confondere con i bps perchè un baud corrisponde ad un numero differente di bit, quindi la velocità espressa in bit sarà un multiplo della velocità espressa in baud, eccezion fatta per il caso in cui un baud corrisponda proprio ad un bit. Tra i vari USART messi a disposizione dall’F3 scegliamo, ad esempio, l’USART1 e cerchiamo nel Datasheet a quali pin è collegato. Vediamo che esso è associato ai pin PA9 per la trasmissione (TX) e PA10 per la ricezione (RX) nella modalità Alternate Function, quindi una della prime cose da fare è selezionare tale modalità su queste porte dopo aver abilitato USART1 (GPIOA è già stato abilitato prima). In realtà, a noi interessa solo trasmettere i dati in uscita sul modulo WiFi, quindi non ci sarebbe la necessità di selezionare anche la porta di ricezione. Tra le 16 Alternate Function disponibili, vediamo che l’utilizzo dell’USART su tali porte è affidato alla AF7. Questa impostazione va settata nel registro AFR (Alternate Function Register) che in realtà è un vettore di due elementi: AFRL (= AFR[0], Low Register) per le porte 0-7 e AFRH (= AFR[1], High Register) per le porte 8-15. Scegliamo dunque l’High Register e impostiamo la settima funzione settando i bit AFRH10[11:8] e AFRH9[7:4] entrambi a 0b0111. Successivamente scegliamo la lunghezza di una word tramite il bit M nel registro CR1 (per comodità la lasceremo ad 1 byte di default). Il BaudRate a cui vogliamo inviare i dati può essere impostato nel registro BRR (Baude Rate Register) a seconda dell’oversampling scelto. L’oversampling, come suggerisce la parola, è la scelta di una frequenza di campionamento decisamente più alta del dovuto (frequenza di Nyquist) al fine di ridurre il rumore e l’effetto aliasing. Possiamo scegliere, tramite il bit OVER8 del registro CR1, tra un oversampling di 8 se vogliamo un BaudRate più alto (al massimo fCK 8 ) e uno di 16 se vogliamo una maggiore tolleranza del recivitore alle deviazioni del clock in modo che sappia distinguere i dati dal rumore (riducendo il massimo baud rate a fCK 16 ). Ritornando al BaudRate, esso è settato allo stesso valore sia per il recie- ver che per il transmitter ed è calcolato, in base all’oversampling scelto, come: BRO16 = fCK U SART DIV BRO8 = 26 2·fCK U SART DIV Dove fCK di default è 36MHz e USARTDIV è il valore scritto nel BRR. Quindi, se volessimo ad esempio un BaudRate di 9600 con un frequenza di 36MHz e un oversampling di 16 (OVER8=0) dovremmo scegliere: USARTDIV= 36000000 9600 = 3750 = 0xEA6 . Nel caso in cui, invece, scegliessimo un oversampling di 8 (OVER8=1), il registro BRR sarebbe diviso in due parti (i bit 31:16 sono riservati in entrambi i casi): i 4 bit meno significativi BRR[3:0] verrebbero shiftati di 1 a destra, mentre i restanti bit BRR[15:4] conterrebbero il resto della codifica; il valore sarebbe dunque: = 7500 = 0x1D4C USARTDIV= 2x36000000 9600 BRR[3:0] = 0xC » 1 = 0x6 BRR[31:0]= 0x1D46 Lasciamo l’oversampling al valore di default (OVER8=0, oversampling by 16) e scegliamo tale BaudRate. Anche il numero di bit di stop lo lasceremo così com’è, cioè ad 1 bit. A questo punto possiamo inserire il dato da trasmettere nel TDR (Transmitter Data Register) e abilitare la porta di trasmissione e l’USART tramite i bit TE e UE nel registro CR1. La trasmissione sarà completa quando il bit TC del registro ISR sarà alto. 27 Con questo algoritmo abbiamo creato una sorta di driver per le periferiche USART, la vera trasmissione riguardo i dati di potenza avviene con funzioni di alto livello in cui vengono inviati comandi AT che il modulo WiFi dovrà eseguire. 2.4.2 Modulo ESP8266 L’ESP8266 è un SOC (System on a Chip) ampiamente utilizzato nelle applicazioni IoT. Esistono 12 moduli appartenenti a questa famiglia: dall’ESP-01, che mette a disposizione 4 pin digitali incluse le porte seriali Tx e Rx, fino all’ESP-12f con i 11 pin digitali ed uno analogico. I diversi moduli sono dei tranceiver (transmitter+reciever) WiFi compatibili con lo standard 802.11 b/g/n a 2.4 GHz con protocollo TPC/IP e sicurezza WPA e WPA2, dotati di memoria flash (dai 512KB a 1 MB) e di un MCU. Il modulo più diffuso è senza dubbio l’ESP-01 che opera ad una tensione di 3.3V e ha un assorbimento medio che si aggira intorno ai 50 mA (può arrivare anche a 200 mA). Questo lo rende perfetto per lavorare con dei microcontrollori esterni come Arduino o la nostra board SMT32F3. Naturalmente deve essere programmato per funzionare, quindi la prima operazione da fare è avviarlo in modalità Bootloading e caricare un firmware. In questa modalità, se lo si collega ad un pc, sarà necessario mediare il collegamento con un convertitore logico per abbassare i 5V delle porte USB ai 3.3 V supportati dal modulo. Nel nostro caso invece lo collegheremo direttamente all’F3 e quindi non ci sarà bisogno di alcun converitore. Utilizzeremo la stessa comunicazione USART realizzata prima per trasferire i comandi che il modulo dovrà eseguire per connettersi al nodo gateway e successivamente per inviargli i dati. C’è da dire che questa famiglia di moduli è ben ottimizzata anche per operare standalone senza necessariamente una board esterna, naturalmente le funzionalità saranno limitate ma è comunque utile nel caso in cui si volesse realizzare una piccola rete domestica per controllare a distanza oggetti come boiler, forni o cancelli inviando semplici comandi per attivare dei relè collegati a questi oggetti. 28 Capitolo 3 Conclusioni Quanto finora realizzato non è che la minima parte di applicazioni ben più sofisticate e organizzate. Si potrebbe continuare la realizzazione del nodo sensore aggiungendo le funzionalità di rete e creando diversi altri nodi da installare in tutte le altre prese elettriche, dopodichè si dovrebbe implementare un algoritmo di routing per gestire la trasmissione dati verso il gateway ed un algoritmo di gestione della rete domestica; avremmo così creato una piccola Smart Grid. L’idea è quella di raccogliere un certo numero di dati ad intervalli di tempo regolari non solo sulla potenza ma anche sulla posizione del nodo così da identificare l’utilizzatore, inviarli al nodo centrale che si occuperebbe di trasmetterli ad un PC che elaborerebbe le informazioni sul carico e sui consumi "decidendo" se e quando spegnere determinati apparecchi qualora questi stessero assorbendo troppa energia elettrica. Con lo stesso schema utilizzato in questo elaborato, potrebbero essere raccolti dati di natura diversa. La board utilizzata in effetti è fornita di un sensore di temperatura e potrebbe essere utilizzata per realizzare una rete di monitoraggio dell’impianto di riscaldamento/condizionamento. Tuttavia, questo resta un progetto puramente a scopo illustrativo dal momento che non è pensabile realizzare una WSN interamente con board F3 perchè occuperebbero troppo spazio e sarebbero costose. Sul mercato esistono numerosi altri dispositivi con funzionalità più all’avanguardia come gli adattatori elettrici intelligenti che sono forniti di connettività WiFi e che tramite un’app dedicata possono essere comandati direttamente dall’utente tramite il proprio smartphone. Anche tali dispositivi sono tutt’altro che economici allo stato attuale ma dati i molti passi in avanti compiuti negli ultimi anni è dunque auspicabile che nel prossimo futuro si arrivi a soluzioni più economiche ed alla portata di tutti. 29 Ringraziamenti In questo spazio desidero ringraziare la mia relatrice Prof.ssa Ing. Annalisa Liccardo per i suggerimenti e le osservazioni, l’ Ing. Alessandro Tocchi per la realizzazione del circuito di condizionamento grazie al quale ho potuto testare il funzionamento del nodo. Inoltre ringrazio tutta la mia famiglia che ha sempre appoggiato le mie scelte e mi ha dato supporto. Ringrazio i colleghi con il quale ho condiviso anche piccole parti di questo percorso. In particolare, ringrazio il mio amico Giuseppe con il quale ho affrontato intense giornate di studio non prive di gioie e preoccupazioni. Ringrazio tutti i miei amici, primo fra tutti Liugi, che mi sono stati vicini e mi hanno aiutato, anche inconsapevolmente, a superare momenti difficili. Per quanto riguarda invece questo lavoro, mi auguro che possa essere interessante per coloro che intendono approfondire meglio i vari aspetti di una rete di sensori wireless. 30 Bibliografia [1] J. Zheng, A. Jamalipour, "Introduction to Wireless Sensor Networks", WileyIEEE Press, 2009 [2] T. Voigt, C. Rohner, "What Is the Internet of Things: An Introduction", IEEE Courses, 2017 [3] D. Ivanova, O. Starkova, K. Herasymenko, "Realization of the remote power management system based on the concept of Internet of Things", in Problems of Infocommunications Science and Technology (PIC S&T)Ukraine, 2016 [4] X. Zu, Y. Bai, X. Yao, "Data-centric publish-subscribe approach for Distributed Complex Event Processing deployment in smart grid Internet of Things", in Software Engineering and Service Science (ICSESS), China, 2016 [5] Appunti del corso di Misure per l’Automazione e Produzione Industriale, 2015 [6] Webster, J. G., Electrical measurement, signal processing, and displays, CRC Press, Boca Raton, FL, 2004. [7] STMicroelectronics, RM0316 Reference Manual STM32F30x, 2013 [8] STMicroelectronics, STM32F302xB STM32F302xC STM32F303xB STM32F303xC Datasheet, 2013 [9] Allegro MicroSystems, ACS712T Datasheet, 2012 31