× MSP430, Microcontrollori 16 bit Ultra Low Power

GY 521 con MPU 5060

9 Anni 8 Mesi fa #51 da elpablito
Risposta da elpablito al topic GY 521 con MPU 5060
@ mister petrone
A che punto sei ?
ciao Paolo

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
9 Anni 8 Mesi fa #52 da mister Petrone
Risposta da mister Petrone al topic GY 521 con MPU 5060
ho inizializzato i Registri del MPU6050 COSI:


//Sets sample rate to 8000/1+7 = 1000Hz
MPU6050_WRITE_I2C (MPU6050_RA_SMPLRT_DIV, 0x07 );
MPU6050_WRITE_I2C (MPU6050_RA_CONFIG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_GYRO_CONFIG, 0b00000000 ); //bit (4:3) 00 -->
//+/-250°/s >> 131 LSB/°/s
//0b00001000

MPU6050_WRITE_I2C (MPU6050_RA_ACCEL_CONFIG, 0b00001000 ); //bit(3:4) 01 --> +/-4g.
//8192 LSB/g
MPU6050_WRITE_I2C (MPU6050_RA_FF_THR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_FF_DUR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_MOT_THR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_MOT_DUR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_ZRMOT_THR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_ZRMOT_DUR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_FIFO_EN, 0x00 );

//AUX I2C setup
//Sets AUX I2C to single master control, plus other config
MPU6050_WRITE_I2C (MPU6050_RA_I2C_MST_CTRL, 0x00 );

//Setup AUX I2C slaves
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV0_ADDR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV0_REG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV0_CTRL, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV1_ADDR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV1_REG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV1_CTRL, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV2_ADDR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV2_REG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV2_CTRL, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV3_ADDR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV3_REG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV3_CTRL, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV4_ADDR, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV4_REG, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV4_DO, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV4_CTRL, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV4_DI, 0x00 );

//MPU6050_RA_I2C_MST_STATUS //Read-only
//Setup INT pin and AUX I2C pass through
MPU6050_WRITE_I2C (MPU6050_RA_INT_PIN_CFG, 0x00 );

//Enable data ready interrupt
MPU6050_WRITE_I2C (MPU6050_RA_INT_ENABLE, 0x00 );

//Slave out, dont care
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV0_DO, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV1_DO, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV2_DO, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_I2C_SLV3_DO, 0x00 );

//More slave config
MPU6050_WRITE_I2C (MPU6050_RA_I2C_MST_DELAY_CTRL, 0x00 );

//Reset sensor signal paths
MPU6050_WRITE_I2C (MPU6050_RA_SIGNAL_PATH_RESET, 0x00 );

//Motion detection control
MPU6050_WRITE_I2C (MPU6050_RA_MOT_DETECT_CTRL, 0x00 );

//Disables FIFO, AUX I2C, FIFO and I2C reset bits to 0
MPU6050_WRITE_I2C (MPU6050_RA_USER_CTRL, 0x00 );

//Sets clock source to gyro reference w/ PLL
MPU6050_WRITE_I2C (MPU6050_RA_PWR_MGMT_1, 0b00000010 );

//Controls frequency of wakeups in accel low power mode plus the sensor standby modes
MPU6050_WRITE_I2C (MPU6050_RA_PWR_MGMT_2, 0x00 );
MPU6050_WRITE_I2C (MPU6050_RA_FIFO_R_W, 0x00 );

//

al fine di collaudare l'attendibilità dei dati ho realizzato una routin con dei pulsanti in questo modo:

//Controllo della pressione del pulsante
while (1) {

switch (PORTB & BUTTON_MASK) {
case BUTTON_1_PRESSED :


MPU6050_READ_I2C (MPU6050_RA_ACCEL_XOUT_H) ; //read data (BUTTON_1);
ACCEL_XOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_ACCEL_XOUT_L) ; //read data (BUTTON_1);
ACCEL_XOUT_L=Dat1;

MPU6050_READ_I2C (MPU6050_RA_ACCEL_YOUT_H) ; //read data (BUTTON_1);
ACCEL_YOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_ACCEL_YOUT_L) ; //read data (BUTTON_1);
ACCEL_YOUT_L=Dat1;

