Pular para o conteúdo principal

Grove - IMU 9DOF(lcm20600+AK09918)

pir

O Grove - IMU 9DOF (lcm20600+AK09918) é uma unidade de medição inercial de 9 graus de liberdade IMU (Inertial measurement unit) que combina giroscópio, acelerômetro e bússola eletrônica. Usamos dois chips LCM20600+AK09918 para implementar essas 3 funções.

O LCM20600 é um dispositivo MotionTracking de 6 eixos que combina um giroscópio de 3 eixos e um acelerômetro de 3 eixos. O Giroscópio é um dispositivo usado para medir ou manter a orientação e a velocidade angular; normalmente, usamos para medir rotação e torção. O Acelerômetro é um dispositivo que mede a aceleração própria.

O AK09918 é um CI de bússola eletrônica de 3 eixos com tecnologia de sensor Hall de alta sensibilidade. Usamos uma bússola eletrônica para medir a força magnética, o que pode nos fornecer informações de direção.

Como o nome sugere, basta usar este único pequeno módulo e você pode medir 9 graus de liberdade: rotação angular nos eixos x/y/z, aceleração nos eixos x/y/z e força magnética nos eixos x/y/z.

Que módulo incrível! Use este módulo para construir seu próprio sistema de movimento e orientação😄

pir

Recursos

  • Giroscópio de 3 eixos com FSR programável de ±250 dps, ±500 dps, ±1000 dps e ±2000 dps
  • Acelerômetro de 3 eixos com FSR programável de ±2g, ±4g, ±8g e ±16g
  • Bússola eletrônica de 3 eixos com sensibilidade de 0,15 μT/LSB (típ.)
  • Interrupções programáveis pelo usuário
  • Resolução de ADC de 16 bits e filtros programáveis para medições de aceleração
  • Resolução de ADC de 16 bits para medições magnéticas
  • Buffer FIFO de 1 KB permite que o processador de aplicações leia os dados em rajadas (LCM20600)
  • Sensor de temperatura incorporado
  • Função de monitor de saturação do sensor magnético
  • Oscilador integrado para fonte de clock interna

Especificação

ItemValor
Tensão de operação3.3V / 5V
Temperatura de operação-30°C a +85°C
Faixa de escala completa do giroscópio±250 dps, ±500 dps, ±1000 dps, ±2000 dps
Fator de escala de sensibilidade do giroscópio131 LSB/(dps)@±250 dps 65.5 LSB/(dps)@±500 dps 32.8 LSB/(dps)@±1000 dps 16.4 LSB/(dps)@±2000 dps
Faixa de escala completa do acelerômetro±2g, ±4g, ±8g, ±16g
Fator de escala de sensibilidade do acelerômetro16384 LSB/g@±2g / 8192 LSB/g@±4g / 4096 LSB/g@±8g / 2048 LSB/g@±16g
Faixa de medição do sensor magnético±4912μT (típico)
Sensibilidade do sensor magnético0.15μT (típico)
InterfaceI^2^C
Endereço I^2^CLCM20600 / 0x69(padrão) / 0x68(opcional) / AK09918 / 0x0C

Aplicações

  • Smartphones e tablets
  • Sensores vestíveis

Visão geral do hardware

Pinagem

pir

pir

perigo

O endereço I2C padrão do LCM20600 é 0x69, você pode alterá-lo para 0x68. O pad central está conectado ao fio de endereço; você pode alterar o endereço I2C cortando o fio e refazendo a solda. Para a sua segurança e a dos outros, tenha cuidado com a faca ou com o ferro de solda que você possa usar.

Esquemático

Alimentação

pir

Como a faixa de tensão de operação do LCM20600 é de 1,71V a 3,45V, e a faixa de tensão de operação do AK09918 é de 1,65V a 1,95V, usamos um chip de conversão de energia XC6206P182MR para fornecer 1,8V estáveis para ambos os chips.

Circuito de conversor de nível bidirecional

pir

Este é um circuito típico de conversor de nível bidirecional para conectar duas seções de tensão diferente de um barramento I^2^C. O barramento I2C dos dois chips usa 1,8V; se o barramento I2C do Arduino usar 5V ou 3,3V, este circuito será necessário. No esquemático acima, Q1 e Q2 são MOSFETs de canal N CJ2102, que atuam como uma chave bidirecional. Para entender melhor esta parte, você pode consultar o AN10441

Plataformas compatíveis

ArduinoRaspberry Pi

pir

pir

cuidado

As plataformas mencionadas acima como suportadas são uma indicação da compatibilidade de software ou teórica do módulo. Na maioria dos casos, fornecemos apenas bibliotecas de software ou exemplos de código para a plataforma Arduino. Não é possível fornecer bibliotecas de software / código de demonstração para todas as possíveis plataformas de MCU. Portanto, os usuários precisam escrever suas próprias bibliotecas de software.

Primeiros Passos

Brincar com Arduino

Hardware

Materiais necessários

Seeeduino V4.2Base ShieldGrove - IMU 9DOF

pir

pir

pir

Adquira AgoraAdquira AgoraAdquira Agora
nota

1 Conecte o cabo USB cuidadosamente, caso contrário você pode danificar a porta. Use o cabo USB com 4 fios internos; o cabo de 2 fios não consegue transferir dados. Se você não tiver certeza sobre o cabo que possui, pode clicar aqui para comprar

2 Cada módulo Grove vem com um cabo Grove quando você compra. Caso você perca o cabo Grove, pode clicar aqui para comprar.

  • Passo 1. Conecte o Grove - IMU 9DOF (lcm20600+AK09918) à porta I^2^C do Grove-Base Shield.

  • Passo 2. Conecte o Grove - Base Shield ao Seeeduino.

  • Passo 3. Conecte o Seeeduino ao PC via cabo USB.

