Paso 3: Arduino Mega + acelerómetro (LSM303)
Fijar la 5v y tierra a las ubicaciones apropiadas. Pude también utilizar un pedazo de anti estática espuma debajo del dispositivo con un poco de pegamento caliente para montar el acelerómetro para tablero de proto de GPS.
empecé con la biblioteca de LSM303 de (https://github.com/pololu/lsm303-arduino). Contiene tres ejemplos, uno de los cuales, "Calibrar", que terminó usando muy a menudo. Esto funcionó para mí sin ninguna modificación y me permitió poner a prueba mi cableado. Esto solía para tirar los valores mínimos y máximos para el acelerómetro x, y, x eje, estos valores se utilizan para balancear hacia fuera el dispositivo de cálculo de fuerzas G.
G-fuerzas:
Para calcular las fuerzas G en el LSM303 solo tenemos que equilibrar los valores de acelerómetro y luego escalarlos hacia abajo. No encuentro el sitio donde obtuve primero el código así que pido disculpas de antemano pero espero pronto tener que actualizar.
Primero! Ejecutar el sketch de calibrar desde la biblioteca de LSM303 para obtener su x, y, z max y min los valores. Para ello, mantenga su LSM303 en cada uno de los seis ejes y actualice el esbozo sosteniendo todavía muy. No quieren causar ningún batidos al dispositivo como será deshacerse de sus lecturas, esto me tomó varios intentos para conseguirlo finalmente calibrado correctamente. Cuando haya terminado, sobre una superficie plana debe obtener una lectura como esta
#include < Wire.h >
#include < LSM303.h >
LSM303 compás;
Estos son mis valores, más probable es que no funcionará para usted
ejecutar el sketch de calibrar desde la biblioteca LSM303 para obtener su
valores máximos y mínimos para x, y, z
int xRawMin =-16240;
int xRawMax = 15616;
int yRawMin =-17216;
int yRawMax = 16992;
int zRawMin =-14560;
int zRawMax = 18448;
void setup()
{
Serial.Begin(14400);
Wire.Begin();
Compass.init();
compass.enableDefault();
}
void loop()
{
Compass.Read();
xRaw largo = compass.a.x;
yRaw largo = compass.a.y;
zRaw largo = compass.a.z;
Convertir valores crudos a ' milli-Gs "
xScaled largo = mapa (xRaw, xRawMin, xRawMax, -1000, 1000);
yScaled largo = mapa (yRaw, yRawMin, yRawMax, -1000, 1000);
zScaled largo = mapa (zRaw, zRawMin, zRawMax, -1000, 1000);
volver a escalar a Gs fraccionadas
Float xAccel = xScaled / 1000.0;
Float yAccel = yScaled / 1000.0;
Float zAccel = zScaled / 1000.0;
Serial.Print("::");
Serial.Print(xAccel);
Serial.Print ("G,");
Serial.Print(yAccel);
Serial.Print ("G,");
Serial.Print(zAccel);
Serial.println("G");
Delay(200);
}
La echada y del rodillo: Aquí está la versión modificada del código de Arnie que usé:
Encontré un hilo en los foros de arduino por "ArthurSpooner" para calcular el Pitch y Roll, simplemente modifiqué el código existente para mi LSM303. Agregar en las bibliotecas y el programa de instalación desde el bosquejo de calibrar, entonces sólo quitar el analogread y sustituirla por su compass.a.x.
código por Arne
el acclerometer establecer la forma en que se ve la aceleración z
el cielo y x y es plano--> como la mayoría de sistemas de coordenadas cartesianas
Utilizar un A7270 como un acelerómetro -> en un tablero de arranque de aproximadamente $20 USD
y un HMC5843 como un eje triple Sensor magnético $50 USD
Siéntase libre de comentar el código -> mejora siempre se agradece
Usted puede hacer preguntas en inglés o alemán
necesaria para los cálculos de
#include < math.h >
#include < Wire.h >
#include < LSM303.h >
LSM303 compás;
al aumentar la alphaAccel la respuesta será más rápida
pero el ruido va aumentar [alfa debe estar entre 0 y 1]
valores de paso bajo digital
Float alphaAccel = 0.4;
Float alphaMagnet = 0.4;
unsigned int xOffset = 0; unsigned int yOffset = 0; zOffset unsigned int = 0;
Paso del flotador = 0;
Rollo de flotador = 0;
Desvío del flotador = 0;
xRaw int = 0; int yRaw = 0; int zRaw = 0;
Float xFiltered = 0; Float yFiltered = 0; Float zFiltered = 0;
Float xFilteredOld = 0; Float yFilteredOld = 0; Float zFilteredOld = 0;
Float xAccel = 0; Float yAccel = 0; Float zAccel = 0;
void setup()
{
Serial.Begin(115200); inicializar el puerto serie
analogReference(EXTERNAL); tensión de referencia externa (3, 3V)
Delay(2000); calibrar sensor después de un breve retraso
Wire.Begin();
Compass.init();
compass.enableDefault();
getAccelOffset(); mantenerlo plano y no móvil en la mesa
hay otras maneras de calibrar el offset, cada una tiene algunos advantes
y desventaja...
Comparar la nota de aplicación AN3447
http://www.Freescale.com/files/sensors/doc/app_note/AN3447.pdf
}
void FilterAD()
{
Leer anuncios y restar el offset
xRaw=compass.a.x-xOffset;
yRaw=compass.a.y-yOffset;
zRaw=compass.a.z-zOffset;
Digital Low Pass - comparar: (para acelerometro)
http://en.wikipedia.org/wiki/Low-pass_filter
xFiltered = xFilteredOld + alphaAccel * (xRaw - xFilteredOld);
yFiltered = yFilteredOld + alphaAccel * (yRaw - yFilteredOld);
zFiltered = zFilteredOld + alphaAccel * (zRaw - zFilteredOld);
xFilteredOld = xFiltered;
yFilteredOld = yFiltered;
zFilteredOld = zFiltered;
}
void AD2Degree()
{
3.3 = Vref; 1023 = 10 bits AD; 0.8 = sensibilidad al acelerómetro
(compare la ficha técnica de su acelerómetro)
la * aceleración debe estar entre -1 y 1; que tenga a
para añadir/restar + 1 dependiendo de la orientación del acelerómetro
(como yo en el zAccel)
no son necesarios, pero son útiles para la depuración
xAccel = xFiltered * 3.3 / (1023.0 * 0.8);
yAccel = yFiltered * 3.3 / (1023.0 * 0.8);
zAccel = zFiltered * 3.3 / (1023.0 * 0.8) + 1.0;
Calcular Pitch y Roll (compárese nota de aplicación AN3461 de Freescale
http://www.Freescale.com/files/sensors/doc/app_note/AN3461.pdf
Microsoft Excel cambia los valores de atan2
-> esta información puede hacer su vida más fácil :-D
ángulos son el radián, grado (* 180/3.14159)
Rodillo = atan2 (yAccel, sqrt(sq(xAccel)+sq(zAccel)));
Pitch = atan2 (xAccel, sqrt(sq(yAccel)+sq(zAccel)));
}
void loop()
{
Compass.Read();
FilterAD();
AD2Degree();
Serial.Print ("Pitch:");
Serial.Print(int(pitch*180/PI));
Serial.Print ("Roll:");
Serial.println(int(roll*180/PI));
Delay(50);
}
void getAccelOffset()
{//you puede hacer aproximadamente 60 iteraciones porque usamos un int sin signo
de lo contrario obtendrá un desbordamiento. Pero 60 iteraciones deben estar bien
Compass.Read();
para (int i = 1; i < = 60; i ++) {}
xOffset += compass.a.x;
yOffset += compass.a.y;
zOffset += compass.a.z;
}
xOffset = 60;
yOffset = 60;
zOffset = 60;
Serial.Print ("xOffset:"); Serial.Print(xoffset);
Serial.Print ("yOffset:"); Serial.Print(YOFFSET);
Serial.Print ("zOffset:"); Serial.println(zOffset);
}
El código de ArthurSpooner también contiene la brújula hacia el, sin embargo logré encontrar este código en adafruit y decidió utilizar en lugar de ellos, he probado usando compass.heading() pero no obtengo resultados exactos:
Compass.Read();
mx int = compass.m.x;
int mi = compass.m.y;
Float Pi = 3.14159;
partida de flotador = (atan2(my,mx) * 180) / Pi;
Normalizar a la 0-360
Si (encabezado < 0)
{
rumbo = 360 + partida;
}
Serial.println(Heading);