Go Down

Topic: Stabilizzatore con mpu-6050 (Read 4774 times) previous topic - next topic

memedesimo

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.

memedesimo

Nel Playground ho trovato uno sketch:
Code: [Select]
// 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.
Code: [Select]
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?


cyberhs

La scheda deve essere alimentata a 3.3V.

Se continui rischi di danneggiarla.


memedesimo

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

Lucailvec

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 ;)

Lucailvec

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ì ;) proprio per questo vengono filtrati per ottenere dei valori "corretti"

astrobeed

Filtro complementare o kalman,
L'alternativa è Filtro complementare o DCM.

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



Scientia potentia est

Lucailvec

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 ?  :smiley-roll-sweat:

astrobeed

Nel senso ? XD che la computazione è infinita ?  :smiley-roll-sweat:
Nel senso che l'EKF su Arduino è una utopia :)
Scordati di farlo senza usare un micro 32 bit dotato di fpu, p.e. un STM32 con core ARM Cortex M4.
Scientia potentia est

memedesimo

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 :( prima o poi bisogna imparare..
sto cercando la libreria che mi hai consigliato..
ho trovato questo: http://www.varesano.net/projects/hardware/FreeIMU
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?

astrobeed

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.
Scientia potentia est

memedesimo

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.

Lucailvec

Ok diciamo che questa libreria fa un qualcosa di magico e può tirarti fuori i valori.
https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter

Go Up