Stabilizzatore con mpu-6050

Ciao a tutti,
dovei realizzare uno stabilizzatore, niente di eccessivamente complesso o di eccessivamente preciso.

Mi servono 3 funzioni:
-se la Z è in un range, da me definito, deve cercare di rendersi più orizzontale possibile.
-se la Y è in un altro range, sempre da me definito, deve cercare di essere più orizzontale possibile.
-alla chiusura di un contatto N.O., X e Z devono stabilizzarsi più orizzontali possibile.

Il sensore di cui dispongo è un MPU-6050 e per la movimentazione pensavo ad utilizzare un paio di servocomandi, attualmente non li ho quindi mi accontenterei di leggere i valori di X,Y e Z tramite monitor seriale.

Avete qualche libreria o tutorial da consigliarmi? Preferibilmente materiale in italiano o comunque spiegato nel dettaglio perché non so quali pin mi servono e dove vanno collegati, e dato che non programmo da un annetto non mi sento di mettermi a leggere tutto il codice per capirne il significato.

Vi ringrazio anticipatamente.

Nel Playground ho trovato uno sketch:

// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
}

Dato che nello sketch non e definito alcun pin mi sono preso il lusso di cercare su google: "wiring 6050" e ho trovato:

Ci sono errori? si collega così?

Dopo aver caricato lo sketch apro il monitor seriale e i valori cambiano di continuo pur avendo il sensore perfettamente fermo sul tavolo.

AcX = 588 | AcY = 128 | AcZ = 17372 | Tmp = 25.28 | GyX = -263 | GyY = 199 | GyZ = -25
AcX = 576 | AcY = 28 | AcZ = 17240 | Tmp = 25.42 | GyX = -258 | GyY = 154 | GyZ = -25
AcX = 704 | AcY = 0 | AcZ = 17292 | Tmp = 25.42 | GyX = -259 | GyY = 153 | GyZ = -37
AcX = 528 | AcY = 56 | AcZ = 17288 | Tmp = 25.33 | GyX = -264 | GyY = 149 | GyZ = -32
AcX = 464 | AcY = 8 | AcZ = 17304 | Tmp = 25.38 | GyX = -290 | GyY = 178 | GyZ = -17
AcX = 392 | AcY = 0 | AcZ = 17296 | Tmp = 25.47 | GyX = -265 | GyY = 186 | GyZ = -5
AcX = 644 | AcY = 24 | AcZ = 17384 | Tmp = 25.52 | GyX = -299 | GyY = 176 | GyZ = -44
AcX = 616 | AcY = -8 | AcZ = 17336 | Tmp = 25.38 | GyX = -284 | GyY = 170 | GyZ = -6
AcX = 608 | AcY = 92 | AcZ = 17400 | Tmp = 25.33 | GyX = -269 | GyY = 176 | GyZ = -33
AcX = 632 | AcY = 80 | AcZ = 17376 | Tmp = 25.38 | GyX = -259 | GyY = 178 | GyZ = -20
AcX = 508 | AcY = 12 | AcZ = 17332 | Tmp = 25.38 | GyX = -263 | GyY = 161 | GyZ = -26
AcX = 588 | AcY = 48 | AcZ = 17464 | Tmp = 25.47 | GyX = -269 | GyY = 175 | GyZ = -23
AcX = 524 | AcY = -36 | AcZ = 17496 | Tmp = 25.42 | GyX = -267 | GyY = 153 | GyZ = -22
AcX = 496 | AcY = 112 | AcZ = 17380 | Tmp = 25.38 | GyX = -291 | GyY = 182 | GyZ = -27

Se non ho capito male Ac sta per accelerazione e Gy per gyro, ma essendo tutto fermo è possibile che in 0.333sec i valori cambino così tanto?
il giro di Z in un paio di secondi varia da -5 a -44
l'Ac di Y va da -36 ad un massimo di 112...

Comunque questi numeri non so cosa vogliano dire, c'è un equazione per convertire i dati in gradi?

nessuno? :cry:

La scheda deve essere alimentata a 3.3V.

Se continui rischi di danneggiarla.

Perfetto, ti ringrazio, quindi sposto il pin sull'arduino da +5v a +3.3v
Invece per convertire i dati in angoli?

Filtro complementare o kalman, se non sbaglio c è una libreria fatta davvero bene per la mpu6050 credo si chiami imu6free o qualcosa del genere prova a cercare :wink:

Comunque dal tuo stupore noto che non conosci cosa sono gli accelerometri e il giroscopio, la non costanza di uno e il drift del giroscopio sono dovuti alla costruzione fisica e si è normale avere dei valori così :wink: proprio per questo vengono filtrati per ottenere dei valori "corretti"

Lucailvec:
Filtro complementare o kalman,

L'alternativa è Filtro complementare o DCM.

La soluzione ottimale è l'EKF (Extended Kalman Filter) però su Arduino la risposta è :

astrobeed:
L'alternativa è Filtro complementare o DCM.

La soluzione ottimale è l'EKF (Extended Kalman Filter) però su Arduino la risposta è :

Nel senso ? XD che la computazione è infinita ? :cold_sweat:

Lucailvec:
Nel senso ? XD che la computazione è infinita ? :cold_sweat:

Nel senso che l'EKF su Arduino è una utopia :slight_smile:
Scordati di farlo senza usare un micro 32 bit dotato di fpu, p.e. un STM32 con core ARM Cortex M4.

Vi ringrazio per le risposte ma sinceramente state diventando un po troppo complessi nelle risposte per il mio attuale livello...
Potreste spiegarmi un po piu rozzamente le questioni?
@lucailvec:
ebbene si, a quanto pare non ho mai avuto a che fare gyro e accelerometri :frowning: prima o poi bisogna imparare..
sto cercando la libreria che mi hai consigliato..
ho trovato questo: varesano.net -
pero mi pare di capire che freeIMU sia una scheda.. saro io incapace ma nel sito non riesco a trovare ne il download ne un link a un github..

-il filtro complementare o kalman che cos'e? mi serve per forza? ponendo il caso che io non voglia stabilizzare i risultati

io pensavo a convertire con qualche equazione i dati (che non ancora capisco che unita di misura siano) in gradi, poi metto una tolleranza sui gradi rilevati, nel senso il range di gradi in cui faro intervenire i servi per stabilizzare sara piu ampio, penste che possa funzionare per un progettino moooooolto basilare?

memedesimo:
io pensavo a convertire con qualche equazione i dati (che non ancora capisco che unita di misura siano) in gradi, poi metto una tolleranza sui gradi rilevati, nel senso il range di gradi in cui faro intervenire i servi per stabilizzare sara piu ampio, penste che possa funzionare per un progettino moooooolto basilare?

In pratica vuoi fare quello che si vede in questo mio video, però io uso un dsPIC33 e l'EKF per ottenere quel risultato, impossibile da implementare su Arduino.
Cerca DCM per Arduino, è l'unica strada che puoi seguire per ottenere "facilmente" i quaternioni.

dato che ormai l'mpu-6050 l'ho gia comprato non ci sono modi di utilizzarlo?
quei valori che mi escono sul terminale che cos sono? gentilmente mi dite in che unita di misura sono quei valori? c'e modo di convertirli in gradi? anche se la risultante sara un numero che cambia ogni decimo di secondo per cominciare mi va bene..

@astrobeed: si esatto, praticamente se riuscissi ad avere una lettura dei valori come ce l'hai tu nel video potrei impostare i servi per controbilanciare l'inclinazione.

Ok diciamo che questa libreria fa un qualcosa di magico e può tirarti fuori i valori.