pir

nota

Se não tivermos o Grove Base Shield, também podemos conectar este módulo diretamente ao Seeeduino como abaixo.

SeeeduinoGrove - IMU 9DOF
5VVermelho
GNDPreto
SDABranco
SCLAmarelo

Software

nota

Se esta é a primeira vez que você trabalha com Arduino, recomendamos fortemente que veja Getting Started with Arduino antes de começar.

  • Passo 1. Baixe a biblioteca Grove - IMU 9DOF (lcm20600+AK09918) do Github.

  • Passo 2. Consulte How to install library para instalar a biblioteca para Arduino.

  • Passo 3. Reinicie a IDE do Arduino. Abra o exemplo, você pode abri-lo das seguintes três maneiras:

    1. Abra-o diretamente na IDE do Arduino pelo caminho: File --> Examples --> Grove IMU 9DOF ICM20600 AK09918 --> compass.

    pir

    1. Abra-o no seu computador clicando em compass.ino, que você pode encontrar na pasta XXXX\Arduino\libraries\Seeed_ICM20600_AK09918-master\examples\compass, onde XXXX é o local em que você instalou a IDE do Arduino.

    pir

    1. Ou você pode simplesmente clicar no ícone

    pir

    no canto superior direito do bloco de código para copiar o seguinte código para um novo sketch na IDE do 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;
}
nota

Existem 3 demos na biblioteca:
test_6axis

Este exemplo mostra como obter dados de giroscópio e aceleração do ICM20600.

test_magnet

Este exemplo mostra como obter dados magnéticos do AK09918.

compass

Este exemplo obtém dados magnéticos e de aceleração, para calcular pitch e roll, e criar uma aplicação de bússola.

  • Passo 4. Faça o upload do demo. Se você não souber como fazer o upload do código, verifique How to upload code.

  • Passo 5. Abra o Serial Monitor da IDE do Arduino clicando em Tool-> Serial Monitor. Ou pressione as teclas ++ctrl+shift+m++ ao mesmo tempo. Defina a taxa de baud para 9600.

success

Se tudo correr bem, quando você abrir o Serial Monitor, o aviso aparecerá -- Start figure-8 calibration after 2 seconds. O que significa que, para calibrar este módulo, você deve movê-lo e desenhar a trajetória do número 8 no ar. Quando "......." aparecer, você pode iniciar a calibração.

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
--------------------------------

nota

Como você pode ver, o resultado do exemplo da bússola inclui três parâmetros: roll, pitch e Heading. Estes são a terminologia de Euler angles (clique para verificar mais informações).

Fuction table

FunctionDescription
ICM20600
initialize()Inicializa o chip LCM20600, por padrão: a faixa de medição do giroscópio é ±2000 dps / a faixa de medição do acelerômetro é ±16g
setGyroScaleRange(gyro_scale_type_t range)Após a inicialização, você pode definir a faixa do giroscópio para atender às suas próprias necessidades, a lista de parâmetros gyro_scale_type_t range: RANGE_250_DPS / RANGE_500_DPS / RANGE_1K_DPS / RANGE_2K_DPS / por exemplo / icm20600.setGyroScaleRange(RANGE_1K_DPS); / esta linha de código irá alterar a faixa de medição do giroscópio para ±1000dps
setAccScaleRange(acc_scale_type_t range)Após a inicialização, você pode definir a faixa do acelerômetro para atender às suas próprias necessidades, a lista de parâmetros acc_scale_type_t range: RANGE_2G / RANGE_4G / RANGE_8G / RANGE_16G / por exemplo / icm20600.setAccScaleRange(RANGE_8G); / esta linha de código irá alterar a faixa de medição do acelerômetro para ±8g
getGyroscope(int16_tx, int16_t y, int16_t* z))Você pode usar esta função para obter os dados X/Y/Z de 3 eixos do giroscópio ao mesmo tempo, e a unidade dos dados é dps
getGyroscopeX(void) getGyroscopeY(void) getGyroscopeZ(void)Ou você pode obter os dados X/Y/Z de 3 eixos do giroscópio separadamente usando essas três funções, e a unidade dos dados é dps
getRawGyroscopeX(void) getRawGyroscopeX(void) getRawGyroscopeX(void)Essas três funções obtêm os dados brutos diretamente do registrador do ICM20600 sem converter a unidade de dados para dps
getAcceleration(int16_tx, int16_t y, int16_t* z)Você pode usar esta função para obter a aceleração X/Y/Z de 3 eixos ao mesmo tempo, e a unidade dos dados é mg
getAccelerationX(void) getAccelerationY(void) getAccelerationZ(void)Ou você pode obter a aceleração X/Y/Z de 3 eixos separadamente usando essas três funções, e a unidade dos dados é mg
getRawAccelerationX(void) getRawAccelerationY(void) getRawAccelerationZ(void)Essas três funções obtêm os dados brutos diretamente do registrador do ICM20600 sem converter a unidade de dados para mg
getTemperature(void)Você pode usar esta função para obter a temperatura
AK09918
getData(int32_t axis_x, int32_taxis_y, int32_t *axis_z)Você pode usar esta função para obter a força magnética dos 3 eixos.

Visualizador Online de Esquemático

Recursos

Projeto

Este é o vídeo de introdução deste produto, com demonstrações simples, que você pode experimentar.

Suporte Técnico e Discussão sobre o Produto

Obrigado por escolher nossos produtos! Estamos aqui para lhe oferecer diferentes formas de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...