ciao
siccome mi è arrivata la schedina stavo provando un po di cose.
in particolare ho collegato al mio arduino Due una scheda IMU 5DOF formata da un ADXL335 e un IDG-500.
di seguito i valori letti
-----------LETTURA DATI----------------------
lettura valore accelerometro asse X
Acc. asse x raw = 2024
Acc. asse x = -0.0631257631
lettura valore accelerometro asse Y
Acc. asse y raw = 2030
Acc. asse y = -0.0470085470
lettura valore accelerometro asse Z
Acc. asse z raw = 2445
Acc. asse z = 1.0677655678
lettura valore giroscopio asse X
Gyr. asse x raw = 1726
Gyr. asse x = 20.4578754579
lettura valore giroscopio asse Y
Gyr. asse y raw = 1726
Gyr. asse y = 20.4578754579
------------------------------------------------
il codice che uso per la lettura è il seguente
#define ACC_ASSE_X A0 //408 a 612 piano 508
#define ACC_ASSE_Y A1 //408 a 612 piano 508
#define ACC_ASSE_Z A2 // piano
#define GYR_ASSE_X A3
#define GYR_ASSE_Y A4
void setup() {
Serial.begin(9600);
//imposto il ADC a 12 bit
analogReadResolution(12);
delay(5000);
}
void loop() {
Serial.println("-----------LETTURA DATI----------------------");
//(((valore letto * vref (3.3)) / maxValue ADC (12bit = 4095)) - V0 (1.50 x,y e 1.50 z)) / sensitivy (0.300 mV/g)
//zero value = zero value datasheet / Vref * 4095 (ADC 12bit)
//(value letto - zero value) / sensitivity
Serial.println("lettura valore accelerometro asse X");
int rawValueAccX = 0;
for(int i = 0; i < 50; i++) rawValueAccX += ReadRawAccAssValue(ACC_ASSE_X);
rawValueAccX = rawValueAccX / 50;
double valueAccX = (((rawValueAccX * 3.3) / 4095) - 1.650) / 0.300;
Serial.print("Acc. asse x raw = ");
Serial.println(rawValueAccX, DEC);
Serial.print("Acc. asse x = ");
Serial.println(valueAccX, DEC);
Serial.println("lettura valore accelerometro asse Y");
int rawValueAccY = 0;
for(int i = 0; i < 50; i++) rawValueAccY += ReadRawAccAssValue(ACC_ASSE_Y);
rawValueAccY = rawValueAccY / 50;
double valueAccY = (((rawValueAccY * 3.3) / 4095) - 1.650) / 0.300;
Serial.print("Acc. asse y raw = ");
Serial.println(rawValueAccY, DEC);
Serial.print("Acc. asse y = ");
Serial.println(valueAccY, DEC);
Serial.println("lettura valore accelerometro asse Z");
int rawValueAccZ = 0;
for(int i = 0; i < 50; i++) rawValueAccZ += ReadRawAccAssValue(ACC_ASSE_Z);
rawValueAccZ = rawValueAccZ / 50;
double valueAccZ = (((rawValueAccZ * 3.3) / 4095) - 1.650) / 0.300;
Serial.print("Acc. asse z raw = ");
Serial.println(rawValueAccZ, DEC);
Serial.print("Acc. asse z = ");
Serial.println(valueAccZ, DEC);
Serial.println("lettura valore giroscopio asse X");
int rawValueGyrX = ReadRawGyrAssValue(GYR_ASSE_X);
double valueGyrX = (((rawValueGyrX * 3.3) / 4095) - 1.350) / 0.002;
Serial.print("Gyr. asse x raw = ");
Serial.println(rawValueGyrX, DEC);
Serial.print("Gyr. asse x = ");
Serial.println(valueGyrX, DEC);
Serial.println("lettura valore giroscopio asse Y");
int rawValueGyrY = ReadRawGyrAssValue(GYR_ASSE_Y);
double valueGyrY = (((rawValueGyrY * 3.3) / 4095) - 1.350) / 0.002;
Serial.print("Gyr. asse y raw = ");
Serial.println(rawValueGyrX, DEC);
Serial.print("Gyr. asse y = ");
Serial.println(valueGyrX, DEC);
Serial.println("------------------------------------------------");
delay(5000);
}
int ReadRawAccAssValue(int pin) {
int valore = analogRead(pin);
return valore;
}
int ReadRawGyrAssValue(int pin) {
int valore = analogRead(pin);
return valore;
}
siccome la basetta è relativamente messa in piano, posso piu o meno valutare i valori letti e convertiti dell'accelerometro correnti. quelle che invece non riesco a capire sono i valori del giroscopio. qualcuno ha mai usato questi componenti e può darmi delle dritte?
Ciao,
hai verificato sul sito del venditore se ci fossero datasheet o una procedura di calibrazione?
Hai la sigla esatta del prodotto o il link del negozio dove l'hai comprata, se online?
1.350 da datasheet e se non ho letto male corrisponde alla tensione di riferimento a 0.
quindi ho ben pensato di togliere al valore letto il valore di zero. quell oche mi dici tu invece è che cosi facendo magari non sottraggo il vero valore dello zero, giusto?
ah, scusa, 1.35 è riferito ala tensione e non al valore grezzo, in ogni caso è normale che sballi un pò.
però riguardando meglio è più probabile che sbagli la conversione, ora guardo il Datasheet e ti dico
infatti qualcosa non va.
tu leggi 1726, che equivale e 1.39V. Tolto lo 0, ovvero 1.35V otteniamo 0.04V, ovvero 40mV, giustamente peri a 20°/s, ma se il tuo coso sta fermo questo non ci torna.
o il tuo zero è 1.39v (direi spoporzionato!) oppure il sensore dà un'uscita sinosuoideale oppure c'è qualche errore di collegamento: cavi lunghi, gnd non in comune, collegamenti at catzum
F4LK0:
1.350 da datasheet e se non ho letto male corrisponde alla tensione di riferimento a 0.
E' un valore di riferimento medio, non è assolutamente il reale valore per la velocità 0, questo lo devi ricavare per ogni asse all'accensione tenendo la scheda perfettamente ferma per almeno una decina di secondi, serve per dare il tempo di assestamento meccanico e far smorzare le eventuali oscillazioni, scaduto il tempo acquisisci 16 valori per ogni asse, campionando a 10Hz, e fai la media, i valori ottenuti sono quelli da usare per lo zero.
Tieni presente che i giroscopi, sopratutto quelli economici, derivano sensibilmente nel tempo e per le variazioni termiche.
lesto:
ah, scusa, 1.35 è riferito ala tensione e non al valore grezzo, in ogni caso è normale che sballi un pò.
però riguardando meglio è più probabile che sbagli la conversione, ora guardo il Datasheet e ti dico
infatti qualcosa non va.
tu leggi 1726, che equivale e 1.39V. Tolto lo 0, ovvero 1.35V otteniamo 0.04V, ovvero 40mV, giustamente peri a 20°/s, ma se il tuo coso sta fermo questo non ci torna.
o il tuo zero è 1.39v (direi spoporzionato!) oppure il sensore dà un'uscita sinosuoideale oppure c'è qualche errore di collegamento: cavi lunghi, gnd non in comune, collegamenti at catzum
stasera, ora sono fuori casa, ricontrollo i cablaggi ed eventualmente condivido l'operato cosi se sbaglio qualcuno mi può bacchettare.
astrobeed:
F4LK0:
1.350 da datasheet e se non ho letto male corrisponde alla tensione di riferimento a 0.
E' un valore di riferimento medio, non è assolutamente il reale valore per la velocità 0, questo lo devi ricavare per ogni asse all'accensione tenendo la scheda perfettamente ferma per almeno una decina di secondi, serve per dare il tempo di assestamento meccanico e far smorzare le eventuali oscillazioni, scaduto il tempo acquisisci 16 valori per ogni asse, campionando a 10Hz, e fai la media, i valori ottenuti sono quelli da usare per lo zero.
Tieni presente che i giroscopi, sopratutto quelli economici, derivano sensibilmente nel tempo e per le variazioni termiche.
del fatto della deriva si ne sono pienamente conscio. quindi mi dici di fare una certa calibrazione all'avvio, provvederò.
tutto era nato dal fatto che l'accelerometro era abbastanza preciso mentre il giroscopio no (o perlomeno io ritengo questo)
astro, ci sta una deviazione dallo zero, ma dal datasheet dice al massimo 8mV. quì staimo parlando di 40mV, pari a 20°/s... mi pare eccessivo, anche per un gyro di bassa qualità.
lesto:
astro, ci sta una deviazione dallo zero, ma dal datasheet dice al massimo 8mV. quì staimo parlando di 40mV, pari a 20°/s... mi pare eccessivo, anche per un gyro di bassa qualità.
E' perche' non hai dato lo strappo al cordino abbastanza forte, ed il giroscopio ruota troppo lentamente ... ]
lesto:
astro, ci sta una deviazione dallo zero, ma dal datasheet dice al massimo 8mV.
Sul datasheet, pagina 2, c'è scritto che la tolleranza rispetto al valore medio a velocità 0 di +/- 20 mV con auto zero, +/- 250 mV senza auto zero (pin 24 per abilitarlo e non mi pare sia utilizzato sulla board Sparkfun).
visto, capito, non capisco però da dove ho letto quell'8 però... bha
quindi a questo punto bisogna ricalcolare il valore da calibrare, e verificare che sia compreso tra 1.35-0.25 < X < 1.35+0.25, altrimenti vuol dire che il sensore si è mosso durante la calibrazione.
Però se non ho capito male bisogan fare attenzione che in base alla temperatura del chip il valore può variare di +-50mV, giusto?
ho fatto altre prove e per quanto lavoro di fino il giroscopio un po fa le bizze.
quindi ora provo a far lavorare insieme sia giroscopio e accelerometro applicando dei filtri (Kalman) e vediamo che dati ottengo
Ben le ho provate tutte.
ho visto qua e la per internet dove dicono che, se non usato, di mettere il pin AZ (auto zero) a massa. cosi facendo il segnale del giroscopio sembra piu accurato, ma comunque vengono letti, di tanto in tanto, valori che oscillano tra -7,39 e +7,39, con punte di circa 14.
quindi le cose sono due è il mio giroscopio e rotto, o ha un funzionamento veramente penoso
comunque sto lavorando diciamo su di una taratura software.
ho visto molti esempio in giro per internet dove viene impostata una soglia per il giroscopio a riposo, impostando cosi infatti, ma va aggiungo io, le letture sono precise.
ora non resta che implementare in qualche modo un filtro e ci siamo.