Salve a Tutti Voi:
Ho trovato un vecchio progetto per navigazione gps e bussola Arduino uno , da mettere su un robot.
Intanto lo ho rifatto tutto, adeguandolo ad una RC Car con ESC e sterzo con servo.
Al momento è quasi pronto, se non fosse per il problema che mi manca la bussola elettronica.
Di seguito allego il listato del programma, la mia domanda è : dovro' usare per forza quel modello di sensore bussola.
oppure ne potrei mettere una qualsiasi?
lesto:
puoi modificare il codice per usare qualsiasi tipo di "bussola", o meglio magnetometro.
Aggiungiamo pure il fatto che con Arduino non puoi calcolare in modo preciso il vettore, distanza e angolo, che separano due coordinate GPS perché la matematica è a solo 32 bit, serve la matematica a 64 bit per farlo con sufficiente precisione, con 32 bit hai un cerchio di confusione di circa 150-200 metri per la distanza da 5° a 12° per l'angolo.
edit:
Ho controllato i reali valori degli errori con calcoli fatti da Arduino (matematica a 32 bit) verificando i dati che avevo ricavato diverso tempo fa con prove basate su coppie di coordinate GPS note, ho corretto di conseguenza i valori che avevo scritto prima affidandomi alla memoria.
Ragazzi vi ringrazio vivamente, è il primo progetto con gps che faccio, e avro' da tribolare.
Grazie ancora a Tutti per i consigli. Vi posto un link di un progetto simile a quello che sto facendo io: Ciao Stefano
Se non vi interessa la velocità e lo sketch non occupa molte risorse di suo, il compilatore avr-gcc permette di usare la matematica a 64 bit. Ovviamente con ripercussioni sulla Flash occupata, sulla RAM consumata e sulla velocità di calcolo.
Ma è possibile, basta mettere un "long long" prima del nome della variabile per trasformarla in 64 bit.
unsigned long a32; //var a 32 bit
unsigned long long a64; //var a 64 bit
long aa32;
long long aa64;
leo72:
Se non vi interessa la velocità e lo sketch non occupa molte risorse di suo, il compilatore avr-gcc permette di usare la matematica a 64 bit. Ovviamente con ripercussioni sulla Flash occupata, sulla RAM consumata e sulla velocità di calcolo.
Ma è possibile, basta mettere un "long long" prima del nome della variabile per trasformarla in 64 bit.
unsigned long a32; //var a 32 bit
unsigned long long a64; //var a 64 bit
long aa32;
long long aa64;
Molto interessante !!!!! , ma si mette all'inizio dello sketch, cosi' semplicemente?, ci ho gia' provato, girare gira !!!!
Ti ringrazio, controllero' il risultato, ciao Ste
leo72:
Se non vi interessa la velocità e lo sketch non occupa molte risorse di suo, il compilatore avr-gcc permette di usare la matematica a 64 bit. Ovviamente con ripercussioni sulla Flash occupata, sulla RAM consumata e sulla velocità di calcolo.
Ma è possibile, basta mettere un "long long" prima del nome della variabile per trasformarla in 64 bit.
unsigned long a32; //var a 32 bit
unsigned long long a64; //var a 64 bit
long aa32;
long long aa64;
leo72:
Ma è possibile, basta mettere un "long long" prima del nome della variabile per trasformarla in 64 bit.
Il long long è un intero a 64 bit, per i calcoli del gps servono i float a 64 bit, ovvero i double che avr gcc non supporta.
Data types:
char is 8 bits, int is 16 bits, long is 32 bits, long long is 64 bits, float and double are 32 bits (this is the only supported floating point format),
pointers are 16 bits (function pointers are word addresses, to allow addressing up to 128K program memory space).
There is a -mint8 option (see Options for the C compiler avr-gcc) to make int 8 bits, but that is not supported by avr-libc and violates
C standards (int must be at least 16 bits). It may be removed in a future release.
leo72:
Ma è possibile, basta mettere un "long long" prima del nome della variabile per trasformarla in 64 bit.
Il long long è un intero a 64 bit, per i calcoli del gps servono i float a 64 bit, ovvero i double che avr gcc non supporta.
Data types:
char is 8 bits, int is 16 bits, long is 32 bits, long long is 64 bits, float and double are 32 bits (this is the only supported floating point format),
pointers are 16 bits (function pointers are word addresses, to allow addressing up to 128K program memory space).
There is a -mint8 option (see Options for the C compiler avr-gcc) to make int 8 bits, but that is not supported by avr-libc and violates
C standards (int must be at least 16 bits). It may be removed in a future release.
Ragazzi ho provato, ma davanti ai float non gli piace il long long, ora provo nelle altre variabili...............
@astrobeed:
ah, non avevo capito che si parlava di virgola mobile a doppia precisione.
No, allora non si può fare, è proprio il compilatore che non ce l'ha, come dici giustamente tu..
@romagnolis:
"davanti ai float non gli piace il long long"
Ma che fai? La macedonia di codice?? Mischi dichiarazioni di float ed int insieme? ]
@lesto:
se ti ricordi, avevo già usato gli interi a 64 bit nelle versioni intermedie del leOS/leOS2 per aggirare il problema dell'overflow di millis, prima di adottare i check esenti problema.
leo72: @astrobeed:
ah, non avevo capito che si parlava di virgola mobile a doppia precisione.
No, allora non si può fare, è proprio il compilatore che non ce l'ha, come dici giustamente tu..
@romagnolis:
"davanti ai float non gli piace il long long"
Ma che fai? La macedonia di codice?? Mischi dichiarazioni di float ed int insieme? ]
@lesto:
se ti ricordi, avevo già usato gli interi a 64 bit nelle versioni intermedie del leOS/leOS2 per aggirare il problema dell'overflow di millis, prima di adottare i check esenti problema.
Scusate ma io vengo da visual basic, no ci prendo una mazza con sto linguaggio, capitemi !!!!!