Sensores IMU y protocolo I2C

Hola, saludos, estoy trabajando con sensores IMU de 9DOF, pero sucede que necesito conectar 13 de estos dispositivos a una tarjeta programable ya sea arduino o dspic o cualquier otra tarjeta que soporte el I2C, pero estas tarjetas solo soportan una o dos conexiones al protocolo, por lo tanto es necesario usar un expansor de I2C, he leído sobre algunos pero no se que tan confiables sean, si alguien conoce o trabajado con estos sensores, agradezco cualquier comentario...

Gracias....
 
Hola ingdirson, un solo bus I2C en teoría es capas de soportar hasta 127 dispositivos I2C.
La limitarte normalmente es la cantidad de direcciones hardware que dispone el dispositivo I2C, por ejemplo la memoria I2C 24c04A de microchip tiene los pines A0, A1 y A2 lo que indica que este chip soporta hasta 7 direcciones (0 a 7) por lo cual se puede colgar al bus I2C hasta 8 de estas memorias, Te sugiero que subas el manual o por lo menos la imagen del sensor que desea usar y así podremos sugerirte la solución que mas se ajuste al problema.
 
hola, tengo una situacion, quiero que el micro 8051 genere por uno de sus pines una onda cuadrada de frecuencia 100khz, usa un osc 12MHZ, pero no me genera una freceucnia mayor de 10 khz, me dijeron que era por el reloj, pero nos e que hacer, porque el codigo esta bien, lo probe en proteus y el programa es MicroC Pro 8051. si me pudieran ayudar please.
 
hola alfredolobaina, recordando la época en que usaba al at89C52 que igual tiene la arquitectura 8051 te comento que:
Un ciclo maquina se ejecutaba en 12 ciclos de reloj esto significa que si el cristal es de 12MHz la velociadad a la que va tu chip es de 12MHZ/12=1Mip, eso significa que cada instrucción como ser el noptarda en ejecutarse 1us. El periodo de la onda cuadrada de 100KHz es de 10us y el semiperíodo alto y bajo son de 5us.
Para lograr generar la frecuencia de 100KHz el microcontrolador tendría que efectuar esa única tarea, que tal si subes tu código para ver como ayudarte.
 
Gracias por responder.

Aquí está el código sin interrupciones en MicroC Pro 8051:
PHP:
sbit Senal at P1_0_bit;

void main(){

P1= 0x00;

  TF1_bit=0;        
  TMOD=0x20;       

  IE =0x88; //   
  TL1=0xf5; // 10us
  TR1_bit = 1;      

  while(1){
  if(TF1_bit)
    { TF1_bit=0;
     Senal=~Senal;
     TL1=0xf5;
    }
 }

}
Con interrupciones me da menor la frecuencia que sin interrupciones:
PHP:
sbit Senal at P1_0_bit;

                        

void INTERRUPT_T1() org 0x001B ilevel 1
{
  EA_bit = 0;   //Disable Interrupts
    TF1_bit= 0;    // Disable bandera de sobreflujo

    Senal=~Senal;

  
 TL1=0xf5; //
   EA_bit = 1; //Enable Interrupts

}


void main(){

P1= 0x00;
  
    //inicializar timer
  TF1_bit=0;         // Disable bandera de desbordamiento de T1
  TMOD=0x20;          //MODO 1

  IE =0x88; //       
  TL1=0xf5; // 10us
  TR1_bit = 1;       // Run Timer1
  
  while(1){
}


}
En el proteus solamente puse el micro y el frecuencímetro en el pin P1.0, y no genera la frecuencia que yo programé, suponiendo en este caso 50khz.
Creo que tengo que usar lenguaje ensamblador en el microcontrolador y aumentar el oscilador a 24Mhz, pero tengo que hacer bien los cálculos porque no me da exacto.
 
Última edición por un moderador:
Hola, alfredolobaina desafortunadamente ignoro la frecuencia maxima a la que trabaja el 8051 que dispones.
Para lograr el cometido de los 100KHz con 12MHz de cristal solo se puede usar asm y sin interrupciones, este un ejemplo.
Código:
//at 89c52, xtal=12MHz=>cm=1us
void main() 
{
 asm{
     bucle:
        mov p1,#1      //2 cm
        nop;           //1 cm
        nop;           //1 cm
        nop;           //1 cm
        mov p1,#0      //2 cm
        nop;           //1 cm
       sjmp bucle       //2 cm
    }
}
Dibujo.PNG
 

Adjuntos

  • 8051.rar
    117.8 KB · Visitas: 1
Te sugiero que subas el manual o por lo menos la imagen del sensor que desea usar y así podremos sugerirte la solución que mas se ajuste al problema.

