ICM42688 6 軸慣性測定ユニット (IMU) と通信するための Arduino ライブラリ。
InvenSense ICM42688 は、最大 400 kHz の I2C、およびレジスタ設定で最大 1 MHz、データ読み取りで 24 MHz の SPI 通信をサポートします。次の選択可能なフルスケール センサー範囲が利用可能です。
ジャイロスコープのフルスケール範囲 | 加速度計のフルスケール範囲 |
---|---|
+/- 15.6 (度/秒) | - |
+/- 31.2 (度/秒) | - |
+/- 62.5 (度/秒) | - |
+/- 125 (度/秒) | - |
+/- 250 (度/秒) | +/- 2 (g) |
+/- 500 (度/秒) | +/- 4 (g) |
+/- 1000 (度/秒) | +/- 8 (g) |
+/- 2000 (度/秒) | +/- 16 (g) |
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 アドレスを指定して宣言する必要があります。 ICM42688 の I2C アドレスは、AD0 ピンが接地されている場合は 0x68、AD0 ピンが High にプルされている場合は 0x69 になります。たとえば、次のコードは、センサー アドレス 0x68 (AD0 接地) を持つ I2C バス 0 上に配置された ICM42688 センサーを備えたIMUと呼ばれる ICM42688 オブジェクトを宣言します。
ICM42688 IMU (Wire, 0x68 );
ICM42688(TwoWire &bus, uint8_t address) ICM42688 オブジェクトは、I2C バスと ICM42688 I2C アドレスを指定して宣言する必要があります。 ICM42688 の I2C アドレスは、AD0 ピンが接地されている場合は 0x68、AD0 ピンが High にプルされている場合は 0x69 になります。たとえば、次のコードは、センサー アドレス 0x68 (AD0 接地) を持つ I2C バス 0 上に配置された ICM42688 センサーを備えたIMUと呼ばれる ICM42688 オブジェクトを宣言します。 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 バス上で使用でき、それぞれが独自のチップ選択ピンを備えています。チップ選択ピンには、使用可能な任意のデジタル ピンを使用できます。たとえば、次のコードは、チップ選択ピン 10 を備えた SPI バス 0 上に配置された ICM42688 センサーを備えた、 IMUと呼ばれる ICM42688 オブジェクトを宣言します。
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 のフルスケール範囲が使用されます。列挙された加速度計のフルスケール範囲は次のとおりです。
加速度計の名前 | 加速度計のフルスケール範囲 |
---|---|
gpm2 | +/- 2 (g) |
gpm4 | +/- 4 (g) |
gpm8 | +/- 8 (g) |
gpm16 | +/- 16 (g) |
この関数は、成功すると正の値を返し、失敗すると負の値を返します。 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 (度/秒) |
dps250 | +/- 250 (度/秒) |
dps500 | +/- 500 (度/秒) |
dps1000 | +/- 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 方向の現在のジャイロ バイアスを度/秒の単位で返します。
float gxb;
gxb = IMU.getGyroBiasX();
(オプション) float getGyroBiasY()この関数は、Y 方向の現在のジャイロ バイアスを度/秒の単位で返します。
float gyb;
gyb = IMU.getGyroBiasY();
(オプション) float getGyroBiasZ()この関数は、Z 方向の現在のジャイロ バイアスを度/秒の単位で返します。
float gzb;
gzb = IMU.getGyroBiasZ();
(オプション) void setGyroBiasX(floatbias) X方向に使用するジャイロバイアスを入力値にdeg/s単位で設定する関数です。
float gxb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasX(gxb);
(オプション) void setGyroBiasY(floatbias)この関数は、Y 方向に使用するジャイロ バイアスを deg/s 単位の入力値に設定します。
float gyb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasY(gyb);
(オプション) void setGyroBiasZ(floatbias) Z方向に使用するジャイロバイアスを入力値にdeg/s単位で設定する関数です。
float gzb = 0.001 ; // gyro bias of 0.001 deg/s
IMU.setGyroBiasZ(gzb);
(オプション) int calibrateAccel()この関数は、加速度計の校正に必要なバイアスとスケール係数を推定します。この機能は一度に 1 つの軸で動作し、6 つのセンサーの向きすべてに対して実行する必要があります。十分なセンサー データを収集した後、3 つの加速度計チャンネルすべてのバイアスとスケール係数を推定し、これらの補正を測定データに適用します。加速度計のキャリブレーションは、IMU で 1 回だけ実行する必要があります。以下で説明する get 関数と set 関数を使用して、推定バイアス係数とスケール係数を取得し、将来の電源サイクルまたは 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() はデータ バッファからダイ温度値を取得し、それを℃単位で返します。
float temperature = IMU.temp();
ICM42688FIFO派生クラスは、ICM42688FIFO バッファのセットアップと読み取りのサポートを提供することにより、 ICM42688基本クラスによって提供される機能を拡張します。 ICM42688クラスの一部として、上で説明したすべての関数は、 ICM42688FIFOクラスでも使用できます。
ICM42688FIFO(TwoWire &bus, uint8_t address) ICM42688FIFO オブジェクトは、I2C バスと ICM42688 I2C アドレスを指定して宣言する必要があります。 ICM42688 の I2C アドレスは、AD0 ピンが接地されている場合は 0x68、AD0 ピンが High にプルされている場合は 0x69 になります。たとえば、次のコードは、センサー アドレス 0x68 (AD0 接地) を持つ I2C バス 0 上に配置された ICM42688 センサーを備えたIMUと呼ばれる ICM42688FIFO オブジェクトを宣言します。
ICM42688FIFO IMU (Wire, 0x68 );
ICM42688FIFO(SPIClass &bus, uint8_t csPin, uint32_t SPI_HS_CLK=8000000) ICM42688FIFO オブジェクトは、使用する SPI バスとチップ セレクト ピンを指定して宣言する必要があります。複数の ICM42688 または他の SPI オブジェクトを同じ SPI バス上で使用でき、それぞれが独自のチップ選択ピンを備えています。チップ選択ピンには、使用可能な任意のデジタル ピンを使用できます。たとえば、次のコードは、チップ選択ピン 10 の SPI バス 0 上にある ICM42688 センサーを備えた、 IMUと呼ばれる ICM42688FIFO オブジェクトを宣言します。
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 方向のジャイロスコープ値を取得し、度/秒の単位で返します。データは、配列内の要素の数とともに配列として返されます。転送先のバッファにデータを保存するのに十分な容量があることを確認してください。
float gx[ 100 ];
size_t samples;
IMU.getFifoGyroX(&samples,gx);
void getFifoGyroY(size_t size,float data) は、データ バッファーから Y 方向のジャイロスコープ値を取得し、度/秒の単位で返します。データは、配列内の要素の数とともに配列として返されます。転送先のバッファにデータを保存するのに十分な容量があることを確認してください。
float gy[ 100 ];
size_t samples;
IMU.getFifoGyroY(&samples,gy);
void getFifoGyroZ(size_t size,float data) は、データ バッファーから Z 方向のジャイロスコープ値を取得し、度/秒の単位で返します。データは、配列内の要素の数とともに配列として返されます。転送先のバッファにデータを保存するのに十分な容量があることを確認してください。
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.3 V 電源でプルアップする必要があります。
ICM42688 ピンは次のように接続する必要があります。
Embedded Masters ブレークアウト ボードなど、一部のブレークアウト ボードでは、SPI を有効にするために若干の変更が必要です。ベンダーのドキュメントを参照してください。