• Non ci sono risultati.

5.2 Risultati

5.2.1 Verifica

Al fine di far emergere le possibile cause di errore verificatesi nelle prove sperimentali della concentrazione solare si è sfruttata la modalità di verifica, già descritta nel capitolo precedente.

Il tempo di misura è stato di circa 1 ora e 30 minuti, con intervalli fra un’acquisizione e la successiva di 5 ÷ 10 minuti. Dal confronto fra gli sbilan- ciamenti “ideali” forniti dall’algoritmo operativo e quelli “reali” che, secondo la meridiana elettronica, sarebbero stati necessari per ottenere un puntamen- to corretto (figure 5.4 e 5.5), risulta che l’andamento reale non si discosta eccessivamente da quello ideale e, anzi, ci viene data la riprova della sostan- ziale correttezza della nostra implementazione teorica che, però, si scontra con le non idealità del dispositivo reale (imperfezioni geometriche della ma-

schera e nell’allineamento dei fotodiodi, dispersione dei parametri dei vari componenti, imprecisioni della conversione A/D, etc...).

Figura 5.5: Confronto fra ∆YOK (simulato) e ∆Y (effettivo)

Conclusioni

In conclusione si può affermare che lo specchio microrobotico per la concen- trazione solare presentato è sicuramente non ancora ottimizzato e necessita di ulteriori perfezionamenti e indagini per minimizzare l’errore di puntamen- to. D’altro canto mostra ampi margini di miglioramento, potendo contare su componenti più affidabili (ad es. resistenze con tolleranza inferiore poste nel circuito di amplificazione del segnale dei fotodiodi) ed una più accurata realizzazione delle geometrie del sensore della meridiana elettronica. Inoltre il costo complessivo del sistema prototipale (24.94 € utilizzando i motori più economici a disposizione) risulta molto basso e, nell’ottica di una eventua- le produzione su larga scala, è realistica una riduzione del costo al di sotto dei 10 €; in questo modo anche prevedendo l’impiego di un centinaio spec- chi per ottenere la concentrazione solare necessaria, il costo complessivo non supererebbe i 1000 €, cifra che se raffrontata con il costo di altri sistemi di puntamento e focalizzazione ad oggi in vendita, risulta molto contenuta.

Appendice

Codice lato PC

#i n c l u d e <i ostr ea m > #i n c l u d e <f t d 2 x x . h> #i n c l u d e <s t d i o . h> #i n c l u d e <math . h> #i n c l u d e <time . h> #i n c l u d e <s t r i n g . h> # d e f i n e PI 3 . 1 4 1 5 9 2 6 5 4 u s i n g namespace s t d ; v o i d b i n a r i o ( char ∗ bin , i n t d e c i m a l e ){

d e c i m a l e = d e c i m a l e / 2 ; }

}

double l a t i t u d e = 4 4 . 3 0 ;

double l o n g i t u d e = 1 0 . 0 ; // LONGITUDINE RISPETTO A Monte Mario double DELTA= 5 4 . 0 ;

v o i d c a l c o l a _ a z i m u t _ z e n i t ( double anno , double mese , double g i o r n o , double ore , double minuti , double ∗PHIs , double ∗THETAs)

// CALCOLA LA POSIZIONE DEL SOLE ( PHIs a n g o l o z e n i t a l e E THETAs a n g o l o a z i m u t a l e ) // SECONDO L ’ALGORITMO DI Roberto Grena

// PUBBLICATO IN S o l a r Energy 82 ( 2 0 0 8 ) 462470 // anno , mese , g i o r n o : OVVIA INTERPRETAZIONE.

// ora , minuti : ATTENZIONE ! ! ! TEMPO UNIVERSALE ( DI GREENWICH) // UN’ORA INDIETRO RISPETTO AL TMEC (Tempo Medio Europa C e n t r a l e ) // MENO UNA EVENTUALE ORA DI TEMPO LEGALE

// RICORDARE ! ! ! ! ! RESTITUISCE PHIs DA 0 A 360 GRADI, 0 E ’ LA DIREZIONE DEL NORD. { double tg ; double t t ; double ut ; double sum ; double ly , lm , lh , lp , l l ; double t2 ;

double deltagamma , e p s i l o n , gamma , delta_THETAs ; double THETAs_solar , d e l t a _ s o l a r ;

double hh ;

double THETAs_topocentric , d e l t a _ t o p o c e n t r i c ;

double hh_topocentric , c h _ t o p o c e n t r i c , s h _ t o p o c e n t r i c ; double e_zero ;

double PHIs_finale , THETAs_finale ;

ut=o r e+minuti / 6 0 . 0 ; // TEMPO UNIVERSALE ESPRESSO IN ORA E FRAZIONE DI ORA. i f ( mese==1 | | mese ==2){

mese=mese + 1 2 . 0 ; anno=anno −1; }

tg= f l o o r f ( 3 6 5 . 2 5 ∗ ( anno −2000.0))+ f l o o r f ( 3 0 . 6 0 0 1 ∗ ( mese+1))+ g i o r n o+ut / 2 4 . 0 − 1 1 5 8 . 5 ; t t=tg+DELTA/ 8 6 4 0 0 . 0 ; // DA CHIARIRE IL DELTA

sum=1.72019 e−2∗tt −0.0563;

l y =1.74094+1.7202768683 e−2∗ t t +3.34118 e−2∗ s i n ( sum)+3.448 e−4∗ s i n ( 2 . 0 ∗ sum ) ; lm=3.13 e−5∗ s i n ( 0 . 2 1 2 7 7 3 0 ∗ tt − 0 . 5 8 5 ) ; / / MOON PERTURBATION

l h =1.26 e−5∗ s i n ( 4 . 2 4 3 e−3∗ t t +1.46)+2.35 e−5∗ s i n ( 1 . 0 7 2 7 e−2∗ t t +0.72)+2.76 e−5∗ s i n ( 1 . 5 7 9 9 e−2∗ t t +2.35) +2.75 e−5∗ s i n ( 2 . 1 5 5 1 e−2∗tt −1.98)+1.26 e−5∗ s i n ( 3 . 1 4 9 0 e−2∗tt − 0 . 8 ) ; // HARMONIC CORRECTION t2 =0.001∗ t t ;

l p =((( −2.30796 e−7∗t2 +3.7976 e −6)∗ t2 −2.0458 e −5)∗ t2 +3.976 e −5)∗ t2 ∗ t2 ; // POLYNOMIAL CORRECTION l l =l y+lm+l h+l p ;

deltagamma =8.33 e−5∗ s i n ( 9 . 2 5 2 e−4∗tt − 1 . 1 7 3 ) ;

e p s i l o n =−6.21e−9∗ t t +0.409086+4.46 e−5∗ s i n ( 9 . 2 5 2 e−4∗ t t + 0 . 3 9 7 ) ; gamma= l l +PI+deltagamma −9.932 e −5; // GEOCENTRIC SOLAR LONGITUDE THETAs_solar=atan2 ( s i n (gamma)∗ c o s ( e p s i l o n ) , c o s (gamma ) ) ;

d e l t a _ s o l a r=a s i n ( s i n ( e p s i l o n )∗ s i n (gamma ) ) ;

hh =6.30038809903∗ tg +4.8824623+0.9174∗ deltagamma+l o n g i t u d e /180∗ PI−THETAs_solar ; delta_THETAs=−4.26e−5∗ c o s ( l a t i t u d e / 1 8 0 . 0 ∗ PI )∗ s i n ( hh ) ;