MPU6050_READ_I2C (MPU6050_RA_ACCEL_ZOUT_H) ; //read data (BUTTON_1);
ACCEL_ZOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_ACCEL_ZOUT_L) ; //read data (BUTTON_1);
ACCEL_ZOUT_L=Dat1;

// MPU6050_READ_I2C (MPU6050_RA_TEMP_OUT_H) ; //read data (BUTTON_1);
// TEMP_OUT_H=Dat1;

// MPU6050_READ_I2C (MPU6050_RA_TEMP_OUT_L) ; //read data (BUTTON_1);
// TEMP_OUT_L=Dat1;



ACCEL_XOUT = ((ACCEL_XOUT_H<<8)|ACCEL_XOUT_L);
Print_data (0x01);
ACCEL_YOUT = ((ACCEL_YOUT_H<<8)|ACCEL_YOUT_L);
ACCEL_ZOUT = ((ACCEL_ZOUT_H<<8)|ACCEL_ZOUT_L);

TEMP_OUT = ((TEMP_OUT_H<<8)|TEMP_OUT_L);



//LATD = 0x00;
break;
case BUTTON_2_PRESSED :
//PORTD=BUTTON_2;
//EEPROM_Test_I2C (BUTTON_2);

MPU6050_READ_I2C (MPU6050_RA_GYRO_XOUT_H) ; //read data (BUTTON_1);
GYRO_XOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_GYRO_XOUT_L) ; //read data (BUTTON_1);
GYRO_XOUT_L=Dat1;

MPU6050_READ_I2C (MPU6050_RA_GYRO_YOUT_H) ; //read data (BUTTON_1);
GYRO_YOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_GYRO_YOUT_L) ; //read data (BUTTON_1);
GYRO_YOUT_L=Dat1;

MPU6050_READ_I2C (MPU6050_RA_GYRO_ZOUT_H) ; //read data (BUTTON_1);
GYRO_ZOUT_H=Dat1;

MPU6050_READ_I2C (MPU6050_RA_GYRO_ZOUT_L) ; //read data (BUTTON_1);
GYRO_ZOUT_L=Dat1;

GYRO_XOUT = ((GYRO_XOUT_H<<8)|GYRO_XOUT_L);
Print_data (0x01);
GYRO_YOUT = ((GYRO_YOUT_H<<8)|GYRO_YOUT_L);
GYRO_ZOUT = ((GYRO_ZOUT_H<<8)|GYRO_ZOUT_L);





break;
case BUTTON_3_PRESSED :
PORTD=BUTTON_3;
//MPU6050_WRITE_I2C (MPU6050_RA_SMPLRT_DIV, 0x07 ) ;//write data (BUTTON_3);

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_XOUT_H) ; //read data (BUTTON_1);
ACCEL_XOUT_H=media;

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_XOUT_L) ; //read data (BUTTON_1);
ACCEL_XOUT_L=media;

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_YOUT_H) ; //read data (BUTTON_1);
ACCEL_YOUT_H=media;

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_YOUT_L) ; //read data (BUTTON_1);
ACCEL_YOUT_L=media;

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_ZOUT_H) ; //read data (BUTTON_1);
ACCEL_ZOUT_H=media;

MPU6050_calibrate_I2C (MPU6050_RA_ACCEL_ZOUT_L) ; //read data (BUTTON_1);
ACCEL_ZOUT_L=media;

ACCEL_XOUT = ((ACCEL_XOUT_H<<8)|ACCEL_XOUT_L);
Print_data (0x01);
ACCEL_YOUT = ((ACCEL_YOUT_H<<8)|ACCEL_YOUT_L);
ACCEL_ZOUT = ((ACCEL_ZOUT_H<<8)|ACCEL_ZOUT_L);

break;



come si può notare la lettura del dato è rinviata ad una funzione, questa:


