• Non ci sono risultati.

5.2 Software

5.2.6 STM32 CubeProgrammer

L'STM32 CubeProgrammer è un software specicatamente programmato per il dumping nale del codice compilato sulla scheda di svilupppo. Normal- mente questa procedura è automatizzata all'interno del System Workbench alla ne di una compilazione terminata con successo, ma la procedura auto- matizzata può andare incontro a incompatibilità col bios della scheda e può essere necessario svolgere a mano questo passagggio. Il software ore inoltre una modalità di editing direttamente sul codice esadecimale che non è mai stata utilizzata durante questo progetto.

Conclusioni e sviluppi futuri

Oggetto di questo lavoro di tesi è stata la realizzazione di nuove strutture microuidiche per un anemometro a distribuzione di pressione e la loro fase di test. È stato inoltre realizzato il software per un microcontrollore della famiglia Nucleo STM32 per interfacciarsi all'anemometro.

In commercio si trovano già anemometri meccanici, a lo caldo e ultraso- nici. La nostra proposta è stata invece quella di un anemometro direzionale basato sul principio della distribuzione di pressione attorno ad un cilindro immerso in un usso laminare. L'utilizzo di un sensore di usso in tecnologia MEMS permetterebbe una miniaturizzazione estrema con la possibilità di utilizzare gli anemometri direzionali anche in condizioni in cui è necessario misurare il usso in uno spazio molto ridotto e con bassissimo consumo di potenza.

È stato dimostrato che esistono due metodologie di progetto per la realiz- zazione delle strutture microuidiche interne ai cilindri. Per testare i risultati ottenuti è stato realizzato un collettore in PMMA attraverso una fresatrice CNC (computer numerical control). I primi esperimenti hanno portato dei risultati incoraggianti e hanno sollecitato a ricercare in questo progetto di tesi nuove tecnologie per la realizzazione delle strutture microuidiche e ad ottimizzare il sistema di misura verso un'automatizzazione più spinta di tutte le fasi di setup e misura del usso.

LA realizzazione di strutture in PMMA richiedevano il lavoro attivo di due operatori, oltre ad una grande precisione per incollare i dischi prodotti, per evitare problemi di non aderenza o di perfetto allineamento. Una possi- bile soluzione per entrambi questi problemi viene dalla tecnologia di stampa 3D. Tra i vari software che si possono utilizzare per realizzare i design delle strutture microuiche, la scelta è caduta su FreeCAD, un software open- source per il disegno tecnico in 3D. La prima stampa è stata eseguita per una sola struttura microuidica, per valutare la bontà dei vari parametri di stampa e di progetto. Tra le varie tipologie di collettore ne è stato realizzato uno a 3 canali pesati ed è stato stampato in 3D con una stampante di tipo stereolitograco (SLA), in particolare la Form2 della Formlabs.

Dalle misure eettuate con questo primo prototipo sono emerse delle criti- cità che hanno portato a sperimentare altre quattro soluzioni. Con la seconda stampa abbiamo realizzato così altre quattro strutture microuidiche, ognu- na con delle dierenze che ci hanno permesso di indagare gli eetti di singoli variazioni progettuali. Questa stampa ha dimostrato che è eettivamente possibile abbattere i tempi di realizzazione di queste strutture.

Oltre a questo, com'è noto, i sensori MEMS sono particolarmente fragili e l'utilizzo di un sensore di questo tipo durante le intemperie è sconsigliato in quanto l'ingresso di pioggia nei canali sarebbe distruttiva per la struttura integrata sul silicio. Grazie alla tecnologia di stampa 3D è stato possibile inclinare di 30◦ i canali verso l'alto, in maniera da creare un percorso in salita

svantaggioso per l'acqua. Questa tecnologia può essere utilizzata anche per realizzare in futuro una struttura microuidica sucientemente complessa da permettere una lettura triassiale della direzione e non semplicemente biassiale come quella attuale.

Dopo aver velocizzato grazie alla stampa 3D la realizzazione delle struttu- re microuidiche, può essere interessante anche accelerare i tempi di misura e test automatizzando il processo di lettura per i diversi angoli di rotazione del sensore.