// TOPOCENTRIC SUN COORDINATES // RIGHT ASCENSION

THETAs_topocentric=THETAs_solar+delta_THETAs ; // DECLINATION

d e l t a _ t o p o c e n t r i c=d e l t a _ s o l a r −4.26 e −5∗( s i n ( l a t i t u d e / 1 8 0 . 0 ∗ PI)− d e l t a _ s o l a r ∗ c o s ( l a t i t u d e / 1 8 0 . 0 ∗ PI ) ) ; // TOPOCENTRIC HOUR ANGLE

h h _ t o p o c e n t r i c=hh−delta_THETAs ;

c h _ t o p o c e n t r i c=c o s ( hh)+delta_THETAs∗ s i n ( hh ) ; s h _ t o p o c e n t r i c=s i n ( hh)−delta_THETAs∗ c o s ( hh ) ;

// SOLAR ELEVATION ANGLE nota ! ! ! ! NO REFRACTION CORRECTIONS ! ! ! ! e_zero=a s i n ( s i n ( l a t i t u d e / 1 8 0 . 0 ∗ PI )∗ s i n ( d e l t a _ t o p o c e n t r i c )+

c o s ( l a t i t u d e / 1 8 0 . 0 ∗ PI )∗ c o s ( d e l t a _ t o p o c e n t r i c )∗ c h _ t o p o c e n t r i c ) ; // REMEMBER ! ! ! ! ! ! NON REFRACTION CORRECTIONS ! ! ! ! ! ! ! ! !

PH Is_ fin a le=PI /2.0 − e_zero ;

THETAs_finale=atan2 ( s h _ t o p o c e n t r i c , c h _ t o p o c e n t r i c ∗ s i n ( l a t i t u d e / 1 8 0 . 0 ∗ PI)−

tan ( d e l t a _ t o p o c e n t r i c )∗ c o s ( l a t i t u d e / 1 8 0 . 0 ∗ PI ) ) ; ∗PHIs=PH Is _ f in a le /PI ∗ 1 8 0 . 0 ; // RISULTATO IN GRADI SESSADECIMALI

∗THETAs= 1 8 0 . 0 + THETAs_finale/PI ∗ 1 8 0 . 0 ;

// RICORDARE (VEDERE L ’ARTICOLO ) : P HIs _ f i n a l e=0 SE DIREZIONE SUD // FINE ! ! !

r e t u r n ; }

v o i d a l g o r i t m o _ o p e r a t i v o ( double phiB , double thetaB , double phiS , double thetaS , double ∗PHIf_OK , double ∗THETAf_OK, double ∗PhiFV ){

double aux1 , aux2 , PhiFVa , PhiFVb , sinB , sinS , B, S , phiFV , phiF_OK , thetaF_OK ; aux1 = c o s ( phiS ) ∗ c o s ( phiB ) ;

i f ( thetaB < t h e t a S )

aux2=s i n ( phiS )∗ s i n ( phiB )∗ c o s ( thetaS−thetaB ) ; e l s e

aux2 = s i n ( phiS ) ∗ s i n ( phiB ) ∗ c o s ( thetaB−t h e t a S ) ;

phiF_OK = ( a c o s ( aux1 + aux2 ) ) / 2 . 0 ; // " PHIf o b i e t t i v o " che l o s p e c c h i o deve r a g g i u n g e r e ∗PHIf_OK = phiF_OK ;

i f ( thetaB < t h e t a S )

sinB = s i n ( phiS ) ∗ s i n ( t h e t a S − thetaB ) / s i n ( 2 . 0 ∗ phiF_OK ) ; e l s e

sinB = s i n ( phiS ) ∗ s i n ( thetaB − t h e t a S ) / s i n ( 2 . 0 ∗ phiF_OK ) ; i f (phiF_OK == 0)

sinB = 0 ; B = a s i n ( sinB ) ;

i f ( thetaB < t h e t a S )

s i n S = s i n ( phiB ) ∗ s i n ( t h e t a S − thetaB ) / s i n ( 2 . 0 ∗ phiF_OK ) ; e l s e

s i n S = s i n ( phiB ) ∗ s i n ( thetaB − t h e t a S ) / s i n ( 2 . 0 ∗ phiF_OK ) ; S = a s i n ( s i n S ) ;

PhiFVa = a c o s ( c o s (phiF_OK) ∗ c o s ( phiB ) + s i n (phiF_OK) ∗ s i n ( phiB ) ∗ c o s (B) ) ; PhiFVb = a c o s ( c o s (phiF_OK) ∗ c o s ( phiS ) + s i n (phiF_OK) ∗ s i n ( phiS ) ∗ c o s ( S ) ) ;

i f ( sinB>s i n S ) phiFV = PhiFVb ; e l s e phiFV = PhiFVa ; ∗PhiFV = phiFV ; i f ( phiS < phiB )

thetaF_OK = PI − a s i n ( s i n ( phiB ) ∗ sinB / s i n ( phiFV ) ) ; / / "THETAf o b i e t t i v o " . ( b a r i c e n t r o ) e l s e

thetaF_OK = a s i n ( s i n ( phiB ) ∗ sinB / s i n ( phiFV ) ) ; ∗THETAf_OK = thetaF_OK ;

}