void MPU6050_READ_I2C (unsigned char data){

//unsigned char Data = 0x00;
unsigned char dummy_read;
//Controllo che il bus non abbia attivita' in corso
IdleI2C();


StartI2C(); // sends a start condition

//Lettura fittizia per cancellare il buffer in ingresso
dummy_read = SSPBUF;

// Invio del primo Byte (indirizzo) - LETTURA
while (WriteI2C( (MPU6050_ADDRESS) | WRITE )); { //I2C address and a write bit


SSPCON1bits.WCOL=0;
}


// Invio RA secondo Byte (REGISTRO)
while(WriteI2C (data)); //register address that is going to be read

IdleI2C();

StartI2C(); //the master transmits a start signal

while (WriteI2C( (MPU6050_ADDRESS) | READ )); //the slave address and read bit

IdleI2C();

// leggo dato in ricezione/inviato da MPU-5060

//while(ReadI2C ());
ReadI2C ();

Dat1 = SSPBUF; //the MPU-60X0 sends an ACK signal and the data
SSPCON1bits.WCOL=0;




StopI2C(); // and a stop bit from master



PORTD=Dat1; //visualizza sui led dato

// putcUSART("X");
while (BusyUSART()); // attendi
//putcUSART(media); //invia al PC via usart il dato
putcUSART(Dat1); //invia al PC via usart il dato
//while (BusyUSART()); // attendi
// putcUSART(0x0A); // invia carattere 0x0A LINE FEED
while (BusyUSART()); // attendi
putcUSART(0x01); // invia carattere 0x0D CARRIAGE RETURN

// num_tx_char = 0;
}

in pratica ho segioto il protocollo di comunicazione per leggere il dato sul registro del MPU6050 e poi tramite rs232/USART lo invio al pc leggendolo con IL sw HERCULES.
COME PUOI VEDERE IN BASE AL PULSANTE PREMUTO LEGGO I DATI DEL GYRO O DELL'ACCELLEROMETRO.
Ho anche provato a realizzare una rutin che ho chiamato di calibrazione dove faccio una media di 1000 letture.
questa:

void MPU6050_calibrate_I2C (unsigned char data){

media=0;
Dat2=0;
for (int x=0; x<1000; x++)
{
//unsigned char Data = 0x00;
unsigned char dummy_read;
//Controllo che il bus non abbia attivita' in corso
IdleI2C();


StartI2C(); // sends a start condition

//Lettura fittizia per cancellare il buffer in ingresso
dummy_read = SSPBUF;

// Invio del primo Byte (indirizzo) - LETTURA
while (WriteI2C( (MPU6050_ADDRESS) | WRITE )); { //I2C address and a write bit

// unsigned dat2;
// dat2 = SSPBUF;
SSPCON1bits.WCOL=0;
}


// Invio RA secondo Byte (REGISTRO)
while(WriteI2C (data)); //register address that is going to be read

IdleI2C();
//StopI2C();

StartI2C(); //the master transmits a start signal

while (WriteI2C( (MPU6050_ADDRESS) | READ )); //the slave address and read bit

IdleI2C();

// leggo dato in ricezione/inviato da MPU-5060


//while(ReadI2C ());
ReadI2C ();

Dat1 = SSPBUF; //the MPU-60X0 sends an ACK signal and the data
SSPCON1bits.WCOL=0;
Dat2=Dat2+Dat1;

StopI2C(); // and a stop bit from master

// __delay_ms(1);
}

media=Dat2/1000;
//PORTD=media3; //visualizza sui led dato
PORTD=media; //visualizza sui led dato

// putcUSART("X");
while (BusyUSART()); // attendi
putcUSART(media); //invia al PC via usart il dato
while (BusyUSART()); // attendi
// putcUSART("."); // invia carattere 0x0A LINE FEED
while (BusyUSART()); // attendi
putcUSART(0x01); // invia carattere 0x0D CARRIAGE RETURN

// num_tx_char = 0;
}

