Grove - IMU 9DOF(lcm20600+AK09918)
El Grove - IMU 9DOF (lcm20600+AK09918) es una IMU (unidad de medición inercial) de 9 Grados de Libertad que combina giroscopio, acelerómetro y brújula electrónica. Utilizamos dos chips LCM20600+AK09918 para implementar esas 3 funciones.
El LCM20600 es un dispositivo de seguimiento de movimiento de 6 ejes que combina un giroscopio de 3 ejes y un acelerómetro de 3 ejes. El giroscopio es un dispositivo utilizado para medir o mantener la orientación y velocidad angular, normalmente lo usamos para medir giro y torsión. El acelerómetro es un dispositivo que mide la aceleración propia.
El AK09918 es un IC de brújula electrónica de 3 ejes con tecnología de sensor Hall de alta sensibilidad. Utilizamos una brújula electrónica para medir la fuerza magnética, que puede proporcionarnos información de dirección.
Como su nombre sugiere, solo usa este pequeño módulo individual y puedes medir 9 Grados de Libertad: rotación angular en los ejes x/y/z, aceleración en los ejes x/y/z, y fuerza magnética en los ejes x/y/z.
¡Qué módulo tan increíble! Solo usa este módulo para construir tu propio sistema de movimiento y orientación😄
Características
- Giroscopio de 3 ejes con FSR programable de ±250 dps, ±500 dps, ±1000 dps, y ±2000 dps
- Acelerómetro de 3 ejes con FSR programable de ±2g, ±4g, ±8g, y ±16g
- Brújula electrónica de 3 ejes con sensibilidad de 0.15 μT/LSB (típica)
- Interrupciones programables por el usuario
- Resolución ADC de 16 bits y filtros programables para mediciones de aceleración
- Resolución ADC de 16 bits para mediciones magnéticas
- Buffer FIFO de 1 KB permite al procesador de aplicaciones leer los datos en ráfagas (LCM20600)
- Sensor de temperatura integrado
- Función de monitoreo de desbordamiento del sensor magnético
- Oscilador integrado para fuente de reloj interno
Especificaciones
Elemento | Valor |
---|---|
Voltaje de operación | 3.3V / 5V |
Temperatura de operación | -30°C a +85°C |
Rango de escala completa del giroscopio | ±250 dps, ±500 dps, ±1000 dps, ±2000 dps |
Factor de escala de sensibilidad del giroscopio | 131 LSB/(dps)@±250 dps 65.5 LSB/(dps)@±500 dps 32.8 LSB/(dps)@±1000 dps 16.4 LSB/(dps)@±2000 dps |
Rango de escala completa del acelerómetro | ±2g, ±4g, ±8g, ±16g |
Factor de escala de sensibilidad del acelerómetro | 16384 LSB/g@±2g / 8192 LSB/g@±4g / 4096 LSB/g@±8g / 2048 LSB/g@±16g |
Rango de medición del sensor magnético | ±4912μT (típico) |
Sensibilidad del sensor magnético | 0.15μT (típico) |
Interfaz | I^2^C |
Dirección I^2^C | LCM20600 / 0x69(predeterminada) / 0x68(opcional) / AK09918 / 0x0C |
Aplicaciones
- Teléfonos inteligentes y tabletas
- Sensores portátiles
Descripción general del hardware
Distribución de pines
La dirección I2C predeterminada del LCM20600 es 0x69, puedes cambiarla a 0x68. La almohadilla central está conectada al cable de dirección, puedes cambiar la dirección I2C cortando el cable y volviéndolo a soldar. Por la seguridad tuya y de otros, ten cuidado con el cuchillo o pistola de soldar que puedas usar.
Esquemático
Alimentación
Dado que el rango de voltaje de operación del LCM20600 es de 1.71V a 3.45V, y el rango de voltaje de operación del AK09918 es de 1.65V a 1.95V, utilizamos un chip de conversión de energía XC6206P182MR para proporcionar un 1.8V estable para ambos chips.
Circuito de desplazador de nivel bidireccional
Este es un circuito típico de desplazador de nivel bidireccional para conectar dos secciones de voltaje diferentes de un bus I^2^C. El bus I2C de los dos chips usa 1.8V, si el bus I2C del Arduino usa 5V o 3.3V, este circuito será necesario. En el esquemático anterior, Q1 y Q2 son MOSFET de canal N CJ2102, que actúan como un interruptor bidireccional. Para entender mejor esta parte, puedes consultar el AN10441
Plataformas compatibles
Arduino | Raspberry Pi |
---|---|
Las plataformas mencionadas anteriormente como compatibles son una indicación de la compatibilidad de software o teórica del módulo. Solo proporcionamos biblioteca de software o ejemplos de código para la plataforma Arduino en la mayoría de los casos. No es posible proporcionar biblioteca de software / código de demostración para todas las plataformas MCU posibles. Por lo tanto, los usuarios tienen que escribir su propia biblioteca de software.
Primeros Pasos
Jugar Con Arduino
Hardware
Materiales requeridos
Seeeduino V4.2 | Base Shield | Grove - IMU 9DOF |
---|---|---|
Obtener Uno Ahora | Obtener Uno Ahora | Obtener Uno Ahora |
1 Por favor conecta el cable USB con cuidado, de lo contrario podrías dañar el puerto. Por favor usa el cable USB con 4 cables en el interior, el cable de 2 cables no puede transferir datos. Si no estás seguro sobre el cable que tienes, puedes hacer clic aquí para comprar
2 Cada módulo Grove viene con un cable Grove cuando lo compras. En caso de que pierdas el cable Grove, puedes hacer clic aquí para comprar.
-
Paso 1. Conecta el Grove - IMU 9DOF (lcm20600+AK09918) al puerto I^2^C del Grove-Base Shield.
-
Paso 2. Conecta el Grove - Base Shield al Seeeduino.
-
Paso 3. Conecta el Seeeduino a la PC mediante un cable USB.
Si no tenemos Grove Base Shield, también podemos conectar directamente este módulo al Seeeduino como se muestra a continuación.
Seeeduino | Grove - IMU 9DOF |
---|---|
5V | Rojo |
GND | Negro |
SDA | Blanco |
SCL | Amarillo |
Software
Si esta es la primera vez que trabajas with Arduino, te recomendamos encarecidamente que veas Getting Started with Arduino antes de comenzar.
-
Paso 1. Descarga la librería Grove - IMU 9DOF (lcm20600+AK09918) desde Github.
-
Paso 2. Consulta How to install library para instalar la librería para Arduino.
-
Paso 3. Reinicia el IDE de Arduino. Abre el ejemplo, puedes abrirlo de las siguientes tres maneras:
- Ábrelo directamente en el IDE de Arduino a través de la ruta: File --> Examples --> Grove IMU 9DOF ICM20600 AK09918 --> compass.
- Ábrelo en tu computadora haciendo clic en compass.ino que puedes encontrar en la carpeta XXXX\Arduino\libraries\Seeed_ICM20600_AK09918-master\examples\compass, XXXX es la ubicación donde instalaste el IDE de Arduino.
- O, simplemente puedes hacer clic en el icono
en la esquina superior derecha del bloque de código para copiar el siguiente código en un nuevo sketch en el IDE de Arduino.
#include "AK09918.h"
#include "ICM20600.h"
#include <Wire.h>
AK09918_err_type_t err;
int32_t x, y, z;
AK09918 ak09918;
ICM20600 icm20600(true);
int16_t acc_x, acc_y, acc_z;
int32_t offset_x, offset_y, offset_z;
double roll, pitch;
// Find the magnetic declination at your location
// http://www.magnetic-declination.com/
double declination_shenzhen = -2.2;
void setup()
{
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
err = ak09918.initialize();
icm20600.initialize();
ak09918.switchMode(AK09918_POWER_DOWN);
ak09918.switchMode(AK09918_CONTINUOUS_100HZ);
Serial.begin(9600);
err = ak09918.isDataReady();
while (err != AK09918_ERR_OK)
{
Serial.println("Waiting Sensor");
delay(100);
err = ak09918.isDataReady();
}
Serial.println("Start figure-8 calibration after 2 seconds.");
delay(2000);
calibrate(10000, &offset_x, &offset_y, &offset_z);
Serial.println("");
}
void loop()
{
// get acceleration
acc_x = icm20600.getAccelerationX();
acc_y = icm20600.getAccelerationY();
acc_z = icm20600.getAccelerationZ();
Serial.print("A: ");
Serial.print(acc_x);
Serial.print(", ");
Serial.print(acc_y);
Serial.print(", ");
Serial.print(acc_z);
Serial.println(" mg");
Serial.print("G: ");
Serial.print(icm20600.getGyroscopeX());
Serial.print(", ");
Serial.print(icm20600.getGyroscopeY());
Serial.print(", ");
Serial.print(icm20600.getGyroscopeZ());
Serial.println(" dps");
ak09918.getData(&x, &y, &z);
x = x - offset_x;
y = y - offset_y;
z = z - offset_z;
Serial.print("M: ");
Serial.print(x);
Serial.print(", ");
Serial.print(y);
Serial.print(", ");
Serial.print(z);
Serial.println(" uT");
// roll/pitch in radian
roll = atan2((float)acc_y, (float)acc_z);
pitch = atan2(-(float)acc_x, sqrt((float)acc_y*acc_y+(float)acc_z*acc_z));
Serial.print("Roll: ");
Serial.println(roll*57.3);
Serial.print("Pitch: ");
Serial.println(pitch*57.3);
double Xheading = x * cos(pitch) + y * sin(roll) * sin(pitch) + z * cos(roll) * sin(pitch);
double Yheading = y * cos(roll) - z * sin(pitch);
double heading = 180 + 57.3*atan2(Yheading, Xheading) + declination_shenzhen;
Serial.print("Heading: ");
Serial.println(heading);
Serial.println("--------------------------------");
delay(500);
}
void calibrate(uint32_t timeout, int32_t *offsetx, int32_t *offsety, int32_t*offsetz)
{
int32_t value_x_min = 0;
int32_t value_x_max = 0;
int32_t value_y_min = 0;
int32_t value_y_max = 0;
int32_t value_z_min = 0;
int32_t value_z_max = 0;
uint32_t timeStart = 0;
ak09918.getData(&x, &y, &z);
value_x_min = x;
value_x_max = x;
value_y_min = y;
value_y_max = y;
value_z_min = z;
value_z_max = z;
delay(100);
timeStart = millis();
while((millis() - timeStart) < timeout)
{
ak09918.getData(&x, &y, &z);
/* Update x-Axis max/min value */
if(value_x_min > x)
{
value_x_min = x;
// Serial.print("Update value_x_min: ");
// Serial.println(value_x_min);
}
else if(value_x_max < x)
{
value_x_max = x;
// Serial.print("update value_x_max: ");
// Serial.println(value_x_max);
}
/* Update y-Axis max/min value */
if(value_y_min > y)
{
value_y_min = y;
// Serial.print("Update value_y_min: ");
// Serial.println(value_y_min);
}
else if(value_y_max < y)
{
value_y_max = y;
// Serial.print("update value_y_max: ");
// Serial.println(value_y_max);
}
/* Update z-Axis max/min value */
if(value_z_min > z)
{
value_z_min = z;
// Serial.print("Update value_z_min: ");
// Serial.println(value_z_min);
}
else if(value_z_max < z)
{
value_z_max = z;
// Serial.print("update value_z_max: ");
// Serial.println(value_z_max);
}
Serial.print(".");
delay(100);
}
*offsetx = value_x_min + (value_x_max - value_x_min)/2;
*offsety = value_y_min + (value_y_max - value_y_min)/2;
*offsetz = value_z_min + (value_z_max - value_z_min)/2;
}
Hay 3 demos en la biblioteca:
test_6axis
Este ejemplo muestra cómo obtener datos del giroscopio y aceleración del ICM20600.
test_magnet
Este ejemplo muestra cómo obtener datos magnéticos del AK09918.
compass
Este ejemplo obtiene datos magnéticos y de aceleración, para calcular pitch y roll, y crear una aplicación de brújula.
-
Paso 4. Sube la demo. Si no sabes cómo subir el código, por favor revisa Cómo subir código.
-
Paso 5. Abre el Monitor Serie del IDE de Arduino haciendo clic en Tool-> Serial Monitor. O presiona las teclas ++ctrl+shift+m++ al mismo tiempo. Establece la velocidad de baudios a 9600.
Si todo va bien, cuando abras el Monitor Serie, aparecerá el aviso--Start figure-8 calibration after 2 seconds. Lo que significa que para calibrar este módulo, debes moverlo y dibujar la trayectoria del número 8 en el aire. Cuando aparezcan los ".......", puedes comenzar tu calibración.
Start figure-8 calibration after 2 seconds.
.......................................................................
A: -362, -205, 738 mg
G: -45, 12, -1 dps
M: -6, -23, -33 uT
Roll: -15.53
Pitch: 25.30
Heading: 23.99
--------------------------------
A: -269, 583, 61 mg
G: 102, 377, -2 dps
M: 18, -21, -18 uT
Roll: 84.03
Pitch: 24.65
Heading: 215.58
--------------------------------
A: -495, 229, 37 mg
G: -43, -231, 201 dps
M: 7, -30, 6 uT
Roll: 80.83
Pitch: 64.90
Heading: 21.76
--------------------------------
Como puedes ver, el resultado del ejemplo de brújula incluye tres parámetros: roll, pitch y Heading. Estos son la terminología de ángulos de Euler(haz clic para verificar más información).
Tabla de funciones
Función | Descripción |
---|---|
ICM20600 | |
initialize() | Inicializa el chip LCM20600, por defecto: el rango de medición del giroscopio es ±2000 dps / el rango de medición del acelerómetro es ±16g |
setGyroScaleRange(gyro_scale_type_t range) | Después de la inicialización, puedes establecer el rango del giroscopio para satisfacer tus propias necesidades, la lista de parámetros gyro_scale_type_t range: RANGE_250_DPS / RANGE_500_DPS / RANGE_1K_DPS / RANGE_2K_DPS / ej. / icm20600.setGyroScaleRange(RANGE_1K_DPS); / esta línea de código cambiará el rango de medición del giroscopio a ±1000dps |
setAccScaleRange(acc_scale_type_t range) | Después de la inicialización, puedes establecer el rango del acelerómetro para satisfacer tus propias necesidades, la lista de parámetros acc_scale_type_t range: RANGE_2G / RANGE_4G / RANGE_8G / RANGE_16G / ej. / icm20600.setAccScaleRange(RANGE_8G); / esta línea de código cambiará el rango de medición del acelerómetro a ±8g |
getGyroscope(int16_tx, int16_t y, int16_t* z)) | Puedes usar esta función para obtener los datos de los 3 ejes X/Y/Z del giroscopio al mismo tiempo, y la unidad de los datos es dps |
getGyroscopeX(void) getGyroscopeY(void) getGyroscopeZ(void) | O, puedes obtener los datos de los 3 ejes X/Y/Z del giroscopio por separado usando esas tres funciones, y la unidad de los datos es dps |
getRawGyroscopeX(void) getRawGyroscopeX(void) getRawGyroscopeX(void) | Esas tres funciones obtienen los datos en bruto directamente del registro del ICM20600 sin convertir la unidad de datos a dps |
getAcceleration(int16_tx, int16_t y, int16_t* z) | Puedes usar esta función para obtener la aceleración de los 3 ejes X/Y/Z al mismo tiempo, y la unidad de los datos es mg |
getAccelerationX(void) getAccelerationY(void) getAccelerationZ(void) | O, puedes obtener la aceleración de los 3 ejes X/Y/Z por separado usando esas tres funciones, y la unidad de los datos es mg |
getRawAccelerationX(void) getRawAccelerationY(void) getRawAccelerationZ(void) | Esas tres funciones obtienen los datos en bruto directamente del registro del ICM20600 sin convertir la unidad de datos a mg |
getTemperature(void) | Puedes usar esta función para obtener la temperatura |
AK09918 | |
getData(int32_t axis_x, int32_taxis_y, int32_t *axis_z) | Puedes usar esta función para obtener la fuerza magnética de los 3 ejes. |
Visor de Esquemas en Línea
Recursos
-
[PDF] Hoja de datos del CJ2102
Proyecto
Este es el video de introducción de este producto, demostraciones simples, puedes intentarlo.
Soporte Técnico y Discusión del Producto
¡Gracias por elegir nuestros productos! Estamos aquí para brindarle diferentes tipos de soporte para asegurar que su experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para atender diferentes preferencias y necesidades.