v o id algoritmo_di_setup ( double phiF , double thetaF , double phiS , double thetaS , double ∗PHIb , double ∗THETAb, double ∗PhiFV ){

double modulo , sinCHI , cosCHI , CHI , PHIfv , phiB , thetaB ;

modulo = s q r t ( pow ( c o s ( phiF ) , 2) + pow ( s i n ( phiF ) , 2) ∗ pow ( c o s ( thetaF ) , 2) ) ; sinCHI = s i n ( phiF )∗ c o s ( thetaF )/ modulo ;

e l s e

cout << " e r r o r e s u l CHI \n\n\n " ; PHIfv = a c o s ( c o s ( phiS ) / modulo ) − CHI ; ∗PhiFV = PHIfv ;

phiB = a c o s ( c o s ( phiF ) ∗ c o s ( PHIfv ) + s i n ( phiF ) ∗ s i n ( PHIfv ) ∗ c o s ( thetaF ) ) ; ∗PHIb = phiB ;

thetaB = t h e t a S − a c o s ( ( c o s (2∗ phiF ) − c o s ( phiS ) ∗ c o s ( phiB ) ) / ( s i n ( phiS ) ∗ s i n ( phiB ) ) ) ; ∗THETAb = thetaB ; } /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗MAIN∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ i n t main ( ) { /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗DICHIARAZIONE VARIABILI∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ FT_STATUS f t s t a t u s 1 = 0 , f t s t a t u s 2 = 0 ; FT_HANDLE f t h a n d l e , f t h a n d l e 1 , f t h a n d l e 2 ;

DWORD b y t e i n v i a t i ; // , devindex = 0 ; DWORD c o d i c e = 2 1 0 ; // −−> c o d i c e d i s t a r t q u a l s i a s i DWORD dutyL , dutyH , b y t e r i c e v u t i ; // duty c y l e PWM e p a s s i i n mod a li ta passo−p a s s o

DWORD numDevs = 0 ; // num d i s p o s i t i v i c o n n e s s i char ∗ d e s c r P o i n t e r [ 3 ] ;

i n t duty_cycle ; unsigned i n t p a s s i = 1 ;

char d e s c r i t t o r e 1 [ 6 4 ] , d e s c r i t t o r e 2 [ 6 4 ] ; // d e s c r i t t o r e d i s p o s i t i v i c o n n e s s i unsigned char m o da li ta = ’ k ’ ;

unsi gn ed char motore , rxchar , txchar , i n f o , datoTx1 , datoTx2 ;

char rapBin [ 1 6 ] = { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ; // r a p p r e s e n t a z i o n e b i n a r i a d e l c o d i c e r i c e v u t o unsi gn ed i n t n u m _ a c q u i s i z i o n i = 0 ;

i n t angolo , angoloRX , ValInteroDx , ValInteroDy ; double modulo , CHI , sinB , DxPIC ;

double THETAf_OK = 0 . 0 , PHIf_OK=0.0 , aux1 , aux2 , B ; double THETAb, PHIb , THETAs, PHIs ;

double PhiFV ; //PhiFV è l ’ a n g o l o f r a l a v e r t i c a l e p a s s a n t e per l o z e n i t e l ’ a s s e Y d e i FD. i n t r x b u f f [ 4 ] = { 0 , 0 , 0 , 0 } ; // b u f f e r per r i c e z i o n e 4 campioni d i 16 b i t c i a s c u n o d a l p i c double t e n s i o n e [ 4 ] , DeltaX , DeltaY , D, THETAf1 , PHIf1 , THETAf2 , PHIf2 ;

double erroreTHETAf1 , e r r o r e P H I f 1 , somma , deltaTheta , d e l t a P h i , erroreTHETAf2 , e r r o r e P H I f 2 ; double e r r o r e D e l t a X , e r r o r e D e l t a Y , Dx , Dy , e r r o r e a c c e t t a b i l e D x , e r r o r e a c c e t t a b i l e D y ;

c o n s t double h = 1 . 0 ; // d i s t a n z a d e i f o t o d d a l f o r o e s t e r n o

c o n s t double valoreMAX = 1 0 2 3 . 0 ; //1111111111 è i l max v a l o r e che può assumere i l campione a 10 b i t c o n s t double Vref = 5 . 0 ; // t e n s i o n e d i r i f e r i m e n t o d e l c o n v e r t i t o r e A/D

double THETAf3 ;

double sinCHI , cosCHI , PhiFVa , PhiFVb , S , s i n S ; i n t num_acquisizioniK = 0 ;

FILE ∗ stream ; time_t rawtime ; s t r u c t tm ∗ t i m e i n f o ;

double anno , mese , g i o r n o , ore , minuti , minuti1 ; // double ore , minutes ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗SETUP UM232∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ d e s c r P o i n t e r [ 0 ] = d e s c r i t t o r e 1 ;

d e s c r P o i n t e r [ 1 ] = d e s c r i t t o r e 2 ; d e s c r P o i n t e r [ 2 ] = NULL;

do { // v e r i f i c o s e i l d i s p o s i t i v o è c o l l e g a t o

f t s t a t u s 1 = FT_ListDevices ( d e s c r P o i n t e r , &numDevs , FT_LIST_ALL |FT_OPEN_BY_SERIAL_NUMBER) ; i f ( f t s t a t u s 1 == FT_OK && numDevs != 0){

cout << "DISPOSITIVI COLLEGATI " << numDevs << ’\ n ’ ; cout << "NUM s e r i a l e 1 = " << d e s c r P o i n t e r [0] < < ’\n ’ ;

i f ( numDevs == 2) cout << "NUM s e r i a l e 2 = " << d e s c r P o i n t e r [1] < < ’\n ’ ; } e l s e { cout<< " D i s p o s i t i v i non t r o v a t i !"<<’\n ’ <<"Premere un t a s t o e i n v i a per c o n t i n u a r e ..." < < ’\ n ’ ; char tasto_wait ; c i n >> tasto_wait ; } } w h i l e ( numDevs == 0 ) ;

f t s t a t u s 1 = FT_OpenEx( d e s c r i t t o r e 1 , FT_OPEN_BY_SERIAL_NUMBER, &f t h a n d l e 1 ) ; // d i s p o s i t i v o 1 i f ( f t s t a t u s 1 == FT_OK)

cout << ’\ n ’ << "TUTTO BENE, DISPOSITIVO 1 APERTO\n " ; e l s e

cout << "PROBLEMA CON L ’APERTURA DEL DISPOSITIVO 1\n\n\n " ; f t s t a t u s 1 = FT_SetBaudRate ( f t h a n d l e 1 , 2 4 0 0 ) ; // Set baud r a t e to 2400 i f ( f t s t a t u s 1 == FT_OK)

cout << "DISP1 : BAUD RATE SETTATO\n " ; e l s e

cout << "DISP1 : E r r o r e d i s e t t a g g i o baud r a t e \n\n " ;

f t s t a t u s 1 = F T _ S e t D a t a C h a r a c t e r i s t i c s ( f t h a n d l e 1 , FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE) ; i f ( f t s t a t u s 1 == FT_OK)

cout << "DISP1 : FORMATO DATI SETTATO A 8 BIT\n" << f l u s h ; e l s e

cout << "DISP1 : E r r o r e d i s e t t a g g i o formato d a t i \n\n " ; f t s t a t u s 1 = FT_SetTimeouts ( f t h a n d l e 1 , 5000 , 1 0 0 0 ) ;

i f ( f t s t a t u s 1 == FT_OK)

cout << "DISP1 : TIMEOUTS: FT_Read = 5 s , FT_Write = 1 s \n\n " ; e l s e

cout << "DISP1 : ERRORE SETTAGGIO TIMEOUTS FT_Read e FT_Write\n\n " ; i f ( numDevs == 2) {

f t s t a t u s 2 = FT_OpenEx( d e s c r i t t o r e 2 , FT_OPEN_BY_SERIAL_NUMBER, &f t h a n d l e 2 ) ; // d i s p o s i t i v o 2 i f ( f t s t a t u s 2 == FT_OK)

cout << "TUTTO BENE, DISPOSITIVO 2 APERTO\n " ; e l s e

cout << "PROBLEMA CON L ’APERTURA DEL DISPOSITIVO 2\n\n\n " ; f t s t a t u s 2 = FT_SetBaudRate ( f t h a n d l e 2 , 2 4 0 0 ) ; // Set baud r a t e to 2400 i f ( f t s t a t u s 2 == FT_OK)

cout << "DISP2 : BAUD RATE SETTATO\n " ; e l s e

cout << "DISP2 : E r r o r e d i s e t t a g g i o baud r a t e \n\n " ;

f t s t a t u s 2 = F T _ S e t D a t a Ch a r a c t e r i s t i cs ( f t h a n d l e 2 , FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE) ; i f ( f t s t a t u s 2 == FT_OK)

cout << "DISP2 : FORMATO DATI SETTATO A 8 BIT\n" << f l u s h ; e l s e

cout << "DISP2 : E r r o r e d i s e t t a g g i o formato d a t i \n\n " ; f t s t a t u s 2 = FT_SetTimeouts ( f t h a n d l e 2 , 5000 , 1 0 0 0 ) ;

i f ( f t s t a t u s 2 == FT_OK)

cout << "DISP2 : TIMEOUTS: FT_Read = 5 s , FT_Write = 1 s \n\n " ; e l s e

cout << "DISP2 : ERRORE SETTAGGIO TIMEOUTS FT_Read e FT_Write\n\n " ; }

f t h a n d l e 2 = f t h a n d l e ;

cout << "ho i n v e r t i t o g l i f t h a n d l e \n\n " ; }

e l s e

cout << "HAI INSERITO LA SCHEDA PER IL BERSAGLIO !

INSERIRE LA SCHEDA PER LO SPECCHIO\n\n " ; }

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗CICLO INFINITO ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ i n i z i o :

w h i l e ( 1 ) { do {

cout << " S e l e z i o n a QUALE MOTORE comandare ( ’ v ’ o ’ z ’ ) , RAGGIUNGI E MANTIENI THETA e PHI ( ’ x ’ ) ,

CONCENTRAZIONE SOLARE ( ’ c ’ ) , o MERIDIANA SOLARE ( ’m’ ) , o VERIFICA ( ’ k ’ ) ==> " ;

c i n >> motore ; cout << "\n " ;

i f ( motore != ’ v ’ && motore != ’ z ’ && motore != ’ x ’ && motore != ’ c ’ && motore != ’m’ && motore != ’ k ’ )

cout << " S c e l t a non p o s s i b i l e \n\n " ;

} w h i l e ( motore != ’ v ’ && motore != ’ z ’ && motore != ’ x ’ && motore != ’ c ’ && motore != ’m’ && motore != ’ k ’ ) ;

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ;

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &motore , 1 , &b y t e i n v i a t i ) ; // i n v i o s c e l t a motore i f ( ! FT_SUCCESS( f t s t a t u s 1 ) ) cout << "\ n Error e d i s c r i t t u r a \n " ; f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; // r i c e v o OK d a l p i c i f (FT_SUCCESS( f t s t a t u s 1 ) )

cout << r x c h a r << "\n\n " ; //VERIFICO CHE MI SIA RITORNATO IL DATO INVIATO s w i t c h ( motore ){

c a s e ’ x ’ :

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ANGOLO THETA∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ do {

cout << " S e l e z i o n a l ’ a n g o l o THETA i n t e r o d e l b a r i c e n t r o r i s p e t t o a l NORD, ovvero l ’ a s s e x d e l piano d e i FD (EST=90 SUD=180 OVEST=270) [ 0 , 3 6 0 ] ==> " ;

//90= p r o i e z i o n e d e i r a g g i s u l l ’OVEST−−>s o l e a EST c i n >> a n g o l o ; cout << "\n " ; i f ( a n g o l o < 0 | | a n g o l o > 360) cout << " S c e l t a non p o s s i b i l e \n\n " ; } w h i l e ( a n g o l o < 0 | | a n g o l o > 3 6 0 ) ; t x c h a r = a n g o l o % 2 5 6 ; // 8 b i t meno s i g n i f i c a t i v i f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &txchar , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Er rore d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; angoloRX = r x c h a r ;

t x c h a r = a n g o l o >> 8 ;

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &txchar , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Er rore d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; angoloRX += r x c h a r ∗ 2 5 6 ;

i f (FT_SUCCESS( f t s t a t u s 1 ) ) cout << angoloRX << "\n\n " ; THETAf_OK = ( double ) a n g o l o / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . // r a p p r e s e n t a l ’ a n g o l o f r a l a p r o i e z d e i r a g g i d e l s o l e // s u l piano d e i FD e l ’ a s s e x n e l piano d e i FD /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ANGOLO PHI∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ do { cout << " S e l e z i o n a l ’ a n g o l o PHI i n t e r o [ −90 , 9 0 ] ==> " ; // a n g o l o c a l c o l a t o a p a r t i r e d a l l a p e r p e n d i c o l a r e a l piano d e i FD c i n >> a n g o l o ; cout << "\n " ; i f ( a n g o l o < 0 | | a n g o l o > 90) cout << " S c e l t a non p o s s i b i l e \n\n " ; } w h i l e ( a n g o l o < 0 | | a n g o l o > 9 0 ) ; PHIf_OK = double ( a n g o l o ) / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i i f (PHIf_OK == 0 . 0 && THETAf_OK != 0 . 0 ) {

cout << " Hai i n s e r i t o PHI = 0 , q u e s t a s c e l t a ammette

s o l t a n t o Theta = 0 . Theta s a r à imposto a 0 " ; THETAf_OK = 0 . 0 ;

}

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ;

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &angolo , 1 , &b y t e i n v i a t i ) ; / / i n v i o PHIf_OK i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Erro re d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; / / r i c e v o OK d a l p i c i f (FT_SUCCESS( f t s t a t u s 1 ) )

