domingo, 26 de febrero de 2012

AHRS 9DOF Razor IMU Parte 2

Como ya comenté en AHRS 9DOF Razor IMU Parte 1, la adaptación del código de Mongoose no termina de funcionar todo lo bien que cabría esperar. Como ha pasado tiempo desde que empecé con este tema en la página de Sparkfun vi que ya tienen -por fin- actualizado el código así que me he puesto a hacer pruebas. Bueno, realmente no es que lo haya actualizado Sparkfun, creo que lo ha hecho uno o varios usuarios, ya sabéis, esa es la maravilla de Arduino, su comunidad que trabaja gratuitamente compartiendo. Toda su información original la podéis encontrar en

https://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs

Como no podía ser de otra manera ha sido coger el código tal cual, subirlo a la tarjeta y funcionar a la primera. He hecho un primer cálculo del tiempo de ejecución del bucle (sin el envío de datos) y está en torno a los 10 ms, alguna vez da lectura de 11 ms. Tenemos prácticamente 5 ms más que con el código de Mongoose lo que sin duda es mucho tiempo. Esto me va a permitir poder enviar los datos de los ángulos y los datos de los sensores que necesite (probablemente sólo el acelerómetro) sin problemas. Voy a seguir con mi método de envío de datos ya explicado en la Parte 1 de manera que el tiempo de envío de todos los datos será tan bajo que me permitirá bajar la velocidad de transmisión que con el código Mongoose tenía en 115.200 bps. Bajar la velocidad siempre es bueno ya que se tienen menos problemas de transmisión. Una vez montado el cuadricóptero seguro que habrá mucho ruido producido por los ESC y los motores así que calcularé cuál es la velocidad más baja que me permita enviar todos los datos que requiero. Un primer cálculo teórico aproximado estimo que si envío los ángulos y los datos del acelerómetro la trama puede tener en torno a 17 bytes. Ajustando a un máximo de 9 ms (20 ms del tiempo de ciclo menos 11 ms máximo del tiempo de ejecución) y estimando unos 10 bits por byte tenemos 17 * 10 / 0,009 = 18.889 bps. Cualquier velocidad superior a esa -con suficiente margen, no tomaremos 19.200 bps- nos será válida.

El código viene con varias opciones de envío de datos por el puerto serie, pudiendo activar uno u otro. Con el mismo criterio he añadido un output_EnviarArduino() para activar el envío de los datos que quiero en mi formato, esto es, los tres ángulos y los tres datos del acelerómetro multiplicados por 100 para tener precisión de 1 centésima y poder enviar cada dato con tan solo 2 bytes. Subo todos los archivos, también los de Processing con el que al activar la salida de datos

int output_mode = OUTPUT__MODE_ANGLES_TEXT 1

en lugar de la mía

int output_mode = OUTPUT__MODE_EnviarArduino;

podremos ver en Processing gráficamente la posición de nuestro AHRS.

También veréis una sección en la que se pueden calibrar los sensores. El enlace explica muy bien cómo hacerlo.

Archivo para 9DOF Razor: Razor AHRS
Archivo para leer los datos enviados: Leer 9DOF Razor v1.0.1

    Hay una nueva entrada en AHRS 9DOF Razor IMU Parte 3.