Hola, Saint te anexo imagen del sensor y la hoja de datos del mismo.
Para que me comprendas u poco mejor, necesito adquirir datos de 13 dispositivos al tiempo, lo cual me demanda una velocidad de procesamiento muy elevada y debido a que es una aplicación para biomedica esta requiere de mucha presicion en los datos obtenidos, es por esto que he pensado en usar un arduino nano para cada IMU y obtener los datos por I2C de forma individual y luego hacer una red con spi para llevar estos datos hasta un arduino mega y guardar estos datos en una memoria SD, y luego poder procesarlos en Matlab.
 

Adjuntos

  • GY-9250-1.jpg
    GY-9250-1.jpg
    53.9 KB · Visitas: 9
  • MPU-9250-Datasheet.pdf
    655.2 KB · Visitas: 7
¿Y por que no utilizas SPI directamente con los mpu-9250?, 1 línea de selección de esclavo para cada uno y listo (y si son demasiadas líneas, uno o dos registros serie-paralelo y se resuelve todo con 4 líneas del micro).

¿Sera que queres usar el bus i2c de los mpu por una cuestión de compatibilidad de software ya hecho?
 
Hola ingdirson, viendo la hoja de datos que subiste se ve que solo puedes colgar hasta dos de estos sensores por el bus I2C y el echo de que quieras usar 1 arduino para cada sensor y luego uno mas para recoger los datos de los arduinos anteriores me parece algo excesivo... la mejor opción como sugiere Ardogan es que uses directamente el bus SPI con el que también cuenta el sensor.
 
¿Sera que queres usar el bus i2c de los mpu por una cuestión de compatibilidad de software ya hecho?
Hola Ardogan, no tengo problema con software, voy a explorar tu opción y a familiarizarme con el protocolo SPI, sucede que hasta ahora, todo lo que conozco es mas teórico, porque aun no me llegan los sensores físicos.
Muchas Gracias...
 
Hola Ardogan, no tengo problema con software, voy a explorar tu opción y a familiarizarme con el protocolo SPI, sucede que hasta ahora, todo lo que conozco es mas teórico, porque aun no me llegan los sensores físicos.
Muchas Gracias...

Ah ok.
Un consejo ya que vas a usar un periférico (el módulo spi) nuevo: empezá probando de abajo hacia arriba (desde el punto de vista de arquitectura de software) (hardware = abajo, software de aplicación = arriba). Quiero decir, empezar por spi, luego una capa arriba estaría la comunicación con el mpu-9250, y luego de eso tu aplicación llamaría a las funciones del mpu-9250. El día de mañana cuando quieras volver a usar el mpu-9250 o el módulo spi para otra cosa vas a poder reutilizar ese código.
Ejemplo de mini-plan de desarrollo:

  1. Fijate como enviar 1 byte por spi: esto implica:
    1. Configurar los pines de entrada/salida (incluyendo selección de esclavo). Esto sería registros de I/O del micro.
    2. Configurar el reloj del spi
    3. Configurar parámetros como: estado de líneas de datos y reloj en reposo, si se transmite primero el bit más significativo o el menos significativo, en que flanco de reloj se leen/escriben los datos (modo spi, normalmente se usa modo 0 o 3). Los puntos 2 y 3 sería configuración del módulo SPI
    4. Que registros hay que escribir para que transmita, hay flags de interrupción?, como se comportan?. Esto sería operación del módulo spi.
    5. Conexionado de hardware: si hace falta usar pull-ups o no, si hay que adaptar niveles de tensión...
  2. Leer 1 byte por spi: acá ya sería la parte de operación solamente si ya resolviste bien todo lo anterior.
  3. Probar escribir 1 registro del mpu-9250 (uno inofensivo, a ver la hoja de datos... no está, a ver acá, por ejemplo un registro de habilitación de interrupción "interrupt enable").
  4. Probar leer 1 registro del mpu-9250 (id o estado, o el de interrupciones que escribiste en el punto anterior y de paso verificás 2 pájaros de un tiro: escritura y lectura de registro): esto implicaría escribir 1byte por spi para indicar la dirección de registro, y leer a continuación 1 byte para leer el contenido del registro.
Luego de eso, ya podrías ver si te conviene usar librería/código hecho (buscá en la página del fabricante, github, o si hay algo en sparkfun o adafruit, o proyectos personales similares al tuyo) o hacerlo por tu cuenta. Pero con eso si encontras alguna librería bien hecha que te guste la vas a poder adaptar fácilmente con el trabajo realizado (podría llegar a cambiar como se trabaja con el spi, la capa más de abajo, pero -si la librería está bien hecha- no haría falta cambiar nada más).

En esto punto ya volvés a adoptar una perspectiva "de arriba hacia abajo",
o ir alternando según te parezca (a lo mejor decidís que vendría bien leer un bloque de datos/registros de un tirón por ejemplo para leer todos los registros de datos del mpu-9250 en 1 sola función).

Por último cuidado!!!, la elegancia está en la sencillez, nunca complicar el código más de lo estrictamente necesario; que parece lo más fácil pero no lo es.