cout << ( i n t ) r x c h a r << "\n\n " ; break ;

c a s e ’ c ’ :

cout << "OCCHIO CHE L ’ULTIMA DOMENICA DI MARZO E OTTOBRE C’ è IL CAMBIO ORA SOLARE−LEGALE E VICEVERSA! \ n " ;

cout << "CON L ’ORA LEGALE BISOGNA TOGLIERE UNA UNITà ALL’ORA CHE SI PASSA ALL’ALGORITMO COMPLESSO\n\n " ; break ;

c a s e ’ v ’ : c a s e ’ z ’ :

do {

cout << " S e l e z i o n a i l comando f r a i s e g u e n t i : \ n\n " ; cout << "− o : Rotazione CONTINUA i n s e n s o ORARIO\n " ; cout << "− a : Rotazione CONTINUA i n s e n s o ANTIORARIO\n " ; cout << "− p : Rotazione PASSO PASSO i n s e n s o ORARIO\n " ; cout << "− q : Rotazione PASSO PASSO i n s e n s o ANTIORARIO\n " ; cout << "− s : s t o p \n\n " ;

c i n >> mo d a l ita ; cout << "\n " ;

i f ( mod a li ta != ’ o ’ && mo d al ita != ’ a ’ && m o d a li t a != ’ p ’ && mo d a lita != ’ q’&& mod ali ta != ’ s ’ )

cout << "Comando non r i c o n o s c i u t o \n\n " ; } w h i l e ( m o d a li t a != ’ o ’ && mo d a lita != ’ a ’ && m od al it a != ’ p ’ &&

mo d a lita != ’ q’&& mod ali ta != ’ s ’ ) ; f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; // i n v i o mo d al i ta d i r o t a z i o n e o s t o p

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &modalita , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

i f ( mo d a l ita == ’ p ’ | | m o d al i ta == ’ q ’ ) { // p a s s o p a s s o cout << "Numero p a s s i ( min 0 , max 2 5 5 ) : " ;

c i n >> p a s s i ; cout << e n d l ;

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ;

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &p a s s i , 1 , &b y t e i n v i a t i ) ; // i n v i o p a s s i i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Erro re d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; // r i c e v o OK i f (FT_SUCCESS( f t s t a t u s 1 ) ) cout << ( i n t ) r x c h a r << "\n\n " ; } e l s e i f ( mo d a lit a == ’ o ’ | | m od a lit a == ’ a ’ ) { // r o t a z c o n t i n u a cout << " I n s e r i r e v a l o r e duty c y c l e [0 −640 per s e n s o o r a r i o , 400−1280 per a n t i o r a r i o ] : " ; c i n >> duty_cycle ; cout << "\n\n " ; dutyL = duty_cycle % 2 5 6 ; dutyH = duty_cycle >> 8 ;

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ;

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &dutyL , 1 , &b y t e i n v i a t i ) ; // i n v i o dutyL i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Erro re d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &dutyH , 1 , &b y t e i n v i a t i ) ; // i n v i o dutyH i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Erro re d i s c r i t t u r a \n " ; }

} // f i n e s w i t c h ( motore )

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ACQUISIZIONE DATI∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ f o r ( i n t num_passi = 0 ; num_passi < p a s s i ; num_passi++) { a c q u i s i z i o n i :

// r i c e v o i n f o su q u a l e motore s t o muovendo

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &i n f o , 1 , &b y t e r i c e v u t i ) ; // a l primo c i c l o non v i e n e stampato n u l l a a schermo p e r c h è // ’ i n f o ’ c o n t i e n e i l v a l o r e ’w’

