Biblioteca Arduino para comunicação com as unidades de medição inercial (IMU) de seis eixos ICM42688.
O InvenSense ICM42688 suporta comunicação I2C, até 400 kHz, e SPI, até 1 MHz para configuração de registro e 24 MHz para leitura de dados. As seguintes faixas selecionáveis de sensores de escala completa estão disponíveis:
Faixa de escala completa do giroscópio | Faixa de escala completa do acelerômetro |
---|---|
+/- 15,6 (graus/s) | - |
+/- 31,2 (graus/s) | - |
+/- 62,5 (graus/s) | - |
+/- 125 (graus/s) | - |
+/- 250 (graus/s) | +/- 2 (g) |
+/- 500 (graus/s) | +/- 4 (g) |
+/- 1000 (graus/s) | +/- 8 (g) |
+/- 2.000 (graus/s) | +/- 16 (g) |
O ICM42688 faz amostras de giroscópios e acelerômetros com conversores analógicos para digitais de 16 bits. Ele também possui filtros digitais programáveis, um relógio de precisão, um sensor de temperatura integrado, interrupções programáveis (incluindo wake on motion) e um buffer FIFO de 512 bytes.
Esta biblioteca oferece suporte à comunicação I2C e SPI com o ICM42688.
Simplesmente clone ou baixe esta biblioteca em sua pasta Arduino/libraries.
Esta biblioteca oferece suporte à comunicação I2C e SPI com o ICM42688. A declaração do objeto ICM42688 está sobrecarregada com diferentes declarações para comunicação I2C e SPI. Todas as outras funções permanecem as mesmas. Além disso, uma classe derivada, ICM42688FIFO , está incluída, que fornece configuração FIFO e funcionalidade de coleta de dados, além de todas as funcionalidades incluídas na classe base ICM42688 .
ICM42688 (TwoWire &bus, endereço uint8_t) Um objeto ICM42688 deve ser declarado, especificando o barramento I2C e o endereço ICM42688 I2C. O endereço ICM42688 I2C será 0x68 se o pino AD0 estiver aterrado ou 0x69 se o pino AD0 estiver puxado para cima. Por exemplo, o código a seguir declara um objeto ICM42688 chamado IMU com um sensor ICM42688 localizado no barramento I2C 0 com um endereço de sensor 0x68 (AD0 aterrado).
ICM42688 IMU (Wire, 0x68 );
ICM42688 (TwoWire &bus, endereço uint8_t) Um objeto ICM42688 deve ser declarado, especificando o barramento I2C e o endereço ICM42688 I2C. O endereço ICM42688 I2C será 0x68 se o pino AD0 estiver aterrado ou 0x69 se o pino AD0 estiver puxado para cima. Por exemplo, o código a seguir declara um objeto ICM42688 chamado IMU com um sensor ICM42688 localizado no barramento I2C 0 com um endereço de sensor 0x68 (AD0 aterrado). Você deve especificar os pinos SDA e SCL para sua conexão I2C (o padrão para Arduino é SDA=18, SCL=19, ESP32 é SDA=21, SCL=22)
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Um objeto ICM42688 deve ser declarado, especificando o barramento SPI e o pino de seleção de chip usado. Vários objetos ICM42688 ou outros SPI podem ser usados no mesmo barramento SPI, cada um com seu próprio pino de seleção de chip. O pino de seleção do chip pode ser qualquer pino digital disponível. Por exemplo, o código a seguir declara um objeto ICM42688 chamado IMU com um sensor ICM42688 localizado no barramento SPI 0 com pino de seleção de chip 10.
ICM42688 IMU (SPI, 10 );
Observe que o clock padrão do barramento SPI de alta velocidade está definido para 8 MHz, mas o ICM 42688-p suporta clock SPI de até 24 MHz. Use um relógio mais rápido para transferências de dados SPI mais rápidas ao ler dados.
As funções a seguir são usadas para configurar o sensor ICM42688. Eles devem ser chamados uma vez antes da coleta de dados, normalmente isso é feito na função setup()
do Arduino. A função begin()
sempre deve ser usada. Opcionalmente, as funções setAccelFS
e setGyroFS
, setAccelODR
e setGyroODR
podem ser usadas para definir as faixas de escala completa do acelerômetro e do giroscópio e a taxa de dados de saída para valores diferentes do padrão. O enableDataReadyInterrupt
e disableDataReadyInterrupt
controlam se o ICM42688 gera uma interrupção nos dados prontos. O enableFifo
configura e habilita o buffer FIFO. Essas funções são descritas em detalhes abaixo.
int start() Isso deve ser chamado em sua função de configuração. Ele inicializa a comunicação com o ICM42688, configura o sensor para leitura de dados e estima a polarização do giroscópio, que é removida dos dados do sensor. Esta função retorna um valor positivo em uma inicialização bem-sucedida e um valor negativo em uma inicialização malsucedida. Se não tiver êxito, verifique a fiação ou tente redefinir a alimentação do sensor. A seguir está um exemplo de configuração do ICM42688.
int status = IMU.begin();
(opcional) int setAccelRange(AccelRange range) Esta função define a faixa de escala completa do acelerômetro para o valor fornecido. Por padrão, se esta função não for chamada, um intervalo de escala completa de +/- 16 g será usado. As faixas de escala completa do acelerômetro enumeradas são:
Nome do Acelerômetro | Faixa de escala completa do acelerômetro |
---|---|
gpm2 | +/- 2 (g) |
gpm4 | +/- 4 (g) |
gpm8 | +/- 8 (g) |
gpm16 | +/- 16 (g) |
Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. Consulte o exemplo Advanced_I2C . A seguir está um exemplo de seleção de uma escala completa do acelerômetro de +/- 8g.
status = IMU.setAccelFS(ICM42688::gpm2);
(opcional) int setGyroRange(GyroRange range) Esta função define a faixa de escala completa do giroscópio para o valor fornecido. Por padrão, se esta função não for chamada, um intervalo de escala completa de +/- 2.000 graus/s será usado. As faixas de escala completa do giroscópio enumeradas são:
Nome do giroscópio | Faixa de escala completa do giroscópio |
---|---|
dps15_625 | +/- 15,625 (graus/s) |
dps31_25 | +/- 31,25 (graus/s) |
dps62_5 | +/- 62,5 (graus/s) |
dps125 | +/- 125 (graus/s) |
dps250 | +/- 250 (graus/s) |
dps500 | +/- 500 (graus/s) |
dps1000 | +/- 1000 (graus/s) |
dps2000 | +/- 2.000 (graus/s) |
Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. Consulte o exemplo Advanced_I2C . A seguir está um exemplo de seleção de uma faixa de escala completa do giroscópio de +/- 250 graus/s.
status = IMU.setGyroFS(ICM42688::dps250);
(opcional) int setFilters(bool gyroFilters, bool accFilters) Esta é uma função opcional para definir os filtros programáveis (filtro Notch, filtro anti-alias, bloco de filtro UI). Por padrão, todos os filtros estão ativados. A figura a seguir mostra um diagrama de blocos do caminho do sinal para ICM42688:
Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. A seguir está um exemplo de como ativar os filtros.
status = IMU.setFilters( true , true );
(opcional) int enableDataReadyInterrupt() Uma interrupção está vinculada à taxa de saída de dados. O pino ICM42688 INT emitirá um pulso de 50us quando os dados estiverem prontos. Isso é extremamente útil para usar interrupções na coleta de dados de relógio que devem ocorrer em intervalos regulares. Consulte o exemplo Interrupt_SPI . Esta função habilita esta interrupção, que ocorrerá em uma frequência determinada pelo SRD. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. A seguir está um exemplo de ativação da interrupção de dados prontos.
status = IMU.enableDataReadyInterrupt();
(opcional) int disableDataReadyInterrupt() Esta função desabilita a interrupção de dados prontos, descrita acima. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. A seguir está um exemplo de desabilitação da interrupção de dados prontos.
status = IMU.disableDataReadyInterrupt();
(opcional) uin8_t isInterrupted() Esta função lê o registro de interrupção pronto para dados. Esta função retorna verdadeiro quando é interrompida. A seguir está um exemplo de leitura do registro de interrupção de dados prontos.
status = IMU.isInterrupted();
(opcional) int calibrateGyro() A polarização do giroscópio é estimada automaticamente durante a função start() e removida das medições do sensor. Esta função irá reestimar a polarização do giroscópio e remover a nova polarização de futuras medições do sensor. O sensor deve estar estacionário durante este processo. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. A seguir está um exemplo de estimativa de novas tendências do giroscópio.
status = IMU.calibrateGyro();
(opcional) float getGyroBiasX() Esta função retorna a polarização atual do giroscópio na direção X em unidades de graus/s.
float gxb;
gxb = IMU.getGyroBiasX();
(opcional) float getGyroBiasY() Esta função retorna a polarização atual do giroscópio na direção Y em unidades de graus/s.
float gyb;
gyb = IMU.getGyroBiasY();
(opcional) float getGyroBiasZ() Esta função retorna a polarização atual do giroscópio na direção Z em unidades de graus/s.
float gzb;
gzb = IMU.getGyroBiasZ();
(opcional) void setGyroBiasX(float bias) Esta função define a polarização do giroscópio usada na direção X para o valor de entrada em unidades de graus/s.
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(opcional) void setGyroBiasY(float bias) Esta função define a polarização do giroscópio usada na direção Y para o valor de entrada em unidades de graus/s.
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(opcional) void setGyroBiasZ(float bias) Esta função define a polarização do giroscópio usada na direção Z para o valor de entrada em unidades de graus/s.
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(opcional) int calibrateAccel() Esta função estimará o viés e o fator de escala necessários para calibrar os acelerômetros. Esta função funciona em um eixo por vez e precisa ser executada para todas as 6 orientações do sensor. Depois de coletar dados suficientes do sensor, ele estimará o viés e o fator de escala para todos os três canais do acelerômetro e aplicará essas correções aos dados medidos. A calibração do acelerômetro só precisa ser realizada uma vez na IMU, as funções get e set detalhadas abaixo podem ser usadas para recuperar o viés estimado e os fatores de escala e usá-los durante futuros ciclos de energia ou operações com a IMU. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha.
status = IMU.calibrateAccel();
(opcional) float getAccelBiasX_mss() Esta função retorna a polarização atual do acelerômetro na direção X em unidades de m/s/s.
float axb;
axb = IMU.getAccelBiasX_mss();
(opcional) float getAccelScaleFactorX() Esta função retorna o fator de escala atual do acelerômetro na direção X.
float axs;
axs = IMU.getAccelScaleFactorX();
(opcional) float getAccelBiasY_mss() Esta função retorna a polarização atual do acelerômetro na direção Y em unidades de m/s/s.
float ayb;
ayb = IMU.getAccelBiasY_mss();
(opcional) float getAccelScaleFactorY() Esta função retorna o fator de escala atual do acelerômetro na direção Y.
float ays;
ays = IMU.getAccelScaleFactorY();
(opcional) float getAccelBiasZ_mss() Esta função retorna a polarização atual do acelerômetro na direção Z em unidades de m/s/s.
float azb;
azb = IMU.getAccelBiasZ_mss();
(opcional) float getAccelScaleFactorZ() Esta função retorna o fator de escala atual do acelerômetro na direção Z.
float azs;
azs = IMU.getAccelScaleFactorZ();
(opcional) void setAccelCalX(float bias,float scaleFactor) Esta função define a polarização do acelerômetro (m/s/s) e o fator de escala que está sendo usado na direção X para os valores de entrada.
float axb = 0.01 ; // accel bias of 0.01 m/s/s
float axs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalX(axb,axs);
(opcional) void setAccelCalY(float bias,float scaleFactor) Esta função define a polarização do acelerômetro (m/s/s) e o fator de escala que está sendo usado na direção Y para os valores de entrada.
float ayb = 0.01 ; // accel bias of 0.01 m/s/s
float ays = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalY(ayb,ays);
(opcional) void setAccelCalZ(float bias,float scaleFactor) Esta função define a polarização do acelerômetro (m/s/s) e o fator de escala que está sendo usado na direção Z para os valores de entrada.
float azb = 0.01 ; // accel bias of 0.01 m/s/s
float azs = 0.97 ; // accel scale factor of 0.97
IMU.setAccelCalZ(azb,azs);
As funções abaixo são usadas para coletar dados do sensor ICM42688. Consulte a seção 10.1 da folha de dados para obter a orientação dos eixos sensíveis.
int getAGT() lê o sensor e armazena os dados mais recentes em um buffer, ele deve ser chamado toda vez que você quiser recuperar dados do sensor. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha.
IMU.getAGT();
float accX() obtém o valor do acelerômetro do buffer de dados na direção X e o retorna em unidades de g.
float ax = IMU.accX();
float accY() obtém o valor do acelerômetro do buffer de dados na direção Y e o retorna em unidades de g.
float ay = IMU.accY();
float accZ() obtém o valor do acelerômetro do buffer de dados na direção Z e o retorna em unidades de g.
float az = IMU.accZ();
float gyrX() obtém o valor do giroscópio do buffer de dados na direção X e o retorna em unidades de graus/s.
float gx = IMU.gyrX();
float gyrY() obtém o valor do giroscópio do buffer de dados na direção Y e o retorna em unidades de graus/s.
float gy = IMU.gyrY();
float gyrZ() obtém o valor do giroscópio do buffer de dados na direção Z e o retorna em unidades de graus/s.
float gz = IMU.gyrZ();
float temp() obtém o valor da temperatura da matriz do buffer de dados e o retorna em unidades de C.
float temperature = IMU.temp();
A classe derivada ICM42688FIFO estende a funcionalidade fornecida pela classe base ICM42688 , fornecendo suporte para configuração e leitura do buffer ICM42688FIFO. Todas as funções descritas acima, como parte da classe ICM42688, também estão disponíveis para a classe ICM42688FIFO .
ICM42688FIFO(TwoWire &bus, uint8_t address) Um objeto ICM42688FIFO deve ser declarado, especificando o barramento I2C e o endereço ICM42688 I2C. O endereço ICM42688 I2C será 0x68 se o pino AD0 estiver aterrado ou 0x69 se o pino AD0 estiver puxado para cima. Por exemplo, o código a seguir declara um objeto ICM42688FIFO chamado IMU com um sensor ICM42688 localizado no barramento I2C 0 com um endereço de sensor 0x68 (AD0 aterrado).
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Um objeto ICM42688FIFO deve ser declarado, especificando o barramento SPI e o pino de seleção de chip usado. Vários ICM42688 ou outros objetos SPI podem ser usados no mesmo barramento SPI, cada um com seu próprio pino de seleção de chip. O pino de seleção do chip pode ser qualquer pino digital disponível. Por exemplo, o código a seguir declara um objeto ICM42688FIFO chamado IMU com um sensor ICM42688 localizado no barramento SPI 0 com pino de seleção de chip 10.
ICM42688FIFO IMU (SPI, 10 );
Observe que o clock padrão do barramento SPI de alta velocidade está definido para 8 MHz, mas o ICM 42688-p suporta clock SPI de até 24 MHz. Use um relógio mais rápido para transferências de dados SPI mais rápidas ao ler dados.
(opcional) int enableFifo(bool accel,bool gyro,bool temp) Esta função configura e habilita o buffer FIFO ICM42688. Esse buffer de 512 bytes coleta amostras de dados na taxa de saída de dados definida pelo SRD e permite que o microcontrolador leia os dados em massa, reduzindo a carga de trabalho do microcontrolador para determinadas aplicações. Ele é configurado com um conjunto de valores booleanos que descrevem quais dados armazenar em buffer no FIFO: acelerômetro, giroscópio ou temperatura. Os dados do acelerômetro e do giroscópio ocupam, cada um, 6 bytes de espaço por amostra e a temperatura 2 bytes. É importante selecionar apenas as fontes de dados desejadas para garantir que o FIFO não ultrapasse a leitura. Por exemplo, habilitar todas as fontes de dados exigiria 21 bytes por amostra, permitindo que o FIFO retenha apenas 24 amostras antes de transbordar. Se apenas os dados do acelerômetro forem necessários, isso aumenta para 85 amostras antes de transbordar. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha. Consulte o exemplo FIFO_SPI . A seguir está um exemplo de como ativar o FIFO para armazenar dados do acelerômetro e do giroscópio.
status = IMU.enableFifo( true , true , false , false );
int readFifo() lê o buffer FIFO do ICM42688, analisa-o e armazena os dados em buffers no microcontrolador. Ele deve ser chamado sempre que você desejar recuperar dados do buffer FIFO. Esta função retorna um valor positivo em caso de sucesso e um valor negativo em caso de falha.
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data) obtém o valor do acelerômetro do buffer de dados na direção X e o retorna em unidades de m/s/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data) obtém o valor do acelerômetro do buffer de dados na direção Y e o retorna em unidades de m/s/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data) obtém o valor do acelerômetro do buffer de dados na direção Z e o retorna em unidades de m/s/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data) obtém o valor do giroscópio do buffer de dados na direção X e o retorna em unidades de graus/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) obtém o valor do giroscópio do buffer de dados na direção Y e o retorna em unidades de graus/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) obtém o valor do giroscópio do buffer de dados na direção Z e o retorna em unidades de graus/s. Os dados são retornados como uma matriz junto com o número de elementos dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data) obtém o valor da temperatura da matriz do buffer de dados e o retorna em unidades de C. Os dados são retornados como uma matriz junto com o número de elementos dentro dessa matriz. Certifique-se de que o buffer para o qual você está transferindo tenha capacidade suficiente para armazenar os dados.
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
Consulte a folha de dados ICM42688. Esta biblioteca deve funcionar bem para outras placas de breakout ou sensores incorporados; consulte o diagrama de pinagem do seu fornecedor.
Os pinos ICM42688 devem ser conectados como:
Resistores de 4,7 kOhm devem ser usados como pull-ups em SDA e SCL, esses resistores devem ser pull-up com uma fonte de 3,3V.
Os pinos ICM42688 devem ser conectados como:
Algumas placas de breakout, incluindo a placa de breakout Embedded Masters, requerem pequenas modificações para ativar o SPI. Consulte a documentação do seu fornecedor.