Scusate se la domanda suona stupida, ma non son sicuro di quello che faccio
Per trasformare la lettura analogica del giroscopio in gradi al secondo, uso questa formula (da datasheet):
(((5/1024.0)*1000.0)/0.67)
ciò vuol dire che ogni incremento analogico corrisponde a 7,28 gradi al secondo in più... troppa poca precisione!
quindi se io settassi il reference analogico sull'interno, avrei come riferimento 1,1v.. quindi la formula diventa:
(((1,1/1024.0)*1000.0)/0.67)
quindi la precisione per incremento sale a 1,6 gradi al secondo!
è giusto come ragionamento?
altro particolare, essendo i giroscopi alimentati a 5v, essi danno un'output a 5v, non c'è il riscio di bruciare il micro perchè supero la corrente di riferimento? l'unica soluzione è usare un ADC esterno? quale consigliate?
e di nuovo, essendoci collgato anche un nunckuck via i2c sempre alimentato a 5v, ci sono problemi?
Ciao lesto,
forse qui posso dare una risposta io a te, solo perché ho affrontato la questione in un post di una paio di giorni fa, con astrobeed.
Se il tuo segnale analogico ha un range da 0 a 5V settare VRef a 1,1V significa leggere con precisione da 0 a 1,1, poi ti va in over range; non credo (ma non sono sicuro!!!) che si possa bruciare il micro, come potrebbe accadere invece con tensioni >5V, penso sia solo una questione di misurazione.
Nella risposta di astrobeed è spiegato come aumentare la risoluzione da 10 a 12 bit, per me è piuttosto problematica realizzarla ora, anche se mi metterò a studiare la reference perché è una cosa che mi serve, ma tu che sei esperto non dovresti avere problemi. http://arduino.cc/forum/index.php/topic,55924.0.html
Spero di esserti stato utile, altrimenti scusami per l'inutilità del post.
l'over-range rende infattibile l'idea, mentre la discussione sembra interesante..
con 12 bit ottengo 1,82 di precisione, che mi basta (l'accelerometro dovrebbe compensare)
dato che i giro li sto usando in una libreria, poi ti posto il codice così con qualche modifica dovreti riuscire ad usarla!
Mi saresti di un aiuto speciale!
Allora terrò d'ochio costantemente questo topic, in attesa del codice, poi magari ti chiederò qualche chiarimento (tanto l'hai capito dall'altro topic a che livello sono, vero? ).
Ciao.
La parte relativa a ciclo for ed array non avrei problemi a realizzarla, il fatto è che non ho capito cosa devo usare come elementi, queste letture da dove le prendo? Se è dal pin analogico (p.es A0), intanto che sommo e divido quello continua a "sparare" valori
Ti chiedo non di darmi chiarimenti altrimenti perderai la giornata, se invece posti, anche un altro giorno, il codice, almeno posso studiarlo (in questo me la cavo) e, al limite, avere qualche chiarimento per applicarlo alla mia esigenza).
E' qui che non mi regolo più, il campionamento ( ) ecco perché ti chiedo la gentilezza di postare il codice, appena lo realizzi, una volta compresa la tecnica poi posso andare avanti da solo.
Grazie lesto!
Allora gyroPin è il pin analogico su cui applico i valori da leggere, leggo 16 valori, li sommo e poi divido per 4, in questo modo ottengo una risoluzione di 12 bit, sul monitor in pratica leggo 1 valore ogni 16 che arrivano. Mi sembra tutto chiaro (ma ho capito bene? ). Il mio dubbio è: quando ha caricato i primi 16 valori, durante la fase di calcolo non si perde qualche valore? forse è ininfluente?
L'altra possibilità di cui parlavi (gli array), basterebbe sostituire sommamedia nel for con una riga tipo
16pack[]=analogRead(gyroPin);
in questo modo potrei memorizzare "x" gruppi da 16 valori di lettura originale, ma come faccio a creare un nuovo array ad ogni nuovo ciclo for, dovrei riuscire ad ottenere qualcosa tipo 16pak001, 16pack002, ecc. come?
int r=0;
int array[16];
setup(){
int i;
for (i=0; i < 16;i++){
array[i] = analogRead(gyroPin);
}
}
loop(){
leggiNuovoValore();
calcolaMedia();
}
calcolaMedia(){
sommaMedia=0;
for (i=0; i < 16;i++){
sommaMedia+=array[i];
}
Serial.print("Media: ");
Serial.println(sommaMedia/4);
}
leggiNuovoValore(){
array[r++]=analogRead(gyroPin);
if (r>=16)
r=0;
}
facile no?
ah ovvio che è da sistemare, è giusto un abbozzo velocissimo
di quanti canali adc in più hai bisogno?
con che precisione?
con che velocità?
quale tipo di comunicazione?
avendo la risposta a queste domande si potrebbe consigliarti un IC dedicato
Mmm, spero di darti una risposta adeguata:
Leggo una sola tensione che varia in modo analogico entro un range di 0-5V, le variazioni sono sull'ordine del mV, poi di colpo variano di V (p.es. : 1,215 - 1,211 - 1,213 - 3,775 - 3,378 - ecc).
Il tempo di variazione è piuttosto lento, un valore in media resta stabile per 0,5 secondi o anche più (ma in un prossimo futuro potrebbe scendere fino a 0,1 sec o anche meno).
Nell'esempio riportato Arduino mi darebbe solo 2 valori, a me servono tutti e 5.
Spero che basti, non saprei cos'altro dirti.
io alla fine credo che continuerò a usare l'adc di arduino, però magari se l'ic non costa troppo lo piazzo nel prossimo ordine...
3 canali da 0 a 5V, 12bit di precisione, almeno una lettura ogni 2 ms, protocollo seriale o i2c o a scelta, basta che non sminchi i timer o rallenti troppo il codice
BrainBooster:
di quanti canali adc in più hai bisogno?
con che precisione?
con che velocità?
quale tipo di comunicazione?
avendo la risposta a queste domande si potrebbe consigliarti un IC dedicato
Mi consigli un ADC o meglio due da connettere all'arduino mediante l'interfaccia I2C
tipo 1:
risoluzione min 16 bit
canali 16 single ended
velocità campionamento 50 KS/s
tipo 1:
risoluzione min 16 bit
canali 4 differential mode
velocità campionamento min 10 KS/s