IN CONCLUSIONE I DATI CHE STO' LEGGENDO MI SEMBRANO ATTENDIBILI, PER POTERLI LEGGERE CON QUALITA' HO DOVUTO ASSICURARMI DI AVERE IN "BOLLA" LA SCHEDINA SU CUI E' MONTATO MPU6050.
HO USATO IPHONE COME BOLLA E UNA STAFFETTA DELLA GOPRO PER REGOLARE LE INCLINAZIONI.
LA COSA COMUNQUE INTERESSANTE E CHE I DATI SONO ABBASTANZA RIPETIBILI.
Tieni presente che non ho usato nessun filtro. ho provato a leggermi qualcosa ma sinceramente non ho capito come inserirli.
Inotre ho visto che tu hai usato i file MotionApps e mpu6050 , mi spieghi a cosa servono esattamente?

Scusa se mi sono dilungato...questo è il punto in cui sono arrivato.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • mister Petrone
  • Junior Member
  • Junior Member
Di più
9 Anni 8 Mesi fa - 9 Anni 8 Mesi fa #53 da elpablito
Risposta da elpablito al topic GY 521 con MPU 5060
-> mister Petrone
Non ho analizzato in dettaglio ciò che mi hai inviato ma mi par di aver capito che hai letto i registri di accelerometro e giroscopio. Anch'io al primo colpo sono andato per la stessa strada dato che ero curioso di vedere cosa si muoveva. In effetti devi ancora incominciare il gioco se pensi di voler ottenere la posizione di un oggetto nello spazio. Un sistema a tre assi quindi con tre gradi di libertò va a donne perdute quando due dei tre assi coincidono, es. l'oggetto ruota di 90°, perchè il sistema diventa a due gradi di libertà. Servono almeno i 6 assi,tre accelerometro e tre giroscopio, per poter definire la posizione dell'oggetto nello spazio. Il tutto è supportato da una matematica a base di quaternioni. Cosa è il quaternione? L'equvalente di un numero immaginario nello spazio. Questo era tanto per metterti la pulce nell'orecchio, fortunatamente non serve ricavare i signori perchè basta leggerli. Nel MPU6050 è contenuto un processore di moto che fa tutti i conti che supportano il movimento quindi è questo quello che bisogna andare a leggere. Il costruttore del MPU6050 è invece restio nel fornire informazioni e la maggior parte delle stesse è stata ottenuta come ho detto in precedenza. Anche se non ancora completamente debagato i dati che oggi si possono leggere sono tali da mostrarti l'areoplanino anche quando è in volo rovescio.
Dopo tutta questa tiritera il punto è: oltre a PIC cosa mastichi? Io Pic non lo mastico, ci ho provato,ma non è il
mio oggetto. Io gioco con Texas e Freescale perchè hanno virtualmente lo stesso sistema di sviluppo, ma stavo guardando anche Energia o Arduino, ancora la stessa minestra, perchè con Arduino tutta la base è gia fatta, purtoppo mi fa in........are il fatto che non ha un debug come si deve, però trovi dei cloni, (tanto è solo un CPU su un circuito stampato con attorno poca cosa almeno per la maggior parte dei casi) per tre palle e un soldo e funzionano anche senza problemi.
Il nostro problema è invece quello di una base comune di chiacchera.
Ti passo un po' di indirizzi dagli un occhiata poi mi dici.
playground.arduino.cc/Main/MPU-6050
www.geekmomprojects.com/mpu-6050-dmp-data-from-i2cdevlib/
it.wikipedia.org/wiki/Quaternione
Ciao
Paolo
Ultima Modifica 9 Anni 8 Mesi fa da elpablito.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
9 Anni 8 Mesi fa #54 da StefA
Risposta da StefA al topic GY 521 con MPU 5060

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • StefA
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
9 Anni 8 Mesi fa #55 da mister Petrone
Risposta da mister Petrone al topic GY 521 con MPU 5060
Quindi dovrei leggere il dato da qualche altra parte? Altro registro ?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • mister Petrone
  • Junior Member
  • Junior Member
Di più
Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login