用於與 ICM42688 六軸慣性測量單元 (IMU) 通訊的 Arduino 庫。
InvenSense ICM42688 支援 I2C(高達 400 kHz)和 SPI 通信,暫存器設定高達 1 MHz,資料讀取高達 24 MHz。提供以下選用滿量程感知器範圍:
陀螺儀滿量程範圍 | 加速度計滿量程範圍 |
---|---|
+/- 15.6(度/秒) | - |
+/- 31.2(度/秒) | - |
+/- 62.5(度/秒) | - |
+/- 125(度/秒) | - |
+/- 250(度/秒) | +/- 2(克) |
+/- 500(度/秒) | +/- 4(克) |
+/- 1000(度/秒) | +/- 8(克) |
+/- 2000(度/秒) | +/- 16(克) |
ICM42688 使用 16 位元類比數位轉換器對陀螺儀和加速度計進行取樣。它還具有可編程數位濾波器、精密時脈、嵌入式溫度感測器、可編程中斷(包括運動喚醒)和 512 位元組 FIFO 緩衝區。
該庫支援與 ICM42688 的 I2C 和 SPI 通訊。
只需克隆或下載該庫到您的 Arduino/libraries 資料夾中即可。
該庫支援與 ICM42688 的 I2C 和 SPI 通訊。 ICM42688物件聲明重載了 I2C 和 SPI 通訊的不同聲明。所有其他功能保持不變。此外,還包括一個衍生類別ICM42688FIFO ,除了基本ICM42688類別中包含的所有功能之外,它還提供 FIFO 設定和資料收集功能。
ICM42688(TwoWire &bus, uint8_t address)應聲明 ICM42688 對象,指定 I2C 匯流排和 ICM42688 I2C 位址。如果 AD0 接腳接地,則 ICM42688 I2C 位址將為 0x68;如果 AD0 接腳拉高,則 ICM42688 I2C 位址將為 0x69。例如,以下程式碼宣告一個名為IMU的 ICM42688 對象,其中 ICM42688 感測器位於 I2C 匯流排 0 上,感測器位址為 0x68(AD0 接地)。
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, uint8_t address)應聲明 ICM42688 對象,指定 I2C 匯流排和 ICM42688 I2C 位址。如果 AD0 接腳接地,則 ICM42688 I2C 位址將為 0x68;如果 AD0 接腳拉高,則 ICM42688 I2C 位址將為 0x69。例如,以下程式碼宣告一個名為IMU的 ICM42688 對象,其中 ICM42688 感測器位於 I2C 匯流排 0 上,感測器位址為 0x68(AD0 接地)。您應該為 I2C 連線指定 SDA 和 SCL 接腳(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)應聲明 ICM42688 對象,指定使用的 SPI 匯流排和片選接腳。多個 ICM42688 或其他 SPI 物件可以在同一 SPI 總線上使用,每個物件都有自己的片選引腳。片選引腳可以是任何可用的數位引腳。例如,以下程式碼聲明了一個名為IMU的 ICM42688 對象,其中 ICM42688 感測器位於 SPI 總線 0 上,片選引腳為 10。
ICM42688 IMU (SPI, 10 );
請注意,預設高速 SPI 總線時脈設定為 8 MHz,但 ICM 42688-p 支援高達 24 MHz SPI 時脈。讀取資料時使用更快的時脈可實現更快的 SPI 資料傳輸。
以下函數用於設定 ICM42688 感測器。這些應該在資料收集之前調用一次,通常是在 Arduino setup()
函數中完成。應始終使用begin()
函數。 (可選) setAccelFS
和setGyroFS
、 setAccelODR
和setGyroODR
函數可用於將加速度計和陀螺儀滿量程範圍和輸出資料速率設定為預設值以外的值。 enableDataReadyInterrupt
和disableDataReadyInterrupt
控制ICM42688 是否在資料就緒時產生中斷。 enableFifo
設定並啟用 FIFO 緩衝區。下面詳細描述了這些功能。
int begin()這應該在您的設定函數中呼叫。它初始化與 ICM42688 的通信,設置感測器以讀取數據,並估計陀螺儀偏差(從感測器數據中刪除)。函數在初始化成功時傳回正值,在初始化失敗時傳回負值。如果不成功,請檢查接線或嘗試重設感測器電源。以下是設定 ICM42688 的範例。
int status = IMU.begin();
(可選) int setAccelRange(AccelRange range)此函數將加速度計滿量程範圍設定為給定值。預設情況下,如果未呼叫此函數,則將使用 +/- 16 g 的滿量程範圍。列舉的加速度計滿量程範圍為:
加速度計名稱 | 加速度計滿量程範圍 |
---|---|
GPPM2 | +/- 2(克) |
GPPM4 | +/- 4(克) |
gpm8 | +/- 8(克) |
加侖值16 | +/- 16(克) |
函數在成功時傳回正值,失敗時傳回負值。請參閱Advanced_I2C 範例。以下是選擇加速度計滿量程範圍 +/- 8g 的範例。
status = IMU.setAccelFS(ICM42688::gpm2);
(可選) int setGyroRange(GyroRange range)此函數將陀螺儀滿量程範圍設定為給定值。預設情況下,如果未呼叫此函數,將使用 +/- 2000 deg/s 的滿量程範圍。列舉的陀螺儀滿量程範圍為:
陀螺儀名稱 | 陀螺儀滿量程範圍 |
---|---|
dps15_625 | +/- 15.625(度/秒) |
dps31_25 | +/- 31.25(度/秒) |
dps62_5 | +/- 62.5(度/秒) |
dps125 | +/- 125(度/秒) |
傷害250 | +/- 250(度/秒) |
傷害500 | +/- 500(度/秒) |
傷害1000 | +/- 1000(度/秒) |
dps2000 | +/- 2000(度/秒) |
函數在成功時傳回正值,失敗時傳回負值。請參閱Advanced_I2C 範例。以下是選擇陀螺儀滿量程範圍 +/- 250 deg/s 的範例。
status = IMU.setGyroFS(ICM42688::dps250);
(可選) int setFilters(bool gyroFilters, bool accFilters)這是設定可程式濾波器(陷波濾波器、抗混疊濾波器、UI 濾波器區塊)的可選函數。預設情況下,所有過濾器均開啟。下圖顯示了 ICM42688 的訊號路徑框圖:
函數在成功時傳回正值,失敗時傳回負值。以下是打開過濾器的範例。
status = IMU.setFilters( true , true );
(可選) int enableDataReadyInterrupt()中斷與資料輸出速率相關。當資料準備好時,ICM42688 INT引腳將發出 50us 脈衝。這對於使用中斷來計時應定期發生的資料收集非常有用。請參閱Interrupt_SPI 範例。此函數啟用此中斷,該中斷將以 SRD 給定的頻率發生。函數在成功時傳回正值,失敗時傳回負值。以下是使能資料就緒中斷的範例。
status = IMU.enableDataReadyInterrupt();
(可選) int disableDataReadyInterrupt()此函數停用資料就緒中斷,如上所述。函數在成功時傳回正值,失敗時傳回負值。以下是禁用資料就緒中斷的範例。
status = IMU.disableDataReadyInterrupt();
(可選) uin8_t isInterrupted()此函數讀取資料就緒中斷暫存器。該函數在中斷時傳回 true。下面是讀取資料就緒中斷暫存器的範例。
status = IMU.isInterrupted();
(可選) int calibrateGyro()陀螺儀偏差在begin()函數期間自動估計並從感測器測量中刪除。此函數將重新估計陀螺儀偏差並從未來的感測器測量中消除新的偏差。在此過程中感測器應保持靜止。函數在成功時傳回正值,失敗時傳回負值。以下是估計新陀螺儀偏差的範例。
status = IMU.calibrateGyro();
(可選) float getGyroBiasX()此函數傳回 X 方向目前陀螺儀偏置,單位為 deg/s。
float gxb;
gxb = IMU.getGyroBiasX();
(可選) float getGyroBiasY()此函數傳回目前 Y 方向陀螺儀偏置,單位為 deg/s。
float gyb;
gyb = IMU.getGyroBiasY();
(可選) float getGyroBiasZ()此函數傳回 Z 方向目前陀螺儀偏置,單位為 deg/s。
float gzb;
gzb = IMU.getGyroBiasZ();
(可選) void setGyroBiasX(floatbias)此函數將 X 方向使用的陀螺儀偏移設為輸入值(以度/秒為單位)。
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(可選) void setGyroBiasY(floatbias)此函數將 Y 方向使用的陀螺儀偏移設為輸入值(以度/秒為單位)。
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(可選) void setGyroBiasZ(floatbias)此函數將 Z 方向使用的陀螺儀偏移設為輸入值(以度/秒為單位)。
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(可選)int calibrateAccel()此函數將估計校正加速度計所需的偏差和比例因子。此函數一次只對一個軸起作用,並且需要針對所有 6 個感測器方向運行。收集足夠的感測器數據後,它將估計所有三個加速度計通道的偏差和比例因子,並將這些校正應用於測量的數據。加速度計校準只需在 IMU 上執行一次,下面詳述的獲取和設定函數可用於檢索估計的偏差和比例因子,並在未來的電源週期或 IMU 操作中使用它們。函數在成功時傳回正值,失敗時傳回負值。
status = IMU.calibrateAccel();
(可選) float getAccelBiasX_mss()此函數傳回目前加速度計在 X 方向的偏差,單位為 m/s/s。
float axb;
axb = IMU.getAccelBiasX_mss();
(可選) float getAccelScaleFactorX()此函數傳回 X 方向目前加速度計比例因子。
float axs;
axs = IMU.getAccelScaleFactorX();
(可選) float getAccelBiasY_mss()此函數傳回 Y 方向目前加速度計偏差,單位為 m/s/s。
float ayb;
ayb = IMU.getAccelBiasY_mss();
(可選) float getAccelScaleFactorY()此函數傳回 Y 方向當前加速度計比例因子。
float ays;
ays = IMU.getAccelScaleFactorY();
(可選) float getAccelBiasZ_mss()此函數傳回目前 Z 方向的加速度計偏差,單位為 m/s/s。
float azb;
azb = IMU.getAccelBiasZ_mss();
(可選) float getAccelScaleFactorZ()此函數傳回 Z 方向當前加速度計比例因子。
float azs;
azs = IMU.getAccelScaleFactorZ();
(可選) void setAccelCalX(floatbias,floatscaleFactor)此函數將 X 方向使用的加速度計偏差 (m/s/s) 和比例因子設為輸入值。
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);
(可選) void setAccelCalY(floatbias,floatscaleFactor)此函數將 Y 方向使用的加速度計偏差 (m/s/s) 和比例因子設為輸入值。
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);
(可選) void setAccelCalZ(floatbias,floatscaleFactor)此函數將 Z 方向使用的加速度計偏差 (m/s/s) 和比例因子設為輸入值。
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);
以下函數用於從 ICM42688 感測器收集數據。有關敏感軸的方向,請參閱資料表第 10.1 節。
int getAGT()讀取感測器並將最新資料儲存在緩衝區中,每次您想從感測器檢索資料時都應該調用它。函數在成功時傳回正值,失敗時傳回負值。
IMU.getAGT();
float accX()從資料緩衝區中取得 X 方向的加速度計值,並以 g 為單位傳回。
float ax = IMU.accX();
float accY()從資料緩衝區中取得 Y 方向的加速度計值,並以 g 為單位傳回。
float ay = IMU.accY();
float accZ()從資料緩衝區取得 Z 方向的加速度計值,並以 g 為單位傳回。
float az = IMU.accZ();
float gyrX()從資料緩衝區取得 X 方向的陀螺儀值,並以度/秒為單位傳回。
float gx = IMU.gyrX();
float gyrY()從資料緩衝區中取得 Y 方向的陀螺儀值,並以度/秒為單位傳回。
float gy = IMU.gyrY();
float gyrZ()從資料緩衝區中取得 Z 方向的陀螺儀值,並以度/秒為單位傳回。
float gz = IMU.gyrZ();
float temp()從資料緩衝區取得晶片溫度值並以 C 為單位傳回。
float temperature = IMU.temp();
ICM42688FIFO衍生類別透過提供設定和讀取 ICM42688FIFO 緩衝區的支援來擴展ICM42688基底類別提供的功能。作為ICM42688類一部分的上述所有功能也可用於ICM42688FIFO類。
ICM42688FIFO(TwoWire &bus, uint8_t address)應聲明 ICM42688FIFO 對象,指定 I2C 匯流排和 ICM42688 I2C 位址。如果 AD0 接腳接地,則 ICM42688 I2C 位址將為 0x68;如果 AD0 接腳拉高,則 ICM42688 I2C 位址將為 0x69。例如,以下程式碼聲明了一個名為IMU的 ICM42688FIFO 對象,其中 ICM42688 感測器位於 I2C 匯流排 0 上,感測器位址為 0x68(AD0 接地)。
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000)應聲明 ICM42688FIFO 對象,指定使用的 SPI 總線和片選引腳。多個 ICM42688 或其他 SPI 物件可以在同一 SPI 總線上使用,每個物件都有自己的片選引腳。片選引腳可以是任何可用的數位引腳。例如,以下程式碼聲明了一個名為IMU的 ICM42688FIFO 對象,其中 ICM42688 感測器位於 SPI 匯流排 0 上,片選引腳為 10。
ICM42688FIFO IMU (SPI, 10 );
請注意,預設高速 SPI 總線時脈設定為 8 MHz,但 ICM 42688-p 支援高達 24 MHz SPI 時脈。讀取資料時使用更快的時脈可實現更快的 SPI 資料傳輸。
(可選) int enableFifo(bool accel,bool gyro,bool temp)此函數配置並啟用 ICM42688 FIFO 緩衝區。此 512 位元組緩衝區以 SRD 設定的數據輸出速率對數據進行採樣,並使微控制器能夠批量讀取數據,從而減少某些應用的微控制器工作負載。它配置有一組布林值,描述要在 FIFO 中緩衝哪些資料:加速度計、陀螺儀或溫度。加速度計和陀螺儀資料每個樣本佔用 6 個位元組的空間,溫度佔用 2 個位元組。僅選擇所需的資料來源非常重要,以確保 FIFO 在讀取期間不會溢位。例如,啟用所有資料來源每個樣本將佔用 21 個位元組,從而允許 FIFO 在溢出之前僅保存 24 個樣本。如果僅需要加速度計數據,則在溢出之前會增加到 85 個樣本。函數在成功時傳回正值,失敗時傳回負值。請參閱FIFO_SPI 範例。下面是啟用 FIFO 緩衝加速度計和陀螺儀資料的範例。
status = IMU.enableFifo( true , true , false , false );
int readFifo()從 ICM42688 讀取 FIFO 緩衝區,對其進行解析並將資料儲存在微控制器的緩衝區中。每次您想要從 FIFO 緩衝區檢索資料時都應該呼叫它。函數在成功時傳回正值,失敗時傳回負值。
IMU.readFifo();
void getFifoAccelX_mss(size_t size,float data)從資料緩衝區取得 X 方向的加速度計值,並以 m/s/s 為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float ax[ 100 ];
size_t samples;
IMU.getFifoAccelX_mss(&samples,ax);
void getFifoAccelY_mss(size_t size,float data)從資料緩衝區取得 Y 方向的加速度計值,並以 m/s/s 為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float ay[ 100 ];
size_t samples;
IMU.getFifoAccelY_mss(&samples,ay);
void getFifoAccelZ_mss(size_t size,float data)從資料緩衝區取得 Z 方向的加速度計值並以 m/s/s 為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float az[ 100 ];
size_t samples;
IMU.getFifoAccelZ_mss(&samples,az);
void getFifoGyroX(size_t size,float data)從資料緩衝區取得 X 方向的陀螺儀值,並以 deg/s 為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data)從資料緩衝區取得 Y 方向的陀螺儀值並以 deg/s 為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data)從資料緩衝區取得Z方向的陀螺儀值並以deg/s為單位傳回。資料以數組的形式傳回,並包含該數組中的元素數量。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float gz[ 100 ];
size_t samples;
IMU.getFifoGyroZ(&samples,gx);
void getFifoTemperature_C(size_t size,float data)從資料緩衝區取得晶片溫度值,並以 C 為單位傳回。確保您要傳輸到的緩衝區有足夠的容量來儲存資料。
float temp[ 100 ];
size_t samples;
IMU.getFifoTemperature_C(&samples,temp);
請參閱 ICM42688 資料表。該庫應該適用於其他分線板或嵌入式感測器,請參閱供應商的引腳圖。
ICM42688 接腳應連接為:
4.7 kOhm 電阻器應用作 SDA 和 SCL 上的上拉電阻,這些電阻器應使用 3.3V 電源進行上拉。
ICM42688 接腳應連接為:
某些分線板(包括嵌入式主控分線板)需要稍作修改才能啟用 SPI。請參閱供應商的文件。