Perdón por la perorata, debo estar proyectando más mis propios errores pasados que quizás dando un consejo que te sea útil :rolleyes:. Ese es un sensor bastante complejo, una vez que resuelvas como usarlo bien ya vas a tener lo más difícil del proyecto resuelto.

Saludos.
 
Buenas dias,

Me gustaría comentarles un problema que me ha surgido.

Actualmente tengo un IMU con acelerómetro,giroscopio y magnetómetro,los 3 de 3 ejes. Hasta el momento he estado utilizando sobre todo el acelerómetro, que tiene como referencia la gravedad.

He visto en varios sitios que para poder calcular la orientación también es necesario el giroscopio, cosa que ya tengo clara, pero mi problema surge al calcular la posición.

Según lo que he leido, es necesario calcular la aceleración lineal para poder calcular la posición integrando dos veces por el método del trapecio. No sé como hacerlo porque con el simple hecho de girar el imu, ya me pueden dar aceleraciones de -1g, cosa que sería mentira porque en ningún momento he movido mi imu, lo único que he hecho ha sido girarlo. He leido que con restar el valor de la gravedad, a las aceleraciones gravitacionales sería suficiente, pero si lo hago me sigue sin resolver el problema ya que al hacer simples giros me sigue marcando aceleraciones.

Para que os hagais a la idea, mi proyecto consiste en un brazo robótico el que gracias al imu tiene que sabe en todo momento en que posición exacta se encuentra.

Mi pregunta concreta sería, ¿ cómo calculo esas aceleraciones traslacionales de mi imu?¿Es necesario tener algún otro sensor para lograrlo, como un gps?¿Puedo hacerlo solo con el giroscopio,magnetómetro y acelerómetro?

Un saludo.
 
Última edición:
Buenas dias,

...He visto en varios sitios que para poder calcular la orientación también es necesario el giroscopio, cosa que ya tengo clara, pero mi problema surge al calcular la posición.
¿Estas usando alguna librería en especial?
Según lo que he leido, es necesario calcular la aceleración lineal para poder calcular la posición integrando dos veces por el método del trapecio. No sé como hacerlo porque con el simple hecho de girar el imu, ya me pueden dar aceleraciones de -1g, cosa que sería mentira porque en ningún momento he movido mi imu, lo único que he hecho ha sido girarlo. He leido que con restar el valor de la gravedad, a las aceleraciones gravitacionales sería suficiente, pero si lo hago me sigue sin resolver el problema ya que al hacer simples giros me sigue marcando aceleraciones.
Mmmm si, no es tan directo, y ni siquiera me parece que puedas lograr un buen resultado.
Aun cuando fuera que en vez de un brazo tenes un punto infinitesimal (sin rotación solo traslación), usando doble integración el error va a crecer en forma cuadrática con el tiempo solo por el error del acelerómetro.

Pasando a un cuerpo real, el acelerómetro no distingue rotación de traslación. Para eso hay que usar alguna librería que combina acelerómetro + giróscopo para separar rotación y traslación.
Luego está también el vector de gravedad, filtro pasabajo para obtener orientación y filtro pasa-alto para obtener aceleración cinemática digamos (que acá estaría combinado rotación + traslación).

Para que os hagais a la idea, mi proyecto consiste en un brazo robótico el que gracias al imu tiene que sabe en todo momento en que posición exacta se encuentra.

Mi pregunta concreta sería, ¿ cómo calculo esas aceleraciones traslacionales de mi imu?¿Es necesario tener algún otro sensor para lograrlo, como un gps?¿Puedo hacerlo solo con el giroscopio,magnetómetro y acelerómetro?

Emmmm, es complicado sacar la posición usando un IMU, sirve cuando no hay otra alternativa posible, pero normalmente uno empezaría viendo trabajar con encoders de algún tipo.
El GPS te va a dar una posición con un error de hasta decenas de metros, ah.. sos de España, algunos metros entonces (ustedes allá tienen satélites AGPS para mejorar la exactitud), pero a menos que el brazo esté al aire libre y le baste manejarse con algún que otro metro de error (porque está sobre un carrito o algo así), no me imagino como pueda servir (seguramente que no para medir la posición de las articulaciones/segmentos).

Acá hay una página bien documentada
http://www.varesano.net/projects/hardware/FreeIMU

Pero a ver.... me parece que estamos pidiendo mucho más de lo necesario. Con saber bien los ángulos de cada segmento del brazo, ¿no debería alcanzar para conocer la posición del brazo? (se utilizan ángulos medidos + dimensiones y grados de libertad conocidos de antemano del brazo).
Con algo que tome las medidas del acelerómetro/giróscopo y te devuelva la orientación de cada segmento del robot, ¿no sería suficiente?.
Con esa información y aplicando cinemática directa podés conocer posición/orientación del brazo, a ver que busco algo en español.... por ejemplo esto:
http://www.esi2.us.es/~vivas/ayr2iaei/CIN_ROB.pdf
 
Atrás
Arriba