Guía de giroscopio y acelerómetro con Arduino incluye filtrado de Kalman

esta guía fue publicada primero en el foro de Arduino y se puede encontrar aquí: http://arduino.cc/forum/index.php/topic, 58048.0.html

Yo apenas había publicado, así que aún más conseguirá un uso. El código se puede encontrar aquí:
https://github.com/TKJElectronics/example-Sketch-for-IMU-including-Kalman-Filter

Hola todo el mundo
Hace poco compre esta placa IMU 6DOF analógico (seis grados de libertad) (http://www.sparkfun.com/products/10010) de watterott.com. Utiliza tres giroscopios y acelerómetros de tres para calcular ángulos en tres dimensiones.

Miré un rato algo de código en línea y cómo conectarse con ellos. Después de muchas horas de investigación, logré hacer una medición precisa af de ángulos en dos direcciones. Decidí escribir a una pequeña guía para los entusiastas compañeros de electrónicos.
El objetivo principal de esta guía es enseñar a otros cómo obtener algunos datos útiles de la IMU o un giroscopio o acelerómetro. El código de Arduino puede encontrarse en github: https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter. Debería ser bastante fácil de implementar mi código a su propio sensor. No voy a describir todos los detalles sobre la teoría detrás de, en lugar de otro puede buscar en las fuentes para obtener más información.

Antes de comenzar tienes que conectar el IMU como sigue:

Acc_Gyro Arduino
<> – 3, 3V 3, 3V
TIERRA <>: GND
Gx4 X <> — AN0
Gx4 Y <> — AN1
Gx4 Z <> — AN2
AN3 ACC X <> —
ACC Y <> — AN4
AN5 ACC Z <> —

También conectar 3, 3V al pin AREF en el Arduino para más exactitud.
Es muy importante que no conecte el sensor a 5V, esto destruirá el sensor.

Ahora está listo para leer algunos datos del sensor.

Para comunicarse con el sensor es sencillo:
El giróscopo mide grados por segundo mientras que el acelerometro mide aceleración (g) en tres dimensiones. Ambas salidas las medidas como una señal analógica.
Para obtener estos traducido a grados que tienes que hacer algunos codificación:

El giroscopio
Primero tienes que traducir quids (un número de 0-1023) en algo útil (esto es para un ADC con una resolución de 10 bits, por ejemplo debe ser 4095 (2 ^ 12-1 = 4095) de 12 bits ADC). Para ello sólo utilizo esta simple ecuación:
gyroRate = (gyroAdc-gyroZero) / sensibilidad - donde gyroAdc el valor leido de nuestro sensor, gyroZero es el valor cuando es inmóvil (esto se hace en el código - mira en la sección "Configuración") mientras que la sensibilidad es la sensibilidad en la hoja de datos, pero traducido a quids.

Si te fijas en las hojas de datos de dos giroscopios (http://www.sparkfun.com/datasheets/Sensors/IMU/lpr530al.pdf y http://www.sparkfun.com/datasheets/Sensors/IMU/LY530ALH.pdf), verá que la sensibilidad es 3.33mV/deg/s para el 4xOUT. Traducir en quids es bastante fácil: sensibilidad / 3.3 * 1023.
Así que en este ejemplo me sale:
0.00333/3.3*1023=1.0323.

Nota: para traducir mV v simple sólo se dividen por 1 mil.

La ecuación final tendrá el siguiente aspecto:
gyroRate = (gyroAdc-gryoZero) / 1.0323

El resultado va a salir como grados por segundo. Para traducir esto en grados tienes que saber la hora exacta desde el último bucle. Afortunadamente, el Arduino tiene un simple comando para hacerlo: millis(). , Uno puede calcular la diferencia de tiempo (tiempo de delta) y así calcular el ángulo del giroscopio. La ecuación final tendrá el siguiente aspecto:
gyroAngle += gyroRate * tiempo/1000

Por desgracia, el giro se desplaza en el tiempo. Eso significa que no se puede confiar para un intervalo de tiempo más largo, pero es muy preciso para un a corto plazo. Esto es cuando el acelerómetro es útil. No tiene ninguna deriva, pero es demasiado inestable para el intervalo de tiempo más corto. Voy a describir cómo combinar estas medidas en un tiempo, pero primero voy a describir cómo traducir las lecturas del acelerómetro en algo útil.

El acelerómetro
El acelerómetro mide la aceleración (g) en tres dimensiones. Para traducir el análogo lecturas en grados que basta leer el eje y para restar el offset cero así:
accVal = accAdc-accZero

Donde accAdc es la lectura analógica y accZero es el valor cuando lee g 0 - se calcula en el comienzo del código, busque en la sección de "Configuración". El valor cero se encuentran también en la hoja de datos: http://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf. Verás que la tensión a 0g es aproximadamente 1, 5V, para traducir esto a quids, otra vez tienes que usar esta ecuación: zeroVoltage / 3.3 * 1023.
Así que en este ejemplo me sale:
1.5/3.3*1023=465.

Entonces puede calcular el pitch y roll utilizando las siguientes ecuaciones:
Pitch = atan2 (accYval, accZval) + PI
rodillo = atan2 (accXval, accZval) + PI

Atan2 tiene un rango de salida de - π a π (ver http://en.wikipedia.org/wiki/Atan2), simplemente añadir π, por lo que la gama se convierte en 0 a 2π.
Para convertir de radianes a grados simplemente multiplicamos el resultado por 57.295779513082320876798154814105 - esto está predefinido en el IDE de Arduino como RAD_TO_DEG.

Filtro de Kalman
Como expliqué anteriormente el giro es muy preciso, pero tienden a la deriva. El acelerómetro es un poco inestable, pero no a la deriva. Puede calcular el ángulo exacto utilizando algo que se llama un filtro de Kalman. Una guía detallada sobre cómo se implementa se puede encontrar en mi blog: http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it/.

Si quieres usar algo un poco más simple, puede usar lo que denomina un filtro complementario. Es bastante fácil de entender y la matemática es mucho más sencilla, ya que sólo funciona en un solo paso.
Por ejemplo la ecuación podría parecer esto:
ángulo = 0,98 *(angle+gyro*dt) + 0,02 * acc - usted puede afinar los números para lo que quieras. Recuerde que la suma debe ser 1.
Para mí el resultado del filtro complementario fue muy cercano (o casi lo mismo) que el calculado por el filtro de Kalman.

Ahora han aprendido (espero) Cómo obtener datos analógicos de IMU y traducirla a algo útil. He adjuntado mi propio código para mi IMU 6DOF (http://www.sparkfun.com/products/10010), pero con algunas modificaciones un poco, estoy seguro de que es posible utilizarlo con cualquier giroscopio/acelerómetro analógico.

Si usted tiene cualquier pregunta, cayó libremente para enviar un comentario a continuación.

Fuentes:

http://www.Arduino.CC/cgi-bin/yabb2/YaBB.pl?NUM=1284738418
http://www.x-firm.com/?page_id=148
http://Web.MIT.edu/First/Segway/

Actualización
Acabo de terminar un código de procesamiento que imprime datos de Arduino en un gráfico agradable. Como se puede ver en el siguiente vídeo el filtrado es dejar de fumar efectivo. La línea azul claro es el acelerómetro, la línea morada es el giroscopio, la línea negra es el ángulo calculado por el filtro complementario y la línea roja es el ángulo calculado por el filtro de Kalman. Como se puede ver el filtro de Kalman es un poco más preciso (sé que es difícil de ver en el vídeo) que el filtro complementario, sobre todo cuando sacudirla.
He adjuntado mi código, el código actualizado para el Arduino y el código de procesamiento. También es posible ver los datos del eje y. Sólo Quite el comentario de drawAxisY(); en el código.

Firmware más reciente
Decidí poner todo el código fuente en github, ya que es mucho más fácil de mantener.
El código más reciente puede encontrarse ahora en github: https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter

Mi robot de balanceo
A continuación hay un video de mi robot equilibrado. Utiliza el mismo IMU y algoritmo como se describe en el post anterior.

Pedal de arranque
Yo he liberado a mi robot equilibrio en Kickstarter: http://www.kickstarter.com/projects/tkjelectronics/balanduino-balancing-robot-kit
Por favor considere apoyar el proyecto.

Artículos Relacionados

GY-521 MPU6050 giroscopio de 3 ejes y acelerómetro con Arduino

GY-521 MPU6050 giroscopio de 3 ejes y acelerómetro con Arduino

Este video tutorial va sobre la instalación y configuración de un tablero de GY-521 MPU6050 3 ejes giroscopio y acelerómetro con un Arduino. Después de algunos problemas iniciales con pude conseguir el componente de trabajo. Al principio tuve problem
Medida del ángulo mediante giroscopio, acelerómetro y Arduino

Medida del ángulo mediante giroscopio, acelerómetro y Arduino

el dispositivo es un prototipo áspero de lo que eventualmente se convertirá en un robot de balance del uno mismo, esta es la segunda parte de la cosa del agujero (leer acelerómetro y controlar un motor a balance del uno mismo). La primera parte con s
Controlador de Bluetooth juegos con acelerómetro y Arduino

Controlador de Bluetooth juegos con acelerómetro y Arduino

Todo el mundo le gusta jugar juegos en PC :) ¿Consolas de juegos llevan al siguiente nivel y es más diversión que hacer uno mismo? Aquí hemos construido una consola de juegos con acelerómetro, Arduino y Bluetooth. El acelerómetro en la consola de jue
Dados de acelerómetro con circuitos 123D

Dados de acelerómetro con circuitos 123D

este es el proyecto que Autodesk CEO Carl Bass un poco de atención adicional de la TSA en su camino a Tokio MakerFaire.  Aquí está un artículo sobre eso...Hicimos esto como forma de demostración de algunas cosas que puedes hacer con nuestras aplicaci
Acelerómetro con un tablero de Mediatek Linkit

Acelerómetro con un tablero de Mediatek Linkit

Hoy voy a mostrar cómo Mediatek Linkitone Junta trabaja con accellerometer ADXL335.El ADXL335 es pequeña, delgada, de bajo consumo, acelerómetro de 3 ejes completacon la señal había condicionada salidas de voltaje. La aceleración de las medidas de pr
Captura de movimiento con un acelerómetro de Arduino con XBee comunicaciones

Captura de movimiento con un acelerómetro de Arduino con XBee comunicaciones

***************************************ACTUALIZADO 10 DE JUNIO DE 2014 ***Según lo prometido, este Instructable ha sido actualizado para incluir una sección sobre comunicación XBee. Además, un Instructable nuevas se publicarán pronto sobre el desarro
Arduino / proceso - seis ejes giroscopio y acelerómetro

Arduino / proceso - seis ejes giroscopio y acelerómetro

¡Hola mundo! Hoy quería probar el módulo de acelerómetro GY-521 a.k.a MPU 6050. ¡ Mira el video y seguir el siguiente paso para la lista de esquema, código y partes.¿Qué necesita?IDE de Arduino (supongo que ya esta.)Procesamiento de IDE (Necesario pa
MPU6050: Acelerómetro de Arduino 6 ejes + Gyro - GY 521 prueba y simulación 3D

MPU6050: Acelerómetro de Arduino 6 ejes + Gyro - GY 521 prueba y simulación 3D

¿Está usted buscando para hacer tu propio quadcopter abejón o RC avión con Arduino pero no sabes cómo conseguir el giro de trabajo? ¿Quizás usted ya compró algunos módulos de 6 eje MPU6050 (en las tablas de desglose de GY-521) sólo para descubrir que
Cómo programar un acelerómetro de Arduino para controles de movimiento

Cómo programar un acelerómetro de Arduino para controles de movimiento

Control de movimiento es siempre algo que ha tocado techo mi interés. Esto es especialmente tan recientemente cuando me enteré de lo fácil Arduino hace al programa. Una vez instalado correctamente esto puede convertirse fácilmente en una impresionant
Digital termómetro con Arduino y DS18B20

Digital termómetro con Arduino y DS18B20

simplemente crear un digital termómetro con puede saber la temperatura actual en una pantalla LCD. Este es un proyecto de principiantes.Aparato que necesita:1. Arduino UNO R32. sensor de temperatura DS18B20.3. 16 x 2 pantalla de LCD.4. conexión de lo
Interfaz de BMG160 de Sensor giroscopio de 3 ejes con Arduino Nano

Interfaz de BMG160 de Sensor giroscopio de 3 ejes con Arduino Nano

En el mundo de hoy, más de la mitad de los jóvenes y los niños son aficionada a juegos de azar y todos aquellos que gustan de él, fascinado por los aspectos técnicos del juego sabe la importancia de la detección de movimiento en este dominio. Nos sor
Voltímetro con Arduino

Voltímetro con Arduino

Este tutorial muestra cómo hacer un voltímetro utilizando un Arduino, breadboards y resistencias. El voltímetro está programado de manera que la salida se muestra en el equipo. Los usuarios simplemente ponen el extremo negativo de la bateria en el ca
Acelerómetro y giroscopio Tutorial

Acelerómetro y giroscopio Tutorial

IntroducciónEsta guía está dirigida a todos los interesados en el uso de acelerómetros y giróscopos, así como dispositivos de combinación IMU (Unidad de medición inercial) en sus proyectos de electrónicaCubriremos:¿Qué mide un acelerómetro?¿Qué mide
Control de cero con un acelerómetro

Control de cero con un acelerómetro

entorno de programación Scratch el es muy popular entre los niños. Usando Arduino, podemos introducir control acelerómetro por lo que sus juegos pueden reaccionar a la inclinación del acelerómetro.Había cubierto los conceptos básicos en el instructiv