Giroscopio L3G4200D

Salve a tutti,
sono alle prese con questo giroscopio L3G4200D. :fearful:
Ho scritto un bel po di software per questo giroscopio, come la lettura dall' I2C ed anche la calibrazione, ma non mi fido di quello che ho fatto....

Per leggere i dati utilizzo questa funzione:

void readGyro(int *x, int *y, int *z)
{
  Wire.beginTransmission(L3G4200D_ADDRESS);
  Wire.write(OUT_X_L); 
  Wire.endTransmission();

  
  Wire.beginTransmission(L3G4200D_ADDRESS);
  Wire.requestFrom(L3G4200D_ADDRESS, 6);

  i = 0;
  
  while(Wire.available())
  {
    gyro_buff[i] = Wire.read();
    i++;
  }
  
  Wire.endTransmission();
  
  *x = (((int)gyro_buff[1] << 8) | gyro_buff[0]);
  *y = (((int)gyro_buff[3] << 8) | gyro_buff[2]);
  *z = (((int)gyro_buff[5] << 8) | gyro_buff[4]);

}

In allegato ci sono tutti gli indirizzi I2C del giroscopio se per caso ci fossero dubbi XD

Quando voglio aggiornare i dati utilizzo questa riga:

readGyro(&x_gyro, &y_gyro, &z_gyro);

dove x_gyro, y_gyro e z_gyro sono variabili di tipo INT.

Fin qua tutto bene, adesso credo di avere dei problemini...
Quando ho impostato il giroscopio vado a calibrarlo tramite questa funzione:

void CalibrateGyro(void)
{
  average_x = 0;            // media di 50letture
  average_y = 0;
  average_z = 0;
  buf_x = 0;                // buffer
  buf_y = 0;
  buf_z = 0; 
  
  for(int i = 50; i > 0; i--)      //50 letture
  {
    readGyro(&buf_x, &buf_y, &buf_z);
    average_x += buf_x;
    average_y += buf_y;
    average_z += buf_z;
    buf_x = 0;                // buffer
    buf_y = 0;
    buf_z = 0; 
    delay(20); // dt 20 ms
  }
  
  off_x_gyro = average_x / 50;  // media 
  off_y_gyro = average_y / 50;
  off_z_gyro = average_z / 50;
}

con questa funzione mi vengono dati > 6000, quindi non so quanto siano giusti...
Comunque facendo finta che siano giusti questi offset calcolo quanto valgano i raw value dell'asse y tramite questa riga:

g_pitch = (y_gyro - off_y_gyro);  // calcolo PITCH Giroscopio

dove g_pitch è una variabile INT

Dopodichè moltiplico questo g_pitch per una costante (Sensibility da datasheet) così da trovare la velocità angolar in °/S
Questa costante dipende dalla scala scelta, nel mio caso è 2000 di conseguenza la costante vale 0.07.
Quindi:

rate_pitch = (float) g_pitch * GAIN_GYRO;

infine per avere un valore in gradi integro questo rate_pitch, cioè lo moltiplico per DT che nel mio loop vale 20mS.

I risultati che ottengo sono soddisfacenti ma non credo siano giusti, questo perchè facendo degli esperimenti l'uscita in ° salta continuamente da -1° a 1° pur mantenendo la breakboard ferma.

Intanto ringrazio tutti quanti, e spero che qualche buona anima possa aiutarmi a capire se sbaglio la teoria o la pratica :slight_smile:

L3G4200D.h (1.1 KB)

Non ho quel sensore. Ma trovi le librerie per un confronto, qui --> https://github.com/pololu/l3g-arduino/tree/master/L3G

@Diego
Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

PaoloP:
Non ho quel sensore. Ma trovi le librerie per un confronto, qui --> https://github.com/pololu/l3g-arduino/tree/master/L3G

Grazie per avermelo fatto notare, credo che la lettura dei registri sia giusta, sfortunatamente non sono riuscito a torvare la calibrazione e nemmeno verificare la conversione dai raw value ai °/S che desidero...
PaoloP con il sensore che ha lei ha casa come ha fatto per convertire i raw value in °/S giusto per avere un confronto della teoria, grazie mille :slight_smile:

nid69ita:
@Diego
Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Grazie, mi sono presentato e letto il regolamento :wink:

PaoloP:
Non ho quel sensore.

Scusa, intendevo dire che non ho giroscopi a casa. :sweat_smile:

Ok grazie della info :wink:

Restando nella teoria se io moltiplico i raw value per 0.070 che è la sensibilità dello strumento a 2000 mi esce l'angolo in °/S o sbaglio completamente?

Boh! :drooling_face:

Ok, grazie a tutti sono riuscito a risolvere guardando la lettura I2C dello stesso giroscopio ma solamente con il PIC.
Mi dimenticavo di mandare a 1 il 7 bit per far si che il giroscopio fosse in lettura XD
Uno dei miei soliti errori, che mi impallato x giorni XD

Più tardi posto il codice giusto così se qualcuno ha bisogno c'è qualcosa che funziona :smiley: