Biblioteca Arduino para comunicarse con las unidades de medición inercial (IMU) de seis ejes ICM42688.
El InvenSense ICM42688 admite comunicación I2C, hasta 400 kHz y SPI, hasta 1 MHz para configuración de registros y 24 MHz para lectura de datos. Están disponibles los siguientes rangos de sensores de escala completa seleccionables:
Rango de escala completa del giroscopio | Rango de escala completa del acelerómetro |
---|---|
+/- 15,6 (grados/s) | - |
+/- 31,2 (grados/s) | - |
+/- 62,5 (grados/s) | - |
+/- 125 (grados/s) | - |
+/- 250 (grados/s) | +/- 2 (gramos) |
+/- 500 (grados/s) | +/- 4 (gramos) |
+/- 1000 (grados/s) | +/- 8 (gramos) |
+/- 2000 (grados/s) | +/- 16 (g) |
El ICM42688 toma muestras de giroscopios y acelerómetros con convertidores analógicos a digitales de 16 bits. También cuenta con filtros digitales programables, un reloj de precisión, un sensor de temperatura integrado, interrupciones programables (incluida la activación por movimiento) y un búfer FIFO de 512 bytes.
Esta biblioteca admite comunicación I2C y SPI con el ICM42688.
Simplemente clone o descargue esta biblioteca en su carpeta Arduino/bibliotecas.
Esta biblioteca admite comunicación I2C y SPI con el ICM42688. La declaración de objeto ICM42688 está sobrecargada con diferentes declaraciones para comunicación I2C y SPI. Todas las demás funciones siguen siendo las mismas. Además, se incluye una clase derivada, ICM42688FIFO , que proporciona configuración FIFO y funcionalidad de recopilación de datos además de toda la funcionalidad incluida en la clase base ICM42688 .
ICM42688(TwoWire &bus, dirección uint8_t) Se debe declarar un objeto ICM42688, especificando el bus I2C y la dirección I2C ICM42688. La dirección ICM42688 I2C será 0x68 si el pin AD0 está conectado a tierra o 0x69 si el pin AD0 está alto. Por ejemplo, el siguiente código declara un objeto ICM42688 llamado IMU con un sensor ICM42688 ubicado en el bus I2C 0 con una dirección de sensor de 0x68 (AD0 conectado a tierra).
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, dirección uint8_t) Se debe declarar un objeto ICM42688, especificando el bus I2C y la dirección I2C ICM42688. La dirección ICM42688 I2C será 0x68 si el pin AD0 está conectado a tierra o 0x69 si el pin AD0 está alto. Por ejemplo, el siguiente código declara un objeto ICM42688 llamado IMU con un sensor ICM42688 ubicado en el bus I2C 0 con una dirección de sensor de 0x68 (AD0 conectado a tierra). Debes especificar los pines SDA y SCL para tu conexión I2C (el valor predeterminado para Arduino es SDA=18, SCL=19, ESP32 es SDA=21, SCL=22)
ICM42688 IMU (Wire, 0x68 , _sda_pin, _scl_pin);
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Se debe declarar un objeto ICM42688, especificando el bus SPI y el pin de selección de chip utilizados. Se pueden usar múltiples ICM42688 u otros objetos SPI en el mismo bus SPI, cada uno con su propio pin de selección de chip. El pin de selección de chip puede ser cualquier pin digital disponible. Por ejemplo, el siguiente código declara un objeto ICM42688 llamado IMU con un sensor ICM42688 ubicado en el bus SPI 0 con el pin de selección de chip 10.
ICM42688 IMU (SPI, 10 );
Tenga en cuenta que el reloj del bus SPI de alta velocidad predeterminado está configurado en 8 MHz, pero el ICM 42688-p admite un reloj SPI de hasta 24 MHz. Utilice un reloj más rápido para transferencias de datos SPI más rápidas al leer datos.
Las siguientes funciones se utilizan para configurar el sensor ICM42688. Estos deben llamarse una vez antes de la recopilación de datos; normalmente esto se hace en la función Arduino setup()
. Siempre se debe utilizar la función begin()
. Opcionalmente, las funciones setAccelFS
y setGyroFS
, setAccelODR
y setGyroODR
se pueden usar para configurar los rangos de escala completa del acelerómetro y giroscopio y la velocidad de datos de salida a valores distintos a los predeterminados. enableDataReadyInterrupt
y disableDataReadyInterrupt
controlan si el ICM42688 genera una interrupción cuando los datos están listos. enableFifo
configura y habilita el búfer FIFO. Estas funciones se describen en detalle a continuación.
int start() Esto debería llamarse en su función de configuración. Inicializa la comunicación con el ICM42688, configura el sensor para leer datos y estima la polarización del giroscopio, que se elimina de los datos del sensor. Esta función devuelve un valor positivo en una inicialización exitosa y devuelve un valor negativo en una inicialización fallida. Si no tiene éxito, verifique su cableado o intente restablecer la alimentación al sensor. El siguiente es un ejemplo de configuración del ICM42688.
int status = IMU.begin();
(opcional) int setAccelRange(AccelRange range) Esta función establece el rango de escala completa del acelerómetro al valor dado. De forma predeterminada, si no se llama a esta función, se utilizará un rango de escala completa de +/- 16 g. Los rangos de escala completa del acelerómetro enumerados son:
Nombre del acelerómetro | Rango de escala completa del acelerómetro |
---|---|
gpm2 | +/- 2 (gramos) |
gpm4 | +/- 4 (gramos) |
gpm8 | +/- 8 (gramos) |
gpm16 | +/- 16 (g) |
Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. Consulte el ejemplo Advanced_I2C . El siguiente es un ejemplo de selección de un rango de escala completa del acelerómetro de +/- 8 g.
status = IMU.setAccelFS(ICM42688::gpm2);
(opcional) int setGyroRange(Rango GyroRange) Esta función establece el rango de escala completa del giroscopio al valor dado. De forma predeterminada, si no se llama a esta función, se utilizará un rango de escala completa de +/- 2000 grados/s. Los rangos de escala completa del giroscopio enumerados son:
Nombre del giroscopio | Rango de escala completa del giroscopio |
---|---|
dps15_625 | +/- 15,625 (grados/s) |
dps31_25 | +/- 31,25 (grados/s) |
dps62_5 | +/- 62,5 (grados/s) |
dps125 | +/- 125 (grados/s) |
dps250 | +/- 250 (grados/s) |
dps500 | +/- 500 (grados/s) |
dps1000 | +/- 1000 (grados/s) |
dps2000 | +/- 2000 (grados/s) |
Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. Consulte el ejemplo Advanced_I2C . El siguiente es un ejemplo de selección de un rango de escala completa de giroscopio de +/- 250 grados/s.
status = IMU.setGyroFS(ICM42688::dps250);
(opcional) int setFilters(bool gyroFilters, bool accFilters) Esta es una función opcional para configurar los filtros programables (filtro de muesca, filtro anti-alias, bloque de filtro de interfaz de usuario). De forma predeterminada, todos los filtros están activados. La siguiente figura muestra un diagrama de bloques de la ruta de la señal para ICM42688:
Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. El siguiente es un ejemplo de cómo activar los filtros.
status = IMU.setFilters( true , true );
(opcional) int enableDataReadyInterrupt() Una interrupción está vinculada a la velocidad de salida de datos. El pin ICM42688 INT emitirá un pulso de 50 us cuando los datos estén listos. Esto es extremadamente útil para usar interrupciones para cronometrar la recopilación de datos que deberían ocurrir en un intervalo regular. Consulte el ejemplo de Interrupt_SPI . Esta función habilita esta interrupción, que ocurrirá a una frecuencia dada por el SRD. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. El siguiente es un ejemplo de cómo habilitar la interrupción de datos listos.
status = IMU.enableDataReadyInterrupt();
(opcional) int enableDataReadyInterrupt() Esta función deshabilita la interrupción de datos listos, descrita anteriormente. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. El siguiente es un ejemplo de cómo deshabilitar la interrupción de datos listos.
status = IMU.disableDataReadyInterrupt();
(opcional) uin8_t isInterrupted() Esta función lee el registro de interrupción de datos listos. Esta función devuelve verdadero cuando se interrumpe. El siguiente es un ejemplo de lectura del registro de interrupción listo para datos.
status = IMU.isInterrupted();
(opcional) int calibrateGyro() La polarización del giroscopio se estima automáticamente durante la función comenzar() y se elimina de las mediciones del sensor. Esta función reestimará la polarización del giroscopio y eliminará la nueva polarización de futuras mediciones del sensor. El sensor debe permanecer estacionario durante este proceso. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. El siguiente es un ejemplo de estimación de nuevos sesgos giroscópicos.
status = IMU.calibrateGyro();
(opcional) float getGyroBiasX() Esta función devuelve la polarización actual del giroscopio en la dirección X en unidades de grados/s.
float gxb;
gxb = IMU.getGyroBiasX();
(opcional) float getGyroBiasY() Esta función devuelve la polarización actual del giroscopio en la dirección Y en unidades de grados/s.
float gyb;
gyb = IMU.getGyroBiasY();
(opcional) float getGyroBiasZ() Esta función devuelve la polarización actual del giroscopio en la dirección Z en unidades de grados/s.
float gzb;
gzb = IMU.getGyroBiasZ();
(opcional) void setGyroBiasX(sesgo de flotación) Esta función establece el sesgo del giroscopio que se utiliza en la dirección X al valor de entrada en unidades de grados/s.
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(opcional) void setGyroBiasY(sesgo de flotación) Esta función establece el sesgo del giroscopio que se utiliza en la dirección Y al valor de entrada en unidades de grados/s.
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(opcional) void setGyroBiasZ(sesgo de flotación) Esta función establece el sesgo del giroscopio que se utiliza en la dirección Z al valor de entrada en unidades de grados/s.
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(opcional) int calibrateAccel() Esta función estimará el factor de polarización y escala necesarios para calibrar los acelerómetros. Esta función funciona en un eje a la vez y debe ejecutarse para las 6 orientaciones del sensor. Una vez que haya recopilado suficientes datos del sensor, estimará el factor de polarización y escala para los tres canales del acelerómetro y aplicará estas correcciones a los datos medidos. La calibración del acelerómetro solo debe realizarse una vez en la IMU; las funciones de obtención y configuración que se detallan a continuación se pueden usar para recuperar los factores de polarización y escala estimados y usarlos durante futuros ciclos de energía u operaciones con la IMU. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error.
status = IMU.calibrateAccel();
(opcional) float getAccelBiasX_mss() Esta función devuelve la polarización actual del acelerómetro en la dirección X en unidades de m/s/s.
float axb;
axb = IMU.getAccelBiasX_mss();
(opcional) float getAccelScaleFactorX() Esta función devuelve el factor de escala actual del acelerómetro en la dirección X.
float axs;
axs = IMU.getAccelScaleFactorX();
(opcional) float getAccelBiasY_mss() Esta función devuelve la polarización actual del acelerómetro en la dirección Y en unidades de m/s/s.
float ayb;
ayb = IMU.getAccelBiasY_mss();
(opcional) float getAccelScaleFactorY() Esta función devuelve el factor de escala actual del acelerómetro en la dirección Y.
float ays;
ays = IMU.getAccelScaleFactorY();
(opcional) float getAccelBiasZ_mss() Esta función devuelve la polarización actual del acelerómetro en la dirección Z en unidades de m/s/s.
float azb;
azb = IMU.getAccelBiasZ_mss();
(opcional) float getAccelScaleFactorZ() Esta función devuelve el factor de escala actual del acelerómetro en la dirección Z.
float azs;
azs = IMU.getAccelScaleFactorZ();
(opcional) void setAccelCalX(sesgo de flotación, factor de escala de flotación) Esta función establece la polarización del acelerómetro (m/s/s) y el factor de escala que se utiliza en la dirección X para los 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(sesgo de flotación, factor de escala de flotación) Esta función establece la polarización del acelerómetro (m/s/s) y el factor de escala que se utiliza en la dirección Y para los 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(sesgo de flotación, factor de escala de flotación) Esta función establece la polarización del acelerómetro (m/s/s) y el factor de escala que se utiliza en la dirección Z para los 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);
Las funciones siguientes se utilizan para recopilar datos del sensor ICM42688. Consulte la hoja de datos Sección 10.1 para conocer la orientación de los ejes sensibles.
int getAGT() lee el sensor y almacena los datos más recientes en un búfer; se debe llamar cada vez que desee recuperar datos del sensor. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error.
IMU.getAGT();
float accX() obtiene el valor del acelerómetro del búfer de datos en la dirección X y lo devuelve en unidades de g.
float ax = IMU.accX();
float accY() obtiene el valor del acelerómetro del búfer de datos en la dirección Y y lo devuelve en unidades de g.
float ay = IMU.accY();
float accZ() obtiene el valor del acelerómetro del búfer de datos en la dirección Z y lo devuelve en unidades de g.
float az = IMU.accZ();
float gyrX() obtiene el valor del giroscopio del búfer de datos en la dirección X y lo devuelve en unidades de grados/s.
float gx = IMU.gyrX();
float gyrY() obtiene el valor del giroscopio del búfer de datos en la dirección Y y lo devuelve en unidades de grados/s.
float gy = IMU.gyrY();
float gyrZ() obtiene el valor del giroscopio del búfer de datos en la dirección Z y lo devuelve en unidades de grados/s.
float gz = IMU.gyrZ();
float temp() obtiene el valor de temperatura del troquel del búfer de datos y lo devuelve en unidades de C.
float temperature = IMU.temp();
La clase derivada ICM42688FIFO amplía la funcionalidad proporcionada por la clase base ICM42688 al brindar soporte para configurar y leer el búfer ICM42688FIFO. Todas las funciones descritas anteriormente, como parte de la clase ICM42688, también están disponibles para la clase ICM42688FIFO .
ICM42688FIFO(TwoWire &bus, dirección uint8_t) Se debe declarar un objeto ICM42688FIFO, especificando el bus I2C y la dirección ICM42688 I2C. La dirección ICM42688 I2C será 0x68 si el pin AD0 está conectado a tierra o 0x69 si el pin AD0 está alto. Por ejemplo, el siguiente código declara un objeto ICM42688FIFO llamado IMU con un sensor ICM42688 ubicado en el bus I2C 0 con una dirección de sensor de 0x68 (AD0 conectado a tierra).
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) Se debe declarar un objeto ICM42688FIFO, especificando el bus SPI y el pin de selección de chip utilizados. Se pueden usar múltiples ICM42688 u otros objetos SPI en el mismo bus SPI, cada uno con su propio pin de selección de chip. El pin de selección de chip puede ser cualquier pin digital disponible. Por ejemplo, el siguiente código declara un objeto ICM42688FIFO llamado IMU con un sensor ICM42688 ubicado en el bus SPI 0 con el pin de selección de chip 10.
ICM42688FIFO IMU (SPI, 10 );
Tenga en cuenta que el reloj del bus SPI de alta velocidad predeterminado está configurado en 8 MHz, pero el ICM 42688-p admite un reloj SPI de hasta 24 MHz. Utilice un reloj más rápido para transferencias de datos SPI más rápidas al leer datos.
(opcional) int enableFifo(bool accel,bool gyro,bool temp) Esta función configura y habilita el búfer FIFO ICM42688. Este búfer de 512 bytes muestra datos a la velocidad de salida de datos establecida por el SRD y permite que el microcontrolador lea los datos en masa, lo que reduce la carga de trabajo del microcontrolador para ciertas aplicaciones. Está configurado con un conjunto de valores booleanos que describen qué datos almacenar en el FIFO: acelerómetro, giroscopio o temperatura. Los datos del acelerómetro y del giroscopio ocupan cada uno 6 bytes de espacio por muestra y la temperatura 2 bytes. Es importante seleccionar solo las fuentes de datos deseadas para garantizar que el FIFO no se desborde entre lecturas. Por ejemplo, habilitar todas las fuentes de datos requeriría 21 bytes por muestra, lo que permitiría que FIFO contuviera solo 24 muestras antes de desbordarse. Si solo se necesitan los datos del acelerómetro, esto aumenta a 85 muestras antes de desbordarse. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error. Consulte el ejemplo FIFO_SPI . El siguiente es un ejemplo de cómo habilitar el FIFO para almacenar datos del acelerómetro y giroscopio.
status = IMU.enableFifo( true , true , false , false );
int readFifo() lee el búfer FIFO del ICM42688, lo analiza y almacena los datos en búferes en el microcontrolador. Debe llamarse cada vez que desee recuperar datos del búfer FIFO. Esta función devuelve un valor positivo en caso de éxito y un valor negativo en caso de error.
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data) obtiene el valor del acelerómetro del búfer de datos en la dirección X y lo devuelve en unidades de m/s/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data) obtiene el valor del acelerómetro del búfer de datos en la dirección Y y lo devuelve en unidades de m/s/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data) obtiene el valor del acelerómetro del búfer de datos en la dirección Z y lo devuelve en unidades de m/s/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data) obtiene el valor del giroscopio del búfer de datos en la dirección X y lo devuelve en unidades de grados/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) obtiene el valor del giroscopio del búfer de datos en la dirección Y y lo devuelve en unidades de grados/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) obtiene el valor del giroscopio del búfer de datos en la dirección Z y lo devuelve en unidades de grados/s. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data) obtiene el valor de temperatura del troquel del búfer de datos y lo devuelve en unidades de C. Los datos se devuelven como una matriz junto con el número de elementos dentro de esa matriz. Asegúrese de que el búfer al que está transfiriendo tenga suficiente capacidad para almacenar los datos.
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
Consulte la hoja de datos ICM42688. Esta biblioteca debería funcionar bien para otras placas de conexión o sensores integrados; consulte el diagrama de distribución de pines de su proveedor.
Los pines del ICM42688 deben conectarse como:
Se deben usar resistencias de 4,7 kOhm como pullups en SDA y SCL; estas resistencias deben pullups con una fuente de 3,3V.
Los pines del ICM42688 deben conectarse como:
Algunas placas de conexión, incluida la placa de conexión Embedded Masters, requieren una ligera modificación para habilitar SPI. Consulte la documentación de su proveedor.