ArduinoDue 5DOF

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?

il prodotto è questo IMU Analog Combo Board - 5 Degrees of Freedom IDG500/ADXL335 - SEN-09268 - SparkFun Electronics.

l'accelerometro è ADXL335
il giroscopio è IDG-500

se non ho capito male il giroscopio dovrebbe avere una procedura di auto-zero, o forse ho capito male io

perchè dal giro togli 1.350?
cioè, la logica è giusta, però quel valore sarebbe da calibrare ogni volta, tenendo la scheda ferma e leggendo il valore.

a quel punto il gyro ti misura quanto velocemente sta girando la scheda.

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) :smiley:

grazie per le risposte

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 ... :fearful: ]:smiley:

(scusa, non ho resistito :stuck_out_tongue: XD)

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 :smiley:

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?

questo cosa mi era sfuggita......
ora provvedo a valutare la cosa e vediamo cosa ne tiro fuori

grazie

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 :smiley:

grazie

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 :frowning:

saluti

sicuro di non star facendo casini con l'endianess? vedi wikipedia

sicuro :smiley:

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.

grazie per il supporto