Per snellire la complessità dell'apparato di misura è stato utilizzato un sistema di schede PCB sviluppate dall'ingegnere Ria. Il sistema di schede permette di aggiungere una comunicazione bluetooth al microcontrollore e di gestire un HUB I2C.

Le operazioni di misura potranno inoltre essere automatizzate attraverso l'installazione di un servomotore che controlli la rotazione del goniometro mentre il microcontrollore eseguirà letture e medie sincronizzandosi di conse- guenza. Per fare questo è stato deciso di iniziare a sviluppare degli applicativi per un microcontrollore della famiglia Nucleo STM32 della STMicroelectro- nics. È stato utilizzato il CubeMX, un software freeware che permette di generare in maniera automatica il codice C di inizializzazione per ogni sche- da di sviluppo Nucleo, con un'ampia possibilità di personalizzazione. Una volta generati i le di progetto con il CubeMX, è stato utilizzato l'ambien- te di sviluppo System Workbench per la scrittura vera e propria del codice C++. Sono state programmate le funzioni di comunicazione attraverso porta UART con il terminale di un pc e le funzioni di lettura e scrittura su bus I2C

Appendice A

Appendice: codice sistema

operativo

while (1) {

// sleep

HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); if (fine_stringa==1) //è stato premuto invio

{

//Inizio routine divisione stringa di input in comandi Print_uart("");

//inizializzo vettori comandi memset (Key, 0, 10);

memset (Arg_1, 0, 10); memset (Arg_2, 0, 10); memset (Arg_3, 0, 10); indice_char=0;

//cicli di scomposizione r_buffer nelle sue componenti //cerco inizio primo comando (skip eventuali spazi inziali) for(int i=0;i<20;i++) { if(r_buffer[i]!=0x20) {break;} else {indice_char++;} } 1

//copio primo comando for(int i=0;i<20;i++) { Key[i]=r_buffer[indice_char]; indice_char++; if((r_buffer[indice_char]==0x20)|(r_buffer[indice_char]==0x0d)) {break;} }

//cerco inizio primo argomento (skip eventuali doppi spazi) for(int i=0;i<20;i++)

{

if(r_buffer[indice_char]!=0x20) {break;} else {indice_char++;}

}

//copio primo argomento for(int i=0;i<20;i++) { if(r_buffer[indice_char]==0x0d) {break;} Arg_1[i]=r_buffer[indice_char]; indice_char++; if((r_buffer[indice_char]==0x20)|(r_buffer[indice_char]==0x0d)) {break;} }

//cerco inizio secondo argomento (skip eventuali doppi spazi) for(int i=0;i<20;i++)

{

if(r_buffer[indice_char]!=0x20) {break;} else {indice_char++;}

}

for(int i=0;i<20;i++) { if(r_buffer[indice_char]==0x0d) {break;} Arg_2[i]=r_buffer[indice_char]; indice_char++; if((r_buffer[indice_char]==0x20)|(r_buffer[indice_char]==0x0d)) {break;} }

//cerco inizio terzo argomento (skip eventuali doppi spazi) for(int i=0;i<20;i++)

{

if(r_buffer[indice_char]!=0x20) {break;} else {indice_char++;}

}

//copio terzo argomento for(int i=0;i<20;i++) { if(r_buffer[indice_char]==0x0d) {break;} Arg_3[i]=r_buffer[indice_char]; indice_char++; if((r_buffer[indice_char]==0x20)|(r_buffer[indice_char]==0x0d)) {break;} }

//Fine routine divisione stringa di input in comandi //visualizzazione stringhe:

Print_uart("Le quattro parole sono:");

HAL_UART_Transmit(&huart2, (uint8_t*)Key, 10, HAL_MAX_DELAY); Print_uart("");

HAL_UART_Transmit(&huart2, (uint8_t*)Arg_1, 10, HAL_MAX_DELAY); Print_uart("");

HAL_UART_Transmit(&huart2, (uint8_t*)Arg_2, 10, HAL_MAX_DELAY); Print_uart("");

HAL_UART_Transmit(&huart2, (uint8_t*)Arg_3, 10, HAL_MAX_DELAY); Print_uart("");

Appendice B

Appendice: codice delle funzioni

ausiliarie

void Print_uart(char _out[]) {

HAL_UART_Transmit(&huart2, (uint8_t *) _out, strlen(_out), HAL_MAX_DELAY);

char newline[2] = "\r\n";

HAL_UART_Transmit(&huart2, (uint8_t *) newline, 2, HAL_MAX_DELAY);

}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

//salva carattere in r_buffer r_buffer[indice_char]=r_char[0]; // eco terminale

HAL_UART_Transmit(&huart2,(uint8_t*)r_char, 1, HAL_MAX_DELAY); indice_char++; //avanza cursore

if (r_char[0]==0x7f) {indice_char=indice_char-2;} //carattere backspace.

if (r_char[0]==0x0d) {fine_stringa=1;} // carattere invio. HAL_UART_Receive_IT(&huart2, (uint8_t*)r_char, 1);

//riattivo interrupt uart }

char HexDigit_2_int(char dig) { if ((dig>47)&&(dig<58)) sc1=dig-48; else if ((dig>64)&&(dig<71)) sc1=dig-55; else if ((dig>96)&&(dig<103)) sc1=dig-87; else sc1=16; return sc1; } int Hex_2_bin(char *str) { uint8_t code; code=(HexDigit_2_int(str[0])<<4)+HexDigit_2_int(str[1]); return code; }

Appendice C

Appendice: codice dei comandi

if (strcmp (Key, "ver")==0) {

Print_uart("Nucleo L053R8 - CPU: ARM 32-bit Cortex-M0+); } if (strcmp (Key, "i2cw")==0) { Print_uart("Comunico in i2c..."); uint8_t arg1; arg1= Hex_2_bin(Arg_1); arg1=arg1<<1; uint8_t arg2; arg2= HexDigit_2_int(*Arg_2); arg2=~arg2;

HAL_I2C_Master_Transmit(&hi2c1, arg1, &arg2, 1, HAL_MAX_DELAY); } if (strcmp (Key, "i2cr")==0) { uint8_t arg1; arg1= Hex_2_bin(Arg_1); arg1=arg1<<1; Print_uart("Il registro:");

HAL_UART_Transmit(&huart2, (uint8_t*) Arg_1, 2, HAL_MAX_DELAY); 6

Print_uart("");

Print_uart("Contiene:"); uint8_t read_reg=0;

HAL_I2C_Master_Receive(&hi2c1, arg1, &read_reg, 1, HAL_MAX_DELAY); read_reg=~read_reg;

char r_reg[1];

itoa(read_reg, r_reg, 16);

HAL_UART_Transmit(&huart2, (uint8_t*)r_reg, 1, HAL_MAX_DELAY); Print_uart("");

}

if (strcmp (Key, "test")==0) {

// ciclo di test per i led: Print_uart("Test led 0-16"); uint8_t silver_reg[1];

for(int i=1; i<16; i++) {

HAL_Delay(200); silver_reg[0]=i;

silver_reg[0]=~silver_reg[0];

HAL_I2C_Master_Transmit(&hi2c1, 0x20<<1, silver_reg, 1, HAL_MAX_DELAY); }

HAL_Delay(200); silver_reg[0]=0x00;

silver_reg[0]=~silver_reg[0];

HAL_I2C_Master_Transmit(&hi2c1, 0x20<<1, silver_reg, 1, HAL_MAX_DELAY); }

//reset dati per nuovo inserimento comandi memset (r_buffer, 0, DIM_R_BUFFER);

r_char[0]='0'; indice_char=0; fine_stringa=0;

Print_uart("Inserire stringa:"); }

Bibliograa

[1] Leonardo da Vinci. Codice Atlantico f. 675 r. Biblioteca Ambrosiana, 1487.

[2] J. Schauer and A.Allen. Tropical cyclone weather services program, nwspd 10-6. NATIONAL WEATHER SERVICE INSTRUCTION 10- 604, Mag. 10 2018.

[3] Pushpendra K. Agarwal Sharad K. Jain and Vijay P. Singh. Hydrology and Water Resources of India. 2007.

[4] S. Formentin e S. M. Savaresi M. Corno. Data-driven online speed op- timization in autonomous sailboats. IEEE Trans. Intell. Transp. Syst, vol. 17 n. 3 pp. 726-771, Marzo 2016.

[5] Steven Woodrum Carl Wolf, Richard Hardis. Wind data collection techniques on a multi-rotor platform. IEEE, 2017.

[6] Tanvir Asif Ali Asif Imtiaz, Su Galib Omar. Ecient design of a low cost portable weather station. ICCCI, 2018.

[7] Gerald Mills Rowan Feely Keith Sunderland, Michael Conlon. Observa- tion of the wind resource across the dublin urban area. UPEC, Settebre 2011.

[8] Rachid Dhifaoui Fathi Ben Amar, Mustapha Elamouri. Transposition of wind measurements to a standard site of open area roughness at a height of 10m above ground level. IEEE, 2013.

[9] Geraldo P.R. Filho Bruno S. Faical, Gustavo Pessin. Fine-tuning of uav control rules for spraying pesticides on crop elds. IEEE International conference on Tools with Articial Intelligence, 2014.

[10] Shaw Shellito James Irish, Douglas Vandermark. Co2 gas exchange and ocean acidication studies in the coastal gulf of maine. IEEE, 2010.

[11] Yue Dawei Wang Lihua. Study of aneometer for wind power generation. IEEE - International Conference on Mechatronics and control, Luglio 2014.

[12] F. Dell'Agnello P.Bruschi, M. Piotto. Wind speed and direction detec- tion by means of solid-state anemometers embedded on sall quadcopters. ScienceDirect - 30th Eurosensor Conference, 2016.

[13] Soo-Mi Choi S. Rokhsaritalemi, A. Sadeghi-Niaraki. Drone trajectory planning based on geographic information system for 3d urban modeling. IEEE, 2018.

[14] D. Martinez e altri. First characterization results obtained in a wind tunnel designed for indoor gas source detection. ICAR Proc. Int. Conf. Adv. Robot. pp. 629-634, Luglio 2015.

[15] R. Dissly D. Baneld. A martian sonic anemometer. IEEE - Aerospace conference, 2005.

[16] Andrea Nannini. Microsistemi. Pisa University Press, 2017.

[17] P.L. McLaughlin. System for isotropically measuring uid movement in three dimensions. U.S patent 6279393, Aug. 28 2001.

[18] D. Klaus R. Klause and F. Uwe. Thermal anemometer. EU patent n. EP1629287, Mar. 1 2006.

[19] Michele Dei e Massimo Piotto Paolo Bruschi. A low-power 2-d wind sensor based on integrated ow meters. IEEE Sensors Journal, 2009. [20] M. M. Zdravkovich. Flow around circular cylinders: a comprehensive

guide through ow phenomena, experiments, application, mathematical models and computer simulation, vol. 1, pp 1-109. Oxford University Press, 1997.

[21] L. DU e Z. Zhao C. Liu. A diretional cylindrical anemometer with four sets of dierential pressure sensors. Rev. Sci. Instrum. vol. 87 pp 035105-1-035105, Mar. 2016.

[22] G. Pennelli M. Piotto and P. Bruschi. Fabrication and characterization of a directional anemometer based on a single chip mems ow sensor. Microelectronic Engineering, 2011.

[23] Paolo Bruschi and Massimo Piotto. Determination of the wind speed and direction by means of uidic-domain signal processing. IEEE Sensors Journal, 2018.

[24] V. Nurra e M. Piotto P. Bruschi. A compact package for integrated silicon thermal gas ow meters. Microsyst Technol, vol. 14 pp. 943-949, Luglio 2008.

[25] STMicroelectronics. Datasheet nucleo stm32 l053r8. Ultimo accesso: 04/09/2019.

Documenti correlati