Autor Tema: mpu6050 como interpretar los datos recibidos  (Leído 30694 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado facuver

  • PIC10
  • *
  • Mensajes: 14
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #15 en: 10 de Octubre de 2013, 10:17:23 »
Hola que tal, estoy trabajando con un MPU6050(este modulo http://www.amazon.com/Arduino-GY-521-MPU-6050-gyroscope-accelerometer/dp/B008BOPN40) y un pic 18f2550 en ccs.

Ya tengo comunicación en el chip y puedo leer los valores, pero lo que me interesa ahora es activar el DMP, alguien sabe con que registro se activa, y en que lugar se almacenan los datos?  Estuve leyendo el datasheet pero no encontré nada.

Alguien tiene un código de ejemplo o algo de información, muchas gracias!

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #16 en: 12 de Octubre de 2013, 02:33:23 »
Que tal

Con lo del MPU-9150 no he tenido el honor de trabajar con ese ic, por el momento estoy bajo de $$$ pero ya hay información sobre como activarlo

facuver, tienes un modulo muy parecido al que utilizo, hay varios puntos que se deben de tomar en cuenta

Para activar el DMP se necesita un firmware y es una serie de registros, no solo uno, este lo podes obtener de la pagina del fabricante o tomar los datos de ingeniería inversa y hacer tu propia librería, Yo hice esta ultima opción, me tomo mucho tiempo pero funciona

Con el PIC18F2550 vas a tener un pequeño problema y es el de la memoria, no tienes la suficiente para hacerlo trabajar apropiadamente, Yo tengo una librería para ese PIC pero ya no la seguí trabajando porque me ocupo un 95% de la memoria del PIC utilizando el compilador C30, con css tal vez tome un poco mas de espacio

Los datos se almacenan en la FIFO del MPU6050, hemos comentado al respecto en este hilo

Los datos del DMP no están en el datasheet porque el fabricante todavía no los ha liberado, si haces tu usuario puedes descargar el codigo, como lo mencione anteriormente, despues de aceptar una especie de contrato con mil un y cosas, no se el nombre de esa hoja

y por ultimo, paciencia recuerda que el MPU6050 trabaja con 3.3v, suerte


Desconectado miquel

  • PIC12
  • **
  • Mensajes: 69
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #17 en: 12 de Octubre de 2013, 14:58:05 »
Hola facuver!
En este enlace encontrarás buena información sobre el DMP: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050

Saludos,

Miquel

Desconectado mao707

  • PIC10
  • *
  • Mensajes: 5
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #18 en: 16 de Octubre de 2013, 13:50:18 »
Hola (facuver, JulioJF, Vtronic, Diego_z)

Al igual que ustedes estoy trabajando con el MPU 6050, con la diferencia de que tengo mucho menos experiencia que ustedes en el tema, estoy tratando de comunicar el sensor MPU 6050 con una FPGA (spartan 3e) mediante comunicación I2c, mi objetivo final es recibir los datos del acelerometro y giroscopio y poder manipularlos.

Necesito ayuda con la programación (si lo han trabajado alguna vez)  para aprovechar las herramientas que ofrece el sensor.

Gracias.

Desconectado facuver

  • PIC10
  • *
  • Mensajes: 14
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #19 en: 21 de Octubre de 2013, 11:10:52 »
Hola, mao707. Yo de FPGA no tengo ni idea, lo que te puedo mostrar es el codigo que utilizo para comunicarme con el sensor en C


Código: [Seleccionar]
i2c_start();
            i2c_write(0xd0);                     //Address del MPU (dependiendo del valor logico en AD0, entre 1101000 y 1101001) y el ultimo bit en 0 para indicar escritura
            i2c_write(0x3B);                   // Direccion a Leer
            i2c_start();
            i2c_write(0xd1);                  // Address del MPU con el ultimo bit en 1 para indicar lectura.
            temp[0] =i2c_read();             //Valor Alto de aceleración en X
            temp[1] =i2c_read();            //Valor Bajo de aceleración en X
            temp[2] =i2c_read();            //Y
            temp[3] =i2c_read();
            temp[4] =i2c_read();            //Z
            temp[5] =i2c_read();
            temp[6] =i2c_read();            //Temperatura
            temp[7] =i2c_read();
            temp[8] =i2c_read();           //Giro en X
            temp[9] =i2c_read();
            temp[10] =i2c_read();          //Y
            temp[11] =i2c_read();
            temp[12] =i2c_read();          //Z
            temp[13] =i2c_read(0);        // Z bajo con envio de NACK
            i2c_stop();


y antes le hago un restar para poner los valores por defecto:

Código: [Seleccionar]
/////////////////Reset Inicial//////////////////////
      i2c_start();
      i2c_write(0xd0);/// sensor slave address
      i2c_write(0x6b);///device reset
      i2c_write(0x00);
      i2c_stop();
      delay_ms(10);
     
   //////////////////////////////////////////////////////////

Desconectado mao707

  • PIC10
  • *
  • Mensajes: 5
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #20 en: 24 de Octubre de 2013, 11:49:49 »
Muchas gracias facuver,

con que referencia de microcontrolador trabajas?

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #21 en: 24 de Octubre de 2013, 19:19:34 »
Que tal, pues tengo algo muy parecido a lo de facuver

Código: [Seleccionar]


obtener un byte

[code]
int getI2C(void)
{
unsigned char temp;
SSPCON2bits.RCEN = 1;
while(!SSPSTATbits.BF);
temp=SSPBUF;
return temp;
}

Leer uno o varios Bytes

Código: [Seleccionar]
void MPU6050_read(int address,char *buffer,unsigned char Length)
{
IdleI2C(); //wait for bus Idle
I2CStart(); //Generate Start Condition
I2CSend(I2C_SLAVE); //Write Control Byte
IdleI2C(); //wait for bus Idle
I2CSend(address); //Write start address
IdleI2C(); //wait for bus Idle
I2CRestart(); //Generate restart condition
I2CSend(I2C_SLAVE | 0x01); //Write control byte for read
IdleI2C(); //wait for bus Idle

//test
while (Length --)
{
*buffer++=getI2C(); //get a single byte

if(Length)
{
I2CAck(); //Acknowledge until all read
}
}
//test

I2CNak(); //Send Not Ack
I2CStop(); //Generate Stop Condition
}

unsigned int ACKStatus(void)
{
return (!SSPCON2bits.ACKSTAT); //Return Ack Status
}


escribir un byte

Código: [Seleccionar]
void MPU6050_write(int reg, unsigned char data)
{
   unsigned int ErrorCode1;
unsigned int ErrorCode2;

IdleI2C(); //wait for bus Idle
I2CStart(); //Generate Start Condition
I2CSend(I2C_SLAVE); //Write Control Byte
IdleI2C(); //wait for bus Idle

ErrorCode1=ACKStatus();

I2CSend(reg); //Write Address
IdleI2C(); //wait for bus Idle

   ErrorCode2 = ACKStatus();

I2CSend(data);
I2CAck();
IdleI2C(); //wait for bus Idle
I2CStop(); //Initiate Stop Condition

   //Errores

if(!ErrorCode1){printf("\n\rACK 1 not recieved");}
if(!ErrorCode2){printf("\n\rACK 2 not recieved"); }
}

y para leer los datos utilizo

Código: [Seleccionar]

MPU6050_read(0x3B, (char*)&accel,14);


Ahora porque tanto código, bueno cuando fui subiendo la velocidad del I2C me tope con diferentes tipos de problema los cuales mas adelante si hay lugar los explicare que por el momento mi "compañera" de investigación, que solamente tenia que documentar lo que Yo hacia, se robo mas de la mitad de mi investigación de tesis y lo ha publicado como trabajo propio  :? y esta buscando esta información que publique como loca  :D publicare toda la librería que tengo para el manejo del sensor mas adelante cuando publique lo que trabaje  8) [/code]
« Última modificación: 24 de Octubre de 2013, 19:21:43 por Vtronic »

Desconectado mao707

  • PIC10
  • *
  • Mensajes: 5
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #22 en: 25 de Octubre de 2013, 01:27:19 »
Muchas gracias Vitronic, esto me será de gran ayuda al igual de lo publicado por Facuver, que pena lo de tu compañera de tesis  :(.

yo estoy realizando también una tesis es control a un sistema de equilibrio (péndulo invertido), estoy usando el mpu 6050, por eso mi afan de manipularlo correctamente, el problema es que lo debo controlar por medio de una FPGA; pero por ahora tratar de controlarlo por medio de un microcontrolador es un gran avance.

Por cierto que referencia de microcontrolador utilizas? y con que software lo realizas?

Ojala puedas publicar pronto para que me puedas facilitar mas experiencias de tu trabajo.saludos

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #23 en: 25 de Octubre de 2013, 17:13:12 »
Vi la pregunta y se me olvido contestarla  :shock:

El microcontrolador es el PIC24FJ256DA210 utilizando el compilador C30 en Mplab, también tengo unas "librerías" muy similares en mis intentos con la familia 16F y 18F, todavía no tengo conocimientos en fpga pero mas adelante sera. Yo también espero que pronto pueda publicar el pequeño trabajo que hice, saludos.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #24 en: 26 de Octubre de 2013, 01:32:11 »
Alguna vez he utilizado el MPU9050, que a nivel software se trata como un MPU6050 (acelerómetro y giro) + un AK8975 (magnetómetro).
La librería que utilicé es la de Jeff Rowberg para Arduino, que también se utiliza en la FreeIMU

Desconectado facuver

  • PIC10
  • *
  • Mensajes: 14
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #25 en: 28 de Octubre de 2013, 15:29:21 »
mao707, utilizo un PIC18f2550 y lo programo en CCS.

Nocturno o Vtronic, alguno implemento algún filtro para complementar el acelerometro con el giroscopio?

si me pueden pasar alguna información o algún código estaría agradecido.

Saludos

Desconectado miquel

  • PIC12
  • **
  • Mensajes: 69
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #26 en: 28 de Octubre de 2013, 21:15:35 »
Hola Facuver! Te recomiendo que utilices el Filtro Complementario, aqui tienes el enlace: http://web.mit.edu/scolton/www/filter.pdf es mas fácil de implementar que el filtro Kalman.
Aquí tienes un ejemplo:
Código: [Seleccionar]
float a = 0.9994;


void complementary_filter()
{
COMPLEMENTARY_XANGLE = (COMPLEMENTARY_XANGLE + GYRO_XRATE*dt)*a + ACCEL_XANGLE*(1-a);
COMPLEMENTARY_YANGLE = (COMPLEMENTARY_YANGLE + GYRO_YRATE*dt)*a + ACCEL_YANGLE*(1-a);               
}       


Aquí tienes el enlace de donde saque este código que creo te puede interesar:
https://github.com/big5824/Quadrocopter


Saludos,

Miquel

Desconectado Vtronic

  • PIC16
  • ***
  • Mensajes: 121
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #27 en: 29 de Octubre de 2013, 03:09:10 »
Que tal facuver

Yo no implemente filtro jejeje utilice el DMP del MPU-6050 para obtener la salida en cuaterniones

Saludos

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #28 en: 30 de Octubre de 2013, 08:28:55 »
Sigo el post de cerca. Estoy por usar ese sensor y toda info es muy valiosa!!!!

Saludos!
-
Leonardo Garberoglio

Desconectado roilivethelife

  • PIC10
  • *
  • Mensajes: 1
Re: mpu6050 como interpretar los datos recibidos
« Respuesta #29 en: 24 de Noviembre de 2013, 13:08:47 »
Hola,
Os escribo para contar mi experiencia con el MPU6050.

Estoy metido en un proyecto donde necesitaba tener el angulo en un eje de un objeto.
Al principio intenté activar el DMP pero lo di por imposible en aquel momento por falta de conocimientos, y lo que hice fué crearme un filtro complementario.

El pic utilizado es un 16F a 4Mhz, y consegui ingeniarmelas para que 15ms calcule su angulo, sin usar ninguna operacion de punto flotante, y utilizando desplazamiento de bits para multiplicar/dividir, fué un aunténtico reto.
Usando el filtro complementario se necesita una rapidez considerable en el muestreo, ya que se para usar el gyroscopio tienes que integrar para calcular el giro. Liberaré el codigo cuando arregle algun problemilla de afinación.

Ahora mi meta está en cambiar el 16f por un 18f que tenga memoria suficiente para activar el DMP.

No se si alguno lo ha conseguido con un 18f, yo mi ultima prueba ha sido portar el código que hay para Arduino pero sin éxito.
Si alguien ha tenido éxito me encantaría echarle un vistazo al código.

He encontrado una libreria OFICIAL de microchip e invensense para un 24F para manejar el MPU6050, la podeis encontrar en www.microchip.com/motion Te piden aceptar una licencia y te dan acceso al código, si teneis alguna duda avisadme.
Me pondré en breves a adaptar la libreria a un 18F con bastante memoria, os comentaré los avances cuando tenga algo.

Saludos!