14 comentarios:

  1. Que tal Cheyenne, has dejado esta entrada a medias y así me has dejado a mí. Jejeje. Por cierto, como tienes pensado completar el equipo (Motores,ESC, batería)

    ResponderEliminar
  2. Hola pepote97.
    Gracias por tu comentario, eres el primero que lo hace en mi blog. Este blog pretende ser un poco una ordenación de mi proyecto. No lo hago muy completo y al detalle entre otras cosas porque requiere más tiempo del que puedo disponer. Por eso tampoco hago publicidad del blog pero sí me he propuesto responder cualquier duda o pregunta de cualquier usuario.

    Esta entrada está a medias pero verás que es muy reciente puesto que no es que la haya dejado colgada, es que estoy trabajando en ello.

    También haré entradas para hablar de motores, ESC y batería. Te adelanto que el material lo he ido comprando en Hobbyking, los motores son los Turnigy 2209, los ESC compré 2 Turnigy Sentry 18A y como los han descatalogado he tenido que adquirir otros 2 Turnigy Plush 18A. No sé si me dará problemas que no sean exactamente iguales. La batería una Turnigy 2650 mAh 3S 20C con idea de hacer las pruebas y más adelante comprar otra más grande para tener más autonomía. Para los motores compré dos juegos de hélices, unas APC 8x3,6 para pruebas (menos consumo, menos ruido, menos peligro) y otras APC 9x4,5 para el proyecto final, estas son con las que el motor da toda su fuerza, 800 gramos de empuje máximo por motor.

    Si un día funciona todo bien podría animarme a subir la potencia de todo para poder llevar más peso. La idea es llegar a poner una cámara.

    ResponderEliminar
  3. Pregunta tonta, porque no has optado por un arducopter, kk o dji naza o algo así

    ResponderEliminar
  4. Aquí nunca se deja de aprender, conozco varios proyectos de multicópteros pero justo el dji naza no sabía de él.
    El no optar por uno ya hecho o en kit simplemente es porque lo que quiero es hacerlo yo. Se juntan varias áreas de conocimiento en las que me defiendo, fundamentalmente electrónica y programación. El camino para desarrollarlo es para mí un hobby y un reto personal a través del cual aprendo muchas cosas.

    ResponderEliminar
  5. jeje, entonces aprenderemos de tí. Yo que vengo del calculo de estructuras de hormigón y acero poco te puedo ayudar, por eso leo y aprendo. DJI es una empresa con 20 ingenieros e incluso alguna que otra facultad que ha creado el naza y el WKM, ambos sistemas de estabilización pero el wkm incorpora GPS y se dispara de presupuesto, echale un ojo cuando tengas un rato, DJI-INNOVATIONS o algo así son la caña. De todos modos, sigo tus pasossssssssssss jejeje

    ResponderEliminar
  6. Pues me alegra e ilusiona tener quien siga mis avances. Seguiré escribiendo poco a poco todas las fases de mi proyecto. Al igual que tú tal vez le sirva a alguno más que caiga por aquí.

    ResponderEliminar
  7. Pregunta, ¿puede ser que en el archivo "Leer 9 DOF razor" falte la parte del codigo correspondiente a que hacer en caso de fallo de la conexion serie?

    En un determinado momento el codigo se bifurca en el caso de que se de la condicion de fallo true o fallo false, pero no veo por ningun lado lo que sucede en el caso del false >.<

    ResponderEliminar
  8. Hola Marcos.
    No es que falte, si la lectura da error el código de lectura no hace nada puesto que nada puede hacerse. Los valores de roll, pitch y yaw se quedan con el último valor recibido y la variable Error9DOF se pone a true indicando que se ha producido un error en la recepción. El envío de datos se produce cada 20 milisegundos, si es un error temporal por la transmisión enseguida se recibirá el siguiente envío de datos. En caso de persistir el error es el usuario de este código el que tiene que programar qué hacer en función de su proyecto. En el caso de un cuadricóptero lamentablemente creo que no se puede hacer nada sino ver cómo se va directamente al suelo...

    ResponderEliminar
  9. hola, AAHAHAHA!!! se borro todo mi comentario no puedo creerlo, te escribí prácticamente una carta de tu proyecto el cual admiro por proporcionarnos esta información y conocimientos que tienes, te decía que en verdad necesito tu ayuda y si puedes proporcionármela te lo agradeceria much, espero tu respuesta amigo y en cuanto tenga tu respuesta poder explicarte algunas(muchas) dudas con respecto este proyecto tan importante para mi (entregarlo en un mes para titularme xD / u.u)

    ResponderEliminar
  10. disculpa, en la programacion del cuadricoptero del codigo completo por que tienes 0 en:

    double Kproll = 0;
    double Kiroll = 0;
    double Kdroll = 0;
    no se supone que deve tener algun valor como
    double Kproll = 30;
    double Kiroll = 0.003;
    double Kdroll = 0;
    ???
    no se de esto tu eres el que sabe ayuda!!!

    ResponderEliminar
  11. oyee otra pregunta como puedo adaptar el 9dof sensor stick por el razor no puedo :/

    ResponderEliminar
  12. aa sii se me olvido comentarte una ultima cosa, GRACIAS POR NADAAA!!!

    ResponderEliminar
  13. Hola emmanuel99.

    Siento no haber podido contestarte antes pero tampoco creo que me merezca tu último comentario. A poco que leas mi blog habrás podido ver dos cosas. La primera que el proyecto no está terminado y yo aún no he hecho pruebas de vuelo (aunque con las bases de este proyecto sé que hay gente que mejor o peor ha hecho volar el suyo). Y la segunda habrás visto que mi última entrada es de Julio de 2013, justo hace un año, lo cual te indicará que no dispongo de tiempo para seguir avanzando ni de estar al día de las preguntas de otros usuarios para responderlas. Aún así intento dar respuestas cuando puedo.

    Las constantes PID están a cero porque las tengo sin definir y en ese programa las varío en tiempo real con tres canales de la emisora para ver el efecto que producen en el vuelo. Cuando estén configuradas, cuyos valores hay que encontrar para cada modelo de cuadricóptero que se construye, cada constante tendrá su valor.

    Para adaptar el 9DOF sensor stick no puedo decirte, el Razor incluye un microcontrolador en donde va todo el programa y sacas los datos tratados que quieres hacia otro microcontrolador mientras que el sensor stick es sólo una placa con los sensores, tendrás que sacar las lecturas de esos sensores a otro microcontrolador para tratar los datos.

    Por último, ¿esto es tu proyecto de fin de carrera que tienes que entregar en un mes y todavía estás en este punto...?

    ResponderEliminar
  14. gracias por que ya no tienes tiempo, trabajas?

    ResponderEliminar