該函式庫與 InvensenseMPU-6500、InvenSense MPU-9250 和 MPU-9255 慣性測量單元 (IMU) 進行通訊。該庫與 Arduino 和 CMake 建置系統相容。
Invense MPU-6500是一款三軸陀螺儀和三軸加速度計。 InvenSense MPU-9250 是一款系統級封裝 (SiP),結合了兩個晶片:MPU-6500 三軸陀螺儀和三軸加速度計;和 AK8963 三軸磁力計。 MPU-6500 和 MPU-9250 支援 I2C(高達 400 kHz)和 SPI 通信,暫存器設定高達 1 MHz,資料讀取高達 20 MHz。提供以下選用滿量程感知器範圍:
陀螺儀滿量程範圍 | 加速度計滿量程範圍 | 磁力計滿量程(僅限 MPU-9250) |
---|---|---|
+/- 250 度/秒 | +/- 2克 | +/- 4800 UT |
+/- 500 度/秒 | +/- 4克 | |
+/- 1000 度/秒 | +/- 8克 | |
+/- 2000 度/秒 | +/- 16克 |
IMU 使用 16 位元類比數位轉換器對陀螺儀、加速度計和磁力計進行取樣。它還具有可編程數位濾波器、精密時鐘和嵌入式溫度感測器。
使用 Arduino 庫管理器安裝此程式庫或複製到 Arduino/libraries 資料夾。
對於 MPU-6500,該庫新增為:
# include " mpu6500.h "
對於 MPU-9250,該庫新增為:
# include " mpu9250.h "
範例 Arduino 可執行檔位於: examples/arduino/ 。 Teensy 3.x、4.x 和 LC 設備用於在 Arduino 下進行測試,該庫應與其他 Arduino 設備相容。
CMake 用於建立此庫,該庫匯出為名為invensense_imu 的庫目標。
對於 MPU-6500,該庫新增為:
# include " mpu6500.h "
對於 MPU-9250,該庫新增為:
# include " mpu9250.h "
該函式庫也可以使用建立建置目錄的 CMake 慣用法進行獨立編譯,然後從該目錄發出:
cmake .. -DMCU=MK66FX1M0
make
這將建立名為i2c_example 、 spi_example 、 drdy_spi_example和wom_example的庫和範例可執行檔(僅限 MPU-9250)。範例可執行原始檔位於Examples/cmake 。請注意, cmake指令包含一個定義,指定正在為其編譯程式碼的微控制器。這是正確配置程式碼、CPU 頻率和編譯/連結器選項所必需的。可用的 MCU 有:
眾所周知,它們可與 Teensy 產品中使用的相同軟體包一起使用。此外,眾所周知,只要只是更改包,切換包的效果就很好。
範例目標分別建立可執行文件,用於使用 I2C 或 SPI 通訊、使用資料就緒中斷以及使用運動喚醒中斷與感測器通訊。每個目標還有一個_hex ,用於建立要上傳到微控制器的十六進位文件,以及一個_upload ,用於使用 Teensy CLI 上傳器刷新 Teensy。請注意,有關設定建置環境的說明可以在我們的建置工具儲存庫中找到。
該庫位於名稱空間bfs內。
此類別提供了讀取和寫入這些感測器上的暫存器的方法。預計這至少適用於 MPU-6000、MPU-6050、MPU-6500、MPU-9150 和 MPU-9250;不過,它也可能適用於其他感測器。大多數用戶可能更喜歡下面的感測器特定類別;然而,此類可以使人們解鎖更多功能並用作自己的感測器驅動程式的起點。
InvensenseImu()預設建構函數,需要呼叫Config方法來設定 I2C 或 SPI 總線以及 I2C 位址或 SPI 片選引腳。
InvensenseImu(TwoWire *i2c, const uint8_t addr)建立一個 InvensenseImu 物件。此建構函數用於 I2C 通訊介面。指向 I2C 匯流排物件的指標與感測器的 I2C 位址一起傳遞。
InvensenseImu(SPIClass *bus, uint8_t cs)建立一個 InvensenseImu 物件。此建構函數用於SPI通訊介面。指向 SPI 總線物件的指標與感測器的片選引腳一起傳遞。任何支援數位 I/O 的引腳均可用作片選引腳。
void Config(TwoWire *bus, const uint8_t addr)使用預設建構子並設定 I2C 匯流排和 I2C 位址時需要此參數。
void Config(SPIClass *spi, const uint8_t cs)使用預設建構子並設定 SPI 總線和片選引腳時需要此參數。
void Begin()初始化與感測器的通訊。通訊匯流排不在該函式庫內初始化,必須單獨初始化;這增強了與同一總線上的其他感測器的兼容性。
bool WriteRegister(const uint8_t reg, const uint8_t data, const int32_t spi_clock)將暫存器資料寫入給定暫存器位址和資料的感測器。如果使用 SPI 通信,則必須指定 SPI 時脈速度。
bool WriteRegister(const uint8_t reg, const uint8_t data)使用 I2C 通訊時重載上述內容。
bool ReadRegisters(const uint8_t reg, const uint8_t count, const int32_t spi_clock, uint8_t * const data)根據給定的暫存器位址、要讀取的暫存器數量、SPI 時脈和用於儲存資料的指標,從感測器讀取資料暫存器。
bool ReadRegisters(const uint8_t reg, const uint8_t count, uint8_t * const data)使用 I2C 通訊時重載上述內容。
此類別適用於 MPU-9250 和 MPU-9255 IMU。
Mpu9250()預設建構函數,需要呼叫Config方法來設定 I2C 或 SPI 總線以及 I2C 位址或 SPI 片選引腳。
Mpu9250(i2c_t3 *bus, I2cAddr addr)建立 Mpu9250 物件。此建構函數用於 I2C 通訊介面。指向 I2C 匯流排物件的指標與感測器的 I2C 位址一起傳遞。如果 AD0 接腳接地,位址將為 I2C_ADDR_PRIM (0x68);如果 AD0 引腳拉高,則位址將為 I2C_ADDR_SEC (0x69)。
Mpu9250 mpu9250 (&Wire, bfs::Mpu9250::I2C_ADDR_PRIM);
Mpu9250(SPIClass *bus, uint8_t cs)建立 Mpu9250 物件。此建構函數用於SPI通訊介面。指向 SPI 總線物件的指標與感測器的片選引腳一起傳遞。任何支援數位 I/O 的引腳均可用作片選引腳。
Mpu9250 mpu9250 (&SPI, 2 );
void Config(TwoWire *bus, const I2cAddr addr)使用預設建構子並設定 I2C 匯流排和 I2C 位址時需要此參數。如果 AD0 接腳接地,位址將為 I2C_ADDR_PRIM (0x68);如果 AD0 引腳拉高,則位址將為 I2C_ADDR_SEC (0x69)。
void Config(SPIClass *spi, const uint8_t cs)使用預設建構子並設定 SPI 匯流排和片選腳時需要此參數。
bool Begin()初始化與感測器的通訊並配置預設感測器範圍、取樣率和低通濾波器設定。預設加速度計範圍為 +/- 16g,預設陀螺儀範圍為 +/- 2,000 deg/s。預設取樣率為 1000 Hz,低通濾波器設定為 184 Hz 截止頻率。如果能夠與感測器建立通訊並且配置成功完成,則傳回 True,否則傳回 false。通訊匯流排不在該函式庫內初始化,必須單獨初始化;這增強了與同一總線上的其他感測器的兼容性。
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu9250.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt()啟用資料就緒中斷。當 IMU 資料準備好時,MPU-9250 INT 引腳將觸發 50 us 中斷。此中斷高電平有效。如果中斷啟用成功,則此方法傳回 true,否則傳回 false。
bool status = mpu9250.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt()停用資料就緒中斷。如果中斷成功停用,則該方法傳回 true,否則傳回 false。
bool status = mpu9250.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range)設定加速度計滿量程範圍。選項有:
範圍 | 列舉值 |
---|---|
+/- 2克 | ACCEL_RANGE_2G |
+/- 4克 | ACCEL_RANGE_4G |
+/- 8克 | ACCEL_RANGE_8G |
+/- 16克 | ACCEL_RANGE_16G |
加速度計範圍設定成功則回傳True,否則回傳False。預設範圍為 +/-16g。
bool status = mpu9250.ConfigAccelRange(bfs::Mpu9250::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range()傳回目前加速度計範圍。
AccelRange range = mpu9250.accel_range();
bool ConfigGyroRange(const GyroRange range)設定陀螺儀滿量程範圍。選項有:
範圍 | 列舉值 |
---|---|
+/- 250 度/秒 | GYRO_RANGE_250DPS |
+/- 500 度/秒 | GYRO_RANGE_500DPS |
+/- 1000 度/秒 | GYRO_RANGE_1000DPS |
+/- 2000 度/秒 | GYRO_RANGE_2000DPS |
設定陀螺儀範圍成功則回傳True,否則回傳False。預設範圍為 +/-2000 度/秒。
bool status = mpu9250.ConfigGyroRange(bfs::Mpu9250::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range()傳回目前陀螺儀範圍。
GyroRange range = mpu9250.gyro_range();
bool ConfigSrd(const uint8_t srd)設定感測器採樣率分頻器。 MPU-9250 以 Hz 為單位對加速度計和陀螺儀進行取樣,定義如下:
srd設定為 0 表示 MPU-9250 以 1000 Hz 的頻率對加速度計和陀螺儀進行取樣。 srd設定為 4 會將取樣頻率設定為 200 Hz。 IMU 資料就緒中斷與取樣率分頻器定義的速率相關。磁力計以 100 Hz 取樣,取樣率分頻器值對應於 100 Hz 或更高。否則,磁力計將以 8 Hz 取樣。
成功設定取樣率分頻器則傳回 True,否則傳回 false。預設取樣率分頻器值為 0,即取樣率為 1000 Hz。
/* Set sample rate divider for 50 Hz */
bool status = mpu9250.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd()傳回目前取樣率分頻器值。
uint8_t srd = mpu9250.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf)設定加速度計、陀螺儀和溫度感測器的數位低通濾波器的截止頻率。可用頻寬有:
DLPF 頻寬 | 列舉值 |
---|---|
184赫茲 | DLPF_BANDWIDTH_184HZ |
92赫茲 | DLPF_BANDWIDTH_92HZ |
41赫茲 | DLPF_BANDWIDTH_41HZ |
20赫茲 | DLPF_BANDWIDTH_20HZ |
10赫茲 | DLPF_BANDWIDTH_10HZ |
5赫茲 | DLPF_BANDWIDTH_5HZ |
數位低通濾波器設定成功則傳回 True,否則傳回 false。預設頻寬為 184 Hz。
bool status = mpu9250.ConfigDlpfBandwidth(bfs::Mpu9250::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth()傳回目前數位低通濾波器頻寬設定。
DlpfBandwidth dlpf = mpu9250.dlpf_bandwidth();
bool EnableWom(int16_t Threshold_mg, const WomRate wom_rate)啟用運動喚醒中斷。它將 MPU-9250 置於低功耗狀態,並按照WomRate確定的時間間隔喚醒。如果加速度計偵測到運動超過閾值, threshold_mg ,它會從 MPU-9250 中斷引腳產生一個 50us 脈衝。支持以下列舉的 WOM 率:
口碑取樣率 | 列舉值 |
---|---|
0.24赫茲 | WOM_RATE_0_24HZ |
0.49赫茲 | WOM_RATE_0_49HZ |
0.98赫茲 | WOM_RATE_0_98HZ |
1.95赫茲 | WOM_RATE_1_95HZ |
3.91赫茲 | WOM_RATE_3_91HZ |
7.81赫茲 | WOM_RATE_7_81HZ |
15.63赫茲 | WOM_RATE_15_63HZ |
31.25赫茲 | WOM_RATE_31_25HZ |
62.50赫茲 | WOM_RATE_62_50HZ |
125赫茲 | WOM_RATE_125HZ |
250赫茲 | WOM_RATE_250HZ |
500赫茲 | WOM_RATE_500HZ |
運動閾值指定為 4 到 1020 mg 之間的值,該值在內部映射到單字節 1-255 值。如果成功啟用運動喚醒,此函數將傳回 true,否則傳回 false。請參閱wom_i2c範例。以下是使用 40 mg 閾值和 31.25 Hz ODR 啟用運動喚醒的範例。
imu.EnableWom( 40 , bfs::Mpu9250::WOM_RATE_31_25HZ);
void Reset()重設 MPU-9250。
bool Read()從 MPU-9250 讀取資料並將資料儲存在 Mpu9250 物件中。如果資料讀取成功則傳回 true,否則傳回 false。
/* Read the IMU data */
if (mpu9250.Read()) {
}
bool new_imu_data()如果從加速度計和陀螺儀傳回新數據,則傳回 true。
if (mpu9250.Read()) {
bool new_data = mpu9250. new_imu_data ();
}
bool new_mag_data()如果從磁力計傳回新數據,則傳回 true。對於 100 Hz 及更高的 MPU-9250 取樣率,磁力計以 100 Hz 取樣。對於低於 100 Hz 的 MPU-9250 取樣率,磁力計以 8 Hz 取樣,因此接收新的 IMU 資料而不是新的磁力計資料的情況並不少見。
if (mpu9250.Read()) {
bool new_mag = mpu9250. new_mag_data ();
}
float accel_x_mps2()傳回 Mpu9250 物件的 x 加速度計數據,單位為 m/s/s。對於 y 軸和 z 軸資料也存在類似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float ax = mpu9250. accel_x_mps2 ();
float ay = mpu9250. accel_y_mps2 ();
float az = mpu9250. accel_z_mps2 ();
}
float gyro_x_radps()傳回 Mpu9250 物件的 x 陀螺儀數據,單位為 rad/s。對於 y 軸和 z 軸資料也存在類似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float gx = mpu9250. gyro_x_radps ();
float gy = mpu9250. gyro_y_radps ();
float gz = mpu9250. gyro_z_radps ();
}
float mag_x_ut()傳回來自 Mpu9250 物件的 x 磁力計資料(以 uT 為單位)。對於 y 軸和 z 軸資料也存在類似的方法。
/* Read the IMU data */
if (mpu9250.Read()) {
float hx = mpu9250. mag_x_ut ();
float hy = mpu9250. mag_y_ut ();
float hz = mpu9250. mag_z_ut ();
}
float die_temp_c()傳回感測器的晶片溫度,單位為 C。
/* Read the IMU data */
if (mpu9250.Read()) {
float temp = mpu9250. die_temp_c ();
}
此類別與 MPU-6500 感測器配合使用。
Mpu6500()預設建構函數,需要呼叫Config方法來設定 I2C 或 SPI 總線以及 I2C 位址或 SPI 片選引腳。
Mpu6500(i2c_t3 *bus, I2cAddr addr)建立 Mpu6500 物件。此建構函數用於 I2C 通訊介面。指向 I2C 匯流排物件的指標與感測器的 I2C 位址一起傳遞。如果 AD0 接腳接地,位址將為 I2C_ADDR_PRIM (0x68);如果 AD0 引腳拉高,則位址將為 I2C_ADDR_SEC (0x69)。
Mpu6500 mpu6500 (&Wire, bfs::Mpu6500::I2C_ADDR_PRIM);
Mpu6500(SPIClass *bus, uint8_t cs)建立 Mpu6500 物件。此建構函數用於SPI通訊介面。指向 SPI 總線物件的指標與感測器的片選引腳一起傳遞。任何支援數位 I/O 的引腳均可用作片選引腳。
Mpu6500 mpu6500 (&SPI, 2 );
void Config(TwoWire *bus, const I2cAddr addr)使用預設建構子並設定 I2C 匯流排和 I2C 位址時需要此參數。如果 AD0 接腳接地,位址將為 I2C_ADDR_PRIM (0x68);如果 AD0 引腳拉高,則位址將為 I2C_ADDR_SEC (0x69)。
void Config(SPIClass *spi, const uint8_t cs)使用預設建構子並設定 SPI 匯流排和片選腳時需要此參數。
bool Begin()初始化與感測器的通訊並配置預設感測器範圍、取樣率和低通濾波器設定。預設加速度計範圍為 +/- 16g,預設陀螺儀範圍為 +/- 2,000 deg/s。預設取樣率為 1000 Hz,低通濾波器設定為 184 Hz 截止頻率。如果能夠與感測器建立通訊並且配置成功完成,則傳回 True,否則傳回 false。通訊匯流排不在該函式庫內初始化,必須單獨初始化;這增強了與同一總線上的其他感測器的兼容性。
Wire.begin();
Wire.setClock( 400000 );
bool status = mpu6500.Begin();
if (!status) {
// ERROR
}
bool EnableDrdyInt()啟用資料就緒中斷。當 IMU 資料準備好時,MPU-9250 INT 引腳將觸發 50 us 中斷。此中斷高電平有效。如果中斷啟用成功,則此方法傳回 true,否則傳回 false。
bool status = mpu6500.EnableDrdyInt();
if (!status) {
// ERROR
}
bool DisableDrdyInt()停用資料就緒中斷。如果中斷成功停用,則該方法傳回 true,否則傳回 false。
bool status = mpu6500.DisableDrdyInt();
if (!status) {
// ERROR
}
bool ConfigAccelRange(const AccelRange range)設定加速度計滿量程範圍。選項有:
範圍 | 列舉值 |
---|---|
+/- 2克 | ACCEL_RANGE_2G |
+/- 4克 | ACCEL_RANGE_4G |
+/- 8克 | ACCEL_RANGE_8G |
+/- 16克 | ACCEL_RANGE_16G |
加速度計範圍設定成功則回傳True,否則回傳False。預設範圍為 +/-16g。
bool status = mpu6500.ConfigAccelRange(bfs::Mpu6500::ACCEL_RANGE_4G);
if (!status) {
// ERROR
}
AccelRange accel_range()傳回目前加速度計範圍。
AccelRange range = mpu6500.accel_range();
bool ConfigGyroRange(const GyroRange range)設定陀螺儀滿量程範圍。選項有:
範圍 | 列舉值 |
---|---|
+/- 250 度/秒 | GYRO_RANGE_250DPS |
+/- 500 度/秒 | GYRO_RANGE_500DPS |
+/- 1000 度/秒 | GYRO_RANGE_1000DPS |
+/- 2000 度/秒 | GYRO_RANGE_2000DPS |
設定陀螺儀範圍成功則回傳True,否則回傳False。預設範圍為 +/-2000 度/秒。
bool status = mpu6500.ConfigGyroRange(bfs::Mpu6500::GYRO_RANGE_1000DPS);
if (!status) {
// ERROR
}
GyroRange gyro_range()傳回目前陀螺儀範圍。
GyroRange range = mpu6500.gyro_range();
bool ConfigSrd(const uint8_t srd)設定感測器採樣率分頻器。 MPU-9250 以 Hz 為單位對加速度計和陀螺儀進行取樣,定義如下:
srd設定為 0 表示 MPU-9250 以 1000 Hz 的頻率對加速度計和陀螺儀進行取樣。 srd設定為 4 會將取樣頻率設定為 200 Hz。 IMU 資料就緒中斷與取樣率分頻器定義的速率相關。磁力計以 100 Hz 取樣,取樣率分頻器值對應於 100 Hz 或更高。否則,磁力計將以 8 Hz 取樣。
成功設定取樣率分頻器則傳回 True,否則傳回 false。預設取樣率分頻器值為 0,即取樣率為 1000 Hz。
/* Set sample rate divider for 50 Hz */
bool status = mpu6500.sample_rate_divider( 19 );
if (!status) {
// ERROR
}
uint8_t srd()傳回目前取樣率分頻器值。
uint8_t srd = mpu6500.srd();
bool ConfigDlpfBandwidth(const DlpfBandwidth dlpf)設定加速度計、陀螺儀和溫度感測器的數位低通濾波器的截止頻率。可用頻寬有:
DLPF 頻寬 | 列舉值 |
---|---|
184赫茲 | DLPF_BANDWIDTH_184HZ |
92赫茲 | DLPF_BANDWIDTH_92HZ |
41赫茲 | DLPF_BANDWIDTH_41HZ |
20赫茲 | DLPF_BANDWIDTH_20HZ |
10赫茲 | DLPF_BANDWIDTH_10HZ |
5赫茲 | DLPF_BANDWIDTH_5HZ |
數位低通濾波器設定成功則傳回 True,否則傳回 false。預設頻寬為 184 Hz。
bool status = mpu6500.ConfigDlpfBandwidth(bfs::Mpu6500::DLPF_BANDWIDTH_20HZ);
if (!status) {
// ERROR
}
DlpfBandwidth dlpf_bandwidth()傳回目前數位低通濾波器頻寬設定。
DlpfBandwidth dlpf = mpu6500.dlpf_bandwidth();
bool Read()從 MPU-6500 讀取資料並將資料儲存在 Mpu6500 物件中。如果資料讀取成功則傳回 true,否則傳回 false。
/* Read the IMU data */
if (mpu6500.Read()) {
}
bool new_imu_data()如果從加速度計和陀螺儀傳回新數據,則傳回 true。
if (mpu6500.Read()) {
bool new_data = mpu6500. new_imu_data ();
}
float accel_x_mps2()傳回 Mpu6500 物件的 x 加速度計數據,單位為 m/s/s。對於 y 軸和 z 軸資料也存在類似的方法。
/* Read the IMU data */
if (mpu6500.Read()) {
float ax = mpu6500. accel_x_mps2 ();
float ay = mpu6500. accel_y_mps2 ();
float az = mpu6500. accel_z_mps2 ();
}
float gyro_x_radps()傳回 Mpu6500 物件的 x 陀螺儀數據,單位為 rad/s。對於 y 軸和 z 軸資料也存在類似的方法。
/* Read the IMU data */
if (mpu6500.Read()) {
float gx = mpu6500. gyro_x_radps ();
float gy = mpu6500. gyro_y_radps ();
float gz = mpu6500. gyro_z_radps ();
}
float die_temp_c()傳回感測器的晶片溫度,單位為 C。
/* Read the IMU data */
if (mpu6500.Read()) {
float temp = mpu6500. die_temp_c ();
}
該庫在返回之前將所有資料轉換為公共軸系統。此軸系統如下所示。它是 Z 軸正向下的右手座標系,在飛機動力學中很常見。
警告!此軸系統是相對於 MPU-6500 和 MPU-9250 感測器顯示的。感測器可以相對於分線板旋轉。