// v = motore deltaX // z = motore d e l t a y

i f ( i n f o == ’ a ’ )

p r i n t f ("LUCE SCARSA −−> MUOVO ’V’ " ) ; e l s e i f ( i n f o == ’ b ’ )

p r i n t f (" o l t r e ERR GROSSOLANO d i deltaY −−> MUOVO ’Z ’ " ) ; e l s e i f ( i n f o == ’ c ’ )

p r i n t f (" o l t r e ERR OK per deltaX −−> MUOVO ’V’ " ) ; e l s e i f ( i n f o == ’ d ’ )

p r i n t f (" o l t r e ERR GROSSOLANO per deltaX −−> MUOVO ’V’ " ) ; e l s e i f ( i n f o == ’ e ’ )

p r i n t f (" o l t r e ERR OK per deltaY −−> MUOVO ’Z ’ " ) ; e l s e i f ( i n f o == ’ f ’ )

p r i n t f ("OBIETTIVO RAGGIUNTO" ) ; // r i c e v o campioni d a i f o t o d i o d i

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; // s t a r t a c q u i s i z i o n e i −esimo campione

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; // r i c e v o g l i 8 b i t meno s i g n i f i c a t i v i

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; r x b u f f [ i ] = r x c h a r ;

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; // i n v i o s e g n a l e d i s t a r t

f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; // r i c e v o g l i 8 b i t più s i g n i f i c a t i v i

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; r x b u f f [ i ] += r x c h a r ∗ 2 5 6 ;

} // f i n e c i c l o f o r

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ALGORITMO MERIDIANA NUOVA∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ // A QUESTO PUNTO LO SPECCHIO DEVE ESSERE POSIZIONATO

//IN MODO DA RIFLETTERE SUL BERSAGLIO

THETAf1 = THETAf2 ; // a l primo c i c l o assumeranno d e i v a l o r i c a s u a l i . PHIf1 = PHIf2 ;

erroreTHETAf1 = erroreTHETAf2 ; e r r o r e P H I f 1 = e r r o r e P H I f 2 ;

somma = ( double ) ( r x b u f f [ 0 ] + r x b u f f [ 1 ] + r x b u f f [ 2 ] + r x b u f f [ 3 ] ) ;

DeltaY = ( double ) 1 . 5 ∗ ( r x b u f f [ 0 ] + r x b u f f [ 1 ] − r x b u f f [ 2 ] − r x b u f f [ 3 ] ) / somma ; DeltaX = ( double ) 1 . 5 ∗ ( r x b u f f [ 1 ] + r x b u f f [ 3 ] − r x b u f f [ 0 ] − r x b u f f [ 2 ] ) / somma ; D = s q r t ( DeltaX ∗ DeltaX + DeltaY ∗ DeltaY ) ;

THETAf2 = atan2 ( DeltaX , DeltaY ) ;

// anche s e deltaY non è p e r f e t t a m e n t e u g u a l e a 0 pongo THETAf2 = 0 i f ( f a b s ( DeltaY ) < 0 . 1 && f a b s ( DeltaX ) < 0 . 1 )

THETAf2 = 0 . 0 ;

PHIf2 = atan2 (D, h ) ; // i n r a d i a n t i ! RISPETTO ALLA PERPENDICOLARE AL FORO THETAf3 = THETAf2 ; // var d i comodo per l a f u n z i o n e d i meridiana

i f (THETAf2 < 0 . 0 )

THETAf2 = 2∗ PI + THETAf2 ; // c o s ì THETAf è sempre p o s i t i v o d e l t a T h e t a = (THETAf2 − THETAf1 ) ;

d e l t a P h i = ( PHIf2 − PHIf1 ) ;

// avendo c a l c o l a t o THETAf2 e PHIf2 n e l l a c o n d i z i o n e d i r i f l e s s i o n e s u l b e r s a g l i o // devo c a l c o l a r e THETAs e PHIs mediante l ’ a l g o r i t m o c o m p u t a z i o n a l e complesso // e s f r u t t a r e l e f o r m u l e d e i t r i a n g o l i s f e r i c i

// per r i c a v a r e THETAb e PHIb

minuti1 = minuti ; // s a l v o i n f o s u i minuti prima d i a g g i o r n a r l i time (&rawtime ) ;

t i m e i n f o = l o c a l t i m e (&rawtime ) ; // s a l v o data e ora d e l l ’ a c q u i s i z i o n e minuti = t i m e i n f o −>tm_min ;

o r e = t i m e i n f o −>tm_hour ; g i o r n o = t i m e i n f o −>tm_mday ;

mese = t i m e i n f o −>tm_mon + 1 . 0 ; // i n q u e s t o modo g e n n a i o = 1

anno = t i m e i n f o −>tm_year + 1 9 0 0 . 0 ; // tm_year dà g l i anni che sono p a s s a t i d a l 1900 i f ( motore == ’m’ ) {

c a l c o l a _ a z i m u t _ z e n i t ( anno , mese , g i o r n o , ore −2.0 , minuti , &PHIs , &THETAs ) ; // ora s o l a r e : ore −1 .0 ; ora l e g a l e : ore −2.0

THETAs = THETAs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO AZIMUTALE r i s p e t t o a l NORD PHIs = PHIs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO ZENITALE

}

i f ( motore == ’ k ’ ) {

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ALGORITMO COMPLESSO ∗∗∗∗∗∗∗∗∗/

c a l c o l a _ a z i m u t _ z e n i t ( anno , mese , g i o r n o , ore −2.0 , minuti , &PHIs , &THETAs ) ; // ora s o l a r e : ore −1 .0 ; ora l e g a l e : ore −2.0

THETAs = THETAs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO AZIMUTALE r i s p e t t o a l NORD PHIs = PHIs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO ZENITALE

algoritmo_di_setup ( PHIf2 , THETAf2 , PHIs , THETAs, &PHIb ,&THETAb, &PhiFV ) ; cout << "THETAs = " << THETAs ∗180/ PI << "\n " ;

cout << "PHIs = " << PHIs ∗180/ PI << "\n " ; cout << "THETAf2 = " << THETAf2 ∗180/ PI << "\n " ; cout << " PHIf2 = " << PHIf2 ∗180/ PI << "\n " ; cout << "PhiFV = " << PhiFV ∗180/ PI << "\n " ;

cout << "PHIb = " << PHIb ∗180/ PI << "\n " ; cout << "THETAb = " << THETAb ∗180/ PI << "\n\n " ; } // f i n e ( i f n u m _ a c q u i s i z i o n i == 0)

/∗∗∗∗∗∗∗ QUESTA PARTE VIENE SVOLTA SEMPRE (ALGORITMO OPERATIVO) ∗∗∗∗∗∗∗/

//SFRUTTO LE FORMULE DEI TRIANGOLI SFERICI per r i c a v a r e // g l i a n g o l i da r a g g i u n g e r e con l o s p e c c h i o

a l g o r i t m o _ o p e r a t i v o ( PHIb , THETAb, PHIs , THETAs, &PHIf_OK ,&THETAf_OK, &PhiFV ) ; i f ( num_acquisizioniK == 0){

// dopo i l primo c i c l o thetaf_ok e phif_ok vengono cmq st ampati a schermo // ( v e d i c o d i c e più s o t t o )

cout << "THETAf_OK = " << THETAf_OK ∗ 180/ PI << "\n " ; cout << "PHIf_OK = " << PHIf_OK ∗ 180/ PI << "\n\n " ; }

