Razor IMU con Arduino uno

Hola y muy buenas a todos

Hace poco tiempo compre la Razor IMU de sparkfun para conectarla con mi arduino UNO y poder asi leer los valores de giro

https://www.sparkfun.com/products/10736

Para comenzar leí un articulo de la siguiente página:

http://alihpin.blogspot.com.es/2015/02/the-razor-monologue.html?showComment=1461763167985

en este blog explica como usar la IMU con un arduino uno creando un puerto serie entre la IMU y el arduino en los pines 2 y 3 a 19200 bauds, la cosa es que en la página de sparkfun dice que la imu trabaja a 57600.

De todos modos aun probando con ambos valores no soy capaz de leer nada, me sale algo del estilo de:

Output is Binary:
[#] [A] [Ah] [Bh]
[0] Ó Ó D3 D3
[1] Ó Ó D3 D3
[2] i i 69 69
[3] ý ý FD FD
[4]
[5]
... (no me deja copiar bien pero sale casi todo vacio, excepto algun caracter extraño
y al final

Yaw: ovf
Pitch: ovf
Roll: -0.00
(n)

Leyendo lo que envia char a char me sale todo el rato esto:
ýÓÓiýÓÓiýÓÓiýÓÓiýÓÓiýÓÓiýÓÓi....
(n)

Mi intención es usarla con un arduino UNO ya que no tengo otra opcion y parece que la IMU no manda la información bien o no la estoy leyendo bien

Agredecería toda la ayuda posible :cry:

Muchas gracias
 
Si reprogramaste la tarjeta? Por que como dice sparkfun da un valor elevado, y el otro sitio advierte que cualquier valor superior a 19 200 solo entrega basura al usar UART por software.
 
No no, la tarjeta la he dejado tal cual venia.

dandole al boton de reset en la IMU me da algo tal que asi.

!©j r3òò0!¹¹¹¹¹¹¹¹9é(2û;ú1"¸há+:::2k°0éhsrú*ú°h¡#rº:éhs:²ò:±¸°ja2±z:*ú:é)º!
Output is Binary:
[#] [A] [Ah] [Bh]
[0] ! ! 21 21
[1] © © A9 A9
[2] j j 6A 6A
[3] 20 20
[4] r r 72 72
[5] 3 3 33 33
[6] ò ò F2 F2
[7] ò ò F2 F2
[8] 0 0 30 30
[9] ! ! 21 21
[10] ¹ ¹ B9 B9
[11] ¹ ¹ B9 B9
Yaw: 0.00
Pitch: ovf
Roll: -0.00

aun asi no tiene sentido y no creo que tenga que estar dandole todo el rato al boton de reset para leer los valores

No se que hacer ya que mi intencion era ver este codigo como funcionaba y utilizarlo para que me ponga en el puerto serie del ordenador el valor de los angulos y que se actualicen cada cierto tiempo, pero si no consigo no que con el codigo de "The razor Imu monologe" me de los valores

Decir que el cambio logico de 3,3 a 5V lo estoy haciendo con dos resistencias de 10K y 20K como explica en la página.

¿Alguna recomendacion para probar? ¿Algo que pueda estar haciendo mal? llevo dos dias probando y estoy algo desesperado
 
Te digo, ese ejemplo usa UART por software, este método tiene un límite en la velocidad de transferencia, y según parece, el firmware original de la tarjeta usa una comunicación que excede ese límite.
 
Bueno despues de un tiempo ya he conseguido algo

Pego el codigo
Código:
#include <SoftwareSerial.h>
SoftwareSerial softSerial(2, 3);
String buff;
String prueba;
int posicioncoma;
int posicioncomaaux;
int posasterisco;
String valor9;
String valor8;
String valor7;
String valor6;
String valor5;
String valor4;
String valor3;
String valor2;
String valor1;
String valor0;

 
void setup() {
  Serial.begin(57600);
  softSerial.begin(57600);
}
 
void loop() {
  if(softSerial.available()){
    while(softSerial.available()){
      char in = (char)softSerial.read();
      buff += in;
      if(buff.indexOf('#')!=-1){

        Serial.println(buff);
        
        posicioncoma = buff.lastIndexOf(',');
        posasterisco = buff.lastIndexOf('#');
        valor9 = buff.substring(posicioncoma+1,posasterisco);
        //Serial.println(valor9);
        
        posicioncomaaux = buff.lastIndexOf(',',posicioncoma-1);
        valor8 = buff.substring(posicioncomaaux+1,posicioncoma);
        //Serial.println(valor8);

        posicioncoma = buff.lastIndexOf(',',posicioncomaaux-1);
        valor7 = buff.substring(posicioncoma+1,posicioncomaaux);
        //Serial.println(valor7);

        posicioncomaaux = buff.lastIndexOf(',',posicioncoma-1);
        valor6 = buff.substring(posicioncomaaux+1,posicioncoma);
        //Serial.println(valor6);

        posicioncoma = buff.lastIndexOf(',',posicioncomaaux-1);
        valor5 = buff.substring(posicioncoma+1,posicioncomaaux);
        //Serial.println(valor5);

        posicioncomaaux = buff.lastIndexOf(',',posicioncoma-1);
        valor4 = buff.substring(posicioncomaaux+1,posicioncoma);
        //Serial.println(valor4);

        posicioncoma = buff.lastIndexOf(',',posicioncomaaux-1);
        valor3 = buff.substring(posicioncoma+1,posicioncomaaux);
        //Serial.println(valor3);

        posicioncomaaux = buff.lastIndexOf(',',posicioncoma-1);
        valor2 = buff.substring(posicioncomaaux+1,posicioncoma);
        //Serial.println(valor2);

        posicioncoma = buff.lastIndexOf(',',posicioncomaaux-1);
        valor1 = buff.substring(posicioncoma+1,posicioncomaaux);
        //Serial.println(valor1);

        posicioncomaaux = buff.lastIndexOf(',',posicioncoma-1);
        valor0 = buff.substring(posicioncomaaux+1,posicioncoma);
        //Serial.println(valor0);
        
        buff="";
        
      }
    }
  }

}

Bueno esto para los que no tengais la IMU da una String tal que así

&34,56,23,56,12,-34,-67,34,-76#

Ahora el problema es que no tengo nidea de que es cada valor, he estado probando pero no consigo valores que cambien al rotar la IMU en un solo eje.

Alguna ayuda?
 
Última edición:
Vale ya he encontrado el kit de la cuestión.

La IMU no trae el firmware de los ángulos procesados de fabrica, si no que ahora simplemente devuelve las medidas de los sensores que lleva incorporados en una cadena.

Mirando por internet he visto las siguientes páginas donde trae un firmware ya con ejes procesados que parece que va muy bien (Ademas viene como enlace en la pagina del producto en Sparkfun):

http://wiki.ros.org/razor_imu_9dof

https://github.com/ptrbrtz/razor-9dof-ahrs/wiki/Tutorial

el problema es que no se si el Arduino Uno , puedo usarlo para cargarle el nuevo firmware al Atmega de la IMU desde el puerto serie o algo similar, para no tener que comprar el FTDI.

Muchas gracias a cualquier ayuda que me podais aportar.
 
...
el problema es que no se si el Arduino Uno , puedo usarlo para cargarle el nuevo firmware al Atmega de la IMU desde el puerto serie o algo similar, para no tener que comprar el FTDI.
...

se podría, pero hay que adaptar niveles por que la placa funciona a 3,3V me parece.

Coincido, con divisor resistivo en las salidas del Arduino Uno hacia las entradas del Razor podría andar. No es lo óptimo pero para un uso de una sola vez yo lo intentaría. En el otro sentido (salida de Razor a entradas de Arduino Uno) no haría falta nada porque los 3V3 de nivel lógico del Razor van a ser interpretados como '1' lógico por el Uno.


Código:
salida Arduino Uno ----res4K7---|--------Entrada Razor
                                |
                               Res10K
                                |
                               GND

O en vez de res4K7 -> res10K//res10K
 
Si tiene bootloader de Arduino seria remover el ATmega en el Arduino, luego un par de resistencias para adaptar los valores, hay que considerase el valor integrado en el arduino al hacer esto.
 
Ya pero el problema esque la placa de arduino uno es SMD y no puedo remover el ATmega, tambien tengo una ArduinoMega

Iba a sugerir desoldar los resistores que van entre las patas RX/TX del ATMEGA8U2 y el ATMEGA328 (RN4A y RN4B en este diagrama), pero veo que es una red de resistores y no componentes discretos... con lo cual desoldar y volver a desoldar puede ser dañino...

Para no meterle soldador lo que podrías intentar es borrar el bootloader del Arduino Uno, y hacer un programa bobo configurando los pines RX/TX del Uno como entradas (sin pull-up/down) y no haga absolutamente nada.
De esa forma el Arduino Uno va a estar efectivamente desconectado de esos pines.
Pero claro, la cuestión es después volver a ponerle el bootloader al uno... prrrrffff

¿Que tal esto?: meter un software en el arduino que emule un puerto serie hacia el Razor y reenvíe lo que recibe por los pines TX/RX y sea transparente entre la PC y el Razor... mmmm tampoco me parece muy conveniente.

La última: no usar el bootloader del Razor, sino programarlo vía ISP siguiendo las pautas de:
https://sysexit.wordpress.com/2013/...der-to-an-arduino-nano-using-another-arduino/
con las modificaciones siguientes:
Divisor resistivo en las salidas del Uno al Razor (patas MOSI, SCK, RST), y en vez de enviarle VCC = 5V desde el Uno enviarle 3.3V (del conector que dice POWER).
Y al final de todo en lugar de
Finally, click in the Tools -> Burn Bootloader menu item. After some seconds of flashy LED blinking, the brand new Arduino is ready to use! Have fun!
Usar Sketch->Upload Using a Programmer para cargar el programa nuevo del Razor.
 
Hola y buenas Ardogan.

Tu respuesta es muy completa y de gran ayuda, te lo agradezco mucho aunque ya he conseguido programarlo gracias a un circuito que tenia por ahi con un MAX233 que tenía configurado el CTS y RTS, ya que al principio probe a programar el micro solo conectado los cables de transmision y recepcion pero no funciono, así que me di cuenta que el micro usaba el CTS y RTS (Cosa rara la verdad, primera vez que veo un micro que lo use para no desbordar el buffer).

De todos modos tambien quiero hacer la prueba de intentar programarlo via ISP ya que es algo que no estaría nada mal.

Un saludo y muchas gracias a todos
 
Hola y buenas Ardogan.

Tu respuesta es muy completa y de gran ayuda, te lo agradezco mucho aunque ya he conseguido programarlo gracias a un circuito que tenia por ahi con un MAX233 que tenía configurado el CTS y RTS, ya que al principio probe a programar el micro solo conectado los cables de transmision y recepcion pero no funciono, así que me di cuenta que el micro usaba el CTS y RTS (Cosa rara la verdad, primera vez que veo un micro que lo use para no desbordar el buffer).

De todos modos tambien quiero hacer la prueba de intentar programarlo via ISP ya que es algo que no estaría nada mal.

Un saludo y muchas gracias a todos

Sí, lo que hiciste es bien sencillo y directo. El CTS y el RTS el Razor no lo usa para hacer control de flujo, fijate en el esquemático que uno lo conecta directamente a GND (no se usa), y el otro lo conecta al pin de reset del micro. Con este último controla como entrar y salir del bootloader.

Suerte!!
 
Atrás
Arriba