Dy = h ∗ tan (PHIf_OK) ∗ c o s (THETAf_OK) ; // i l meno non c i va p e r c h è THETAf_OK è q u e l l o d e l b a r i c e n t r o d e l l e t e n s i o n i !

Dx = tan (THETAf_OK) ∗ Dy ; } // f i n e i f ( motore == ’ k ’ ) i f ( motore == ’ c ’ ) {

/∗∗∗∗∗∗∗∗∗∗ ALGORITMO COMPLESSO −> r i c a v o THETAs e PHIs ∗∗∗∗∗∗∗∗∗∗∗/

c a l c o l a _ a z i m u t _ z e n i t ( anno , mese , g i o r n o , ore −2.0 , minuti , &PHIs , &THETAs ) ; // ora s o l a r e : ore −1 .0 ; ora l e g a l e : ore −2.0

THETAs = THETAs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO AZIMUTALE r i s p e t t o a l NORD PHIs = PHIs / 1 8 0 . 0 ∗ PI ; // i n r a d i a n t i . ANGOLO ZENITALE

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ f i n o a q u i ho THETAf2 PHIf2 THETAs PHIs ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ i f ( n u m _ a c q u i s i z i o n i == 0){

// c a l c o l o THETAb e PHIb s o l t a n t o a l primo c i c l o p e r c h è // l a p o s i z i o n e d e l b e r s a g l i o rimane c o s t a n t e

algoritmo_di_setup ( PHIf2 , THETAf2 , PHIs , THETAs, &PHIb ,&THETAb, &PhiFV ) ; cout << "THETAs = " << THETAs ∗180/ PI << "\n " ;

cout << "PHIs = " << PHIs ∗180/ PI << "\n " ; cout << "THETAf2 = " << THETAf2 ∗180/ PI << "\n " ; cout << " PHIf2 = " << PHIf2 ∗180/ PI << "\n " ; cout << "PhiFV = " << PhiFV ∗180/ PI << "\n " ; cout << "PHIb = " << PHIb ∗180/ PI << "\n " ; cout << "THETAb = " << THETAb ∗180/ PI << "\n\n " ; } // f i n e ( i f n u m _ a c q u i s i z i o n i == 0)

/∗∗∗∗∗∗∗ QUESTA PARTE VIENE SVOLTA SEMPRE (ALGORITMO OPERATIVO) ∗∗∗∗∗∗∗/ //SFRUTTO LE FORMULE DEI TRIANGOLI SFERICI per r i c a v a r e

// g l i a n g o l i da r a g g i u n g e r e con l o s p e c c h i o

a l g o r i t m o _ o p e r a t i v o ( PHIb , THETAb, PHIs , THETAs, &PHIf_OK ,&THETAf_OK, &PhiFV ) ; i f ( n u m _ a c q u i s i z i o n i == 0){

// dopo i l primo c i c l o thetaf_ok e phif_ok vengono cmq stam pa ti // a schermo ( v e d i c o d i c e più s o t t o )

cout << "THETAf_OK = " << THETAf_OK ∗ 180/ PI << "\n " ; cout << "PHIf_OK = " << PHIf_OK ∗ 180/ PI << "\n\n " ; }

} // f i n e i f ( motore == ’ c ’ )

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ VALORI OBIETTIVO DI DELTAX E DELTAY ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ i f ( motore == ’ x ’ | | motore == ’ c ’ ) {

// h ∗ tanPHI / s q r t (tanTHETA∗tanTHETA + 1 . 0 ) ) ; Dy = h ∗ tan (PHIf_OK) ∗ c o s (THETAf_OK) ; Dx = tan (THETAf_OK) ∗ Dy ;

ValInteroDx = ( i n t ) ( f a b s (Dx) ∗ 1 4 0 0 0 . 0 + 0 . 5 ) ; ValInteroDy = ( i n t ) ( f a b s (Dy) ∗ 1 6 0 0 0 . 0 + 0 . 5 ) ;

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ INVIO FABS(DX) E IL SUO SEGNO ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

datoTx1 = ValInteroDx % 2 5 6 ; // i l deltaTHETA s e l o c a l c o l a i l PIC da s o l o datoTx2 = ValInteroDx >> 8 ; i f (Dx >= 0 . 0 ) t x c h a r = 0 ; // i n v i o i n f o s u l segno d i Dx e l s e t x c h a r = 1 ; / / Dx n e g a t i v o /∗∗ p r i m i 8 b i t ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &datoTx1 , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Errore d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; DxPIC = ( f l o a t ) ( r x c h a r / 1 4 0 0 0 . 0 ) ;

/∗∗ s e c o n d i 8 b i t ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &datoTx2 , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Err or e d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; DxPIC += ( f l o a t ) ( r x c h a r / 1 4 0 0 0 . 0 ∗ 2 5 6 ) ;

/∗∗ segno ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &txchar , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Erro re d i s c r i t t u r a \n " ;

f t s t a t u s 1 = FT_Read( f t h a n d l e 1 , &rxchar , 1 , &b y t e r i c e v u t i ) ; cout << "\ nsegno = " << ( i n t ) r x c h a r << "\n " ;

i f ( ( i n t ) r x c h a r == 1) DxPIC = −DxPIC ;

cout << "DxPIC = "<< DxPIC << "("<< Dx << ")\ n " ; /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ INVIO Dy ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/

datoTx1 = ValInteroDy % 2 5 6 ; // i l deltaTHETA s e l o c a l c o l a i l PIC da s o l o datoTx2 = ValInteroDy >> 8 ; i f (Dy >= 0 . 0 ) t x c h a r = 0 ; // i n v i o i n f o s u l segno d i Dx e l s e t x c h a r = 1 ; / / Dx n e g a t i v o /∗∗ p r i m i 8 b i t ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &datoTx1 , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Errore d i s c r i t t u r a \n " ; /∗∗ s e c o n d i 8 b i t ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &datoTx2 , 1 , &b y t e i n v i a t i ) ; i f ( ! FT_SUCCESS( f t s t a t u s 1 ) )

cout << "\ n Errore d i s c r i t t u r a \n " ; /∗∗ segno ∗∗/

f t s t a t u s 1 = FT_Purge ( f t h a n d l e 1 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 1 = FT_Write ( f t h a n d l e 1 , &txchar , 1 , &b y t e i n v i a t i ) ;

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ i f ( f a b s (Dx) < 1 . 0 ) e r r o r e a c c e t t a b i l e D x = 0 . 0 0 5 ; e l s e i f ( f a b s (Dx) < 2 . 5 ) e r r o r e a c c e t t a b i l e D x = 0 . 0 0 5 ∗ f a b s (Dx ) ; e l s e e r r o r e a c c e t t a b i l e D x = 0 . 0 1 ∗ f a b s (Dx ) ; i f ( f a b s (Dy) < 1 . 0 ) e r r o r e a c c e t t a b i l e D y = 0 . 0 0 5 ; e l s e i f ( f a b s (Dy) < 2 . 5 ) e r r o r e a c c e t t a b i l e D y = 0 . 0 0 5 ∗ f a b s (Dy ) ; e l s e e r r o r e a c c e t t a b i l e D y = 0 . 0 1 ∗ f a b s (Dy ) ;

e r r o r e D e l t a X = f a b s ( DeltaX − Dx ) ; //mi i n t e r e s s a i l modulo e r r o r e D e l t a Y = f a b s ( DeltaY − Dy ) ; //mi i n t e r e s s a i l modulo

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗STAMPA RISULTATI A SCHERMO∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ cout << "\n\n\n\n " ;

cout << "DATA: " << a s c t i m e ( t i m e i n f o ) << "\n " ; p r i n t f ("ACQUISIZIONE %d \n " , n u m _ a c q u i s i z i o n i ) ; f o r ( i n t i =0; i <4; i ++){

f o r ( i n t s =0; s <16; s++)

rapBin [ s ] = 0 ; // i n i z i a l i z z o a 0 l a rappr b i n a r i a d e l campione b i n a r i o ( rapBin , r x b u f f [ i ] ) ; // c o n v e r s i o n e da d e c i m a l e ( r x b u f f ) a b i n a r i o ( rapBin ) t e n s i o n e [ i ] = ( double ) r x b u f f [ i ] / valoreMAX∗ Vref ;

p r i n t f (" Campione %d : %4d B i n a r i o : " , ( i ) , r x b u f f [ i ] ) ; f o r ( i n t s =15; s >=0; s−−) cout << ( i n t ) rapBin [ s ] ; p r i n t f (" Tensione [V ] : %10 f \n " , t e n s i o n e [ i ] ) ; } p r i n t f ("\nSomma : %8f \n " , somma ) ; p r i n t f ("\ nDeltaY [mm] : %8f (−−>%8f ) DeltaX [mm] : %8f (−−>%8f ) D[mm] : %8f \n " , DeltaY , Dy , DeltaX , Dx , D) ; i f ( motore == ’ c ’ | | motore == ’ x ’ ) p r i n t f ("\ n e r r o r e D e l t a Y [mm]:%8 f(−−>%8f ) e r r o r e D e l t a X [mm]:%8 f(−−>%8f )\ n " , e r r o r e D e l t a Y , e r r o r e a c c e t t a b i l e D y , e r r o r e D e l t a X , e r r o r e a c c e t t a b i l e D x ) ; i f ( motore == ’m’ )

p r i n t f ("\nTHETAf+180: %8f (−−>(THETAs) = %8f ) PHIf : %8f (−−>%8f ) \n " , THETAf3∗ 1 8 0 . 0 / PI +180.0 , THETAs∗ 1 8 0 . 0 / PI , PHIf2 ∗ 1 8 0 . 0 / PI , PHIs ∗ 1 8 0 . 0 / PI ) ;

e l s e i f ( motore == ’ v ’ | | motore == ’ z ’ | | motore == ’ x ’ ) p r i n t f ("\nTHETAf : %8f (−−>%8f ) PHIf : %8f (−−>%8f ) \n " , THETAf2∗ 1 8 0 . 0 / PI , THETAf_OK∗ 1 8 0 . 0 / PI , PHIf2 ∗ 1 8 0 . 0 / PI , PHIf_OK∗ 1 8 0 . 0 / PI ) ;

e l s e { // motore = c e motore = k

p r i n t f ("\nTHETAf : %8f (−−>(THETAf_OK) = %8f ) PHIf :%8 f(−−>%8f )\ n " , THETAf2∗ 1 8 0 . 0 / PI ,THETAf_OK∗ 1 8 0 . 0 / PI , PHIf2 ∗ 1 8 0 . 0 / PI , PHIf_OK∗ 1 8 0 . 0 / PI ) ;

p r i n t f ("\nTHETAs : %8f PHIs : %8f \n " , THETAs∗ 1 8 0 . 0 / PI , PHIs ∗ 1 8 0 . 0 / PI ) ; p r i n t f ("\nTHETAb: %8f PHIb : %8f \n " , THETAb∗ 1 8 0 . 0 / PI , PHIb ∗ 1 8 0 . 0 / PI ) ; }

i f ( motore == ’ x ’ | | motore == ’ c ’ ) {

erroreTHETAf2 = f a b s (THETAf2 − THETAf_OK) ∗ 1 8 0 . 0 / PI ; e r r o r e P H I f 2 = f a b s ( PHIf2 − PHIf_OK) ∗ 1 8 0 . 0 / PI ; p r i n t f ("\ nerroreTHETAf2 : %8f e r r o r e P H I f 2 : %8f \n " ,

erroreTHETAf2 , e r r o r e P H I f 2 ) ; }

i f ( motore == ’ c ’ && numDevs == 2){

// i n v i o r i c h i e s t a d i i n v i o campioni d a i FD s u l b e r s a g l i o r i c h i e s t a :

f t s t a t u s 2 = FT_Purge ( f t h a n d l e 2 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 2 = FT_Write ( f t h a n d l e 2 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; f t s t a t u s 2 = FT_Read( f t h a n d l e 2 , &rxchar , 1 , &b y t e r i c e v u t i ) ; i f (FT_SUCCESS( f t s t a t u s 2 ) )

i f ( b y t e r i c e v u t i != 1) goto r i c h i e s t a ; i f ( ! FT_SUCCESS( f t s t a t u s 2 ) ) goto r i c h i e s t a ; // r i c e v o d a t i d a i f o t o d i o d i s u l b e r s a g l i o f o r ( i n t i =0; i <4; i ++){

f t s t a t u s 2 = FT_Purge ( f t h a n d l e 2 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 2 = FT_Write ( f t h a n d l e 2 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; f t s t a t u s 2 = FT_Read( f t h a n d l e 2 , &rxchar , 1 , &b y t e r i c e v u t i ) ; r x b u f f [ i ] = r x c h a r ;

f t s t a t u s 2 = FT_Purge ( f t h a n d l e 2 , FT_PURGE_RX | FT_PURGE_TX) ; f t s t a t u s 2 = FT_Write ( f t h a n d l e 2 , &c o d i c e , 1 , &b y t e i n v i a t i ) ; f t s t a t u s 2 = FT_Read( f t h a n d l e 2 , &rxchar , 1 , &b y t e r i c e v u t i ) ; r x b u f f [ i ] += r x c h a r ∗ 2 5 6 ;

} // f i n e c i c l o f o r

p r i n t f ("FD1 : %−10d FD2 : %−10d FD3 : %−10d FD4 : %−10d\n " , r x b u f f [ 0 ] , r x b u f f [ 1 ] , r x b u f f [ 2 ] , r x b u f f [ 3 ] ) ; } // f i n e i f ( motore == ’ c ’ && numDevs == 2)

cout << "\n " ;

n u m _ a c q u i s i z i o n i++; // incremento l ’ i n d i c e

/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗SALVATAGGIO DATI SU FILE TXT∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/ s w i t c h ( motore ) {

case ’ k ’ :

i f ( ( stream = fopen ("VERIFICA .TXT" , "a " ) ) != NULL){ i f ( num_acquisizioniK == 0){

f p r i n t f ( stream , "DATA: %s \n\n\n " , a s c t i m e ( t i m e i n f o ) ) ;

f p r i n t f ( stream , " Minuti THETAs

PHIs THETAb PHIb THETAf_OK THETAf PHIf_OK PHIf

Dx DeltaX Dy DeltaY FD0 FD1 FD2 FD3\n " ) ; } f p r i n t f ( stream , "%−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−5d

%−5d %−5d %−5d\n " , minuti , THETAs∗ 1 8 0 . 0 / PI , PHIs ∗ 1 8 0 . 0 / PI , THETAb∗ 1 8 0 . 0 / PI , PHIb ∗ 1 8 0 . 0 / PI , THETAf_OK∗ 1 8 0 . 0 / PI ,

PHIf_OK∗ 1 8 0 . 0 / PI , THETAf2∗ 1 8 0 . 0 / PI , PHIf2 ∗ 1 8 0 . 0 / PI , Dx , DeltaX , Dy , DeltaY , r x b u f f [ 0 ] , r x b u f f [ 1 ] , r x b u f f [ 2 ] , r x b u f f [ 3 ] ) ; f c l o s e ( stream ) ; } e l s e p r i n t f ( " Problema n e l l ’ a p e r t u r a d e l f i l e \n" ) ; break ; c a s e ’m’ :

i f ( ( stream = fopen ("MERIDIANA.TXT" , "a " ) ) != NULL){ i f ( n u m _ a c q u i s i z i o n i == 1){

f p r i n t f ( stream , "DATA: %s \n\n\n " , a s c t i m e ( t i m e i n f o ) ) ;

FD2 FD3\n " ) ; }

f p r i n t f ( stream , "%−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f

%−10 f %−5d %−5d %−5d %−5d\n " , minuti , THETAs∗ 1 8 0 . 0 / PI , PHIs ∗ 1 8 0 . 0 / PI ,

(THETAf3∗ 1 8 0 . 0 / PI )+ 18 0.0 , PHIf2 ∗ 1 8 0 . 0 / PI , Dx , Dy , DeltaX , DeltaY , r x b u f f [ 0 ] , r x b u f f [ 1 ] , r x b u f f [ 2 ] , r x b u f f [ 3 ] ) ; f c l o s e ( stream ) ; } e l s e p r i n t f ( " Problema n e l l ’ a p e r t u r a d e l f i l e \n" ) ; break ; c a s e ’ c ’ :

i f ( ( stream = fopen ("CONCENTRAZIONE.TXT" , "a " ) ) != NULL){ i f ( n u m _ a c q u i s i z i o n i == 1){

f p r i n t f ( stream , "DATA: %s \n\n\n " , a s c t i m e ( t i m e i n f o ) ) ;

f p r i n t f ( stream , " Minuti THETAs PHIs THETAb PHIb THETAf_OK

PHIf_OK Dx DeltaX Dy DeltaY FD0 FD1 FD2 FD3\n " ) ;

}

e l s e i f ( minuti1 != minuti ){ // s a l v o su f i l e s o l t a n t o una v o l t a a l minuto

//( t a n t o THETAs e PHIs v a r i a n o una v o l t a a l minuto )

f p r i n t f ( stream , "%−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f

%−10 f %−10 f %−10 f %−10 f %−5d %−5d %−5d %−5d\n " ,

minuti , THETAs∗ 1 8 0 . 0 / PI , PHIs ∗ 1 8 0 . 0 / PI ,

THETAb∗ 1 8 0 . 0 / PI , PHIb ∗ 1 8 0 . 0 / PI , THETAf_OK∗ 1 8 0 . 0 / PI , PHIf_OK∗ 1 8 0 . 0 / PI , Dx , DeltaX , Dy , DeltaY ,

r x b u f f [ 0 ] , r x b u f f [ 1 ] , r x b u f f [ 2 ] , r x b u f f [ 3 ] ) ; f c l o s e ( stream ) ; } } e l s e p r i n t f ( " Problema n e l l ’ a p e r t u r a d e l f i l e \n" ) ; break ; c a s e ’ x ’ :

i f ( ( stream = fopen ("CONTROLLO.TXT" , "a " ) ) != NULL){ i f ( n u m _ a c q u i s i z i o n i == 1){

f p r i n t f ( stream , "DATA: %s \n\n\n " , a s c t i m e ( t i m e i n f o ) ) ;

f p r i n t f ( stream , " Minuti THETAf_OK PHIf_OK THETAf PHIf ErroreTheta E r r o r e P h i ErroreDeltaX ErroreDeltaY \n " ) ;

}

f p r i n t f ( stream , "%−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f %−10 f \n " ,

minuti , THETAf_OK∗ 1 8 0 . 0 / PI , PHIf_OK∗ 1 8 0 . 0 / PI , THETAf2∗ 1 8 0 . 0 / PI , PHIf2 ∗ 1 8 0 . 0 / PI , erroreTHETAf2 , e r r o r e P H I f 2 , e r r o r e D e l t a X , e r r o r e D e l t a Y ) ;

f c l o s e ( stream ) ; }

p r i n t f ( " Problema n e l l ’ a p e r t u r a d e l f i l e \n" ) ; } i f ( motore == ’ c ’ | | motore == ’ x ’ ) goto a c q u i s i z i o n i ; e l s e i f ( motore == ’m’ ) { f o r ( i n t z = 1 ; z >0; z−−){ // r i t a r d o d i 1 minuto cout << z << " " << f l u s h ; s l e e p ( 1 ) ; } goto a c q u i s i z i o n i ; }

} // f i n e c i c l o f o r ( i n t num_passi = 0 ; num_passi < p a s s i ; num_passi++) i f ( motore == ’ k ’ ) num_acquisizioniK++; n u m _ a c q u i s i z i o n i = 0 ; p a s s i = 1 ; } // f i n e w h i l e ( 1 ) r e t u r n 0 ;

[1] Roberto Grena, An algorithm for the computation of the solar position. Elsevier, 2007

[2] CPV Consortium, CONVEGNO INTERNAZIONALE - FOTOVOL- TAICO A CONCENTRAZIONE - il dispiegamento sul mercato di una tecnologia avanzata a elevata producibilità. Solar Expo, 4 Maggio 2011, Verona

[3] A. Prest, H Grassmann, The linear mirror for solar energy exploitation. Il Nuovo Cimento, 2009

[4] M. Falchetta, Il programma ENEA sull’energia solare a concentrazione ad alta temperatura. ENEA Centro Ricerche, 2006

[5] Nancy Hartsoch, CPV Industry Overview. CPV Consortium, 2011

[6] A. Rifatto, Lezioni ed esercizi di astronomia,

www.na.astro.it/~rifatto/personale/dispense_di_astronomia.pdf. 2003

[7] Sid Katzen, The Essential PIC18® Microcontroller. Springer, 2010 [8] Mauro Laurenti, C18 Step By Step. 2009

[9] Microchip, MPLAB® C18 C COMPILER LIBRARIES. 2005 [10] Microchip, PIC18F2331/2431/4331/4431 Data Sheet. 2010

[11] Microchip, PIC18 CONFIGURATION SETTINGS ADDENDUM. 2006 [12] FTDI, UM232R USB - Serial UART Development Module Datasheet,

2011

[13] Como Drills, Low Voltage D.C. Motors & Gearbox Units. 2012

[14] Impianto Gemasolar, http://www.focus.it/scienza/energia/03112011- 1023-478-il-sole-anche-di-notte_C38.aspx, 2012

[15] Efficienza di conversione,http://www.comisaenergy.it/ITA/Efficienza.asp?area=1&percorso=11,

2012

[16] Franco Martinelli, La sfera celeste,

http://www.nauticoartiglio.lu.it/almanacco/quaderni/www/sfera/WITN_sfera_2.htm, 2012

[17] Mauro Bertolini, Mini corso di trigonometria sferica,

http://www.nauticoartiglio.lu.it/didattica/trigsfer/trigsferica.htm, 2012

[18] La Terra e la luna. http://www.icsbaunei.nu.it/scienze%20ipertesto/nuova_pagina_11.htm, 2012

Documenti correlati