https://github.com/davidliyutong/esp32_bno08x_driver
C idf-driver for BNO08X IMUs
https://github.com/davidliyutong/esp32_bno08x_driver
bno080 bno085 bno08x esp-idf esp32
Last synced: about 1 year ago
JSON representation
C idf-driver for BNO08X IMUs
- Host: GitHub
- URL: https://github.com/davidliyutong/esp32_bno08x_driver
- Owner: davidliyutong
- License: mit
- Created: 2024-07-15T08:46:37.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-07-30T08:53:53.000Z (almost 2 years ago)
- Last Synced: 2024-07-30T11:46:12.439Z (almost 2 years ago)
- Topics: bno080, bno085, bno08x, esp-idf, esp32
- Language: C
- Homepage:
- Size: 142 KB
- Stars: 1
- Watchers: 2
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ESP-IDF C BNO08x IMU Driver
This project is inspired by [myles-parfeniuk/esp32_BNO08x](https://github.com/myles-parfeniuk/esp32_BNO08x), a C++ BNO08x driver.
# Examples
Reading data via polling with `BNO08x_data_available()`:
```cpp
#include
#include "bno08x_driver.h"
void app_main(void)
{
BNO08x imu; // imu object handle
BNO08x_config_t cfg = DEFAULT_IMU_CONFIG; // default IMU config modifiable via idf.py menuconfig esp32_BNO08x
// initialize SPI peripheral and gpio
BNO08x_init(&imu, &cfg);
// initialize BNO08x
BNO08x_initialize(&imu);
// enable reports for any data we want to receive
BNO08x_enable_game_rotation_vector(&imu, 100000UL); // 100,000us == 100ms report interval
BNO08x_enable_gyro(&imu, 150000UL); // 150,000us == 150ms report interval
while (1)
{
//blocks until a valid packet is received or HOST_INT_TIMEOUT_MS occurs
if (BNO08x_data_available(&imu))
{
float x, y, z = 0;
// angular velocity (Rad/s)
x = BNO08x_get_gyro_calibrated_velocity_X(&imu);
y = BNO08x_get_gyro_calibrated_velocity_Y(&imu);
z = BNO08x_get_gyro_calibrated_velocity_Z(&imu);
ESP_LOGW("IMU_cb", "Angular Velocity: x: %.3f y: %.3f z: %.3f", x, y, z);
// absolute heading (degrees)
x = BNO08x_get_roll_deg(&imu);
y = BNO08x_get_pitch_deg(&imu);
z = BNO08x_get_yaw_deg(&imu);
ESP_LOGI("IMU_cb", "Euler Angle: x (roll): %.3f y (pitch): %.3f z (yaw): %.3f", x, y, z);
}
}
}
```
Reading data with an automatically invoked callback using `BNO08x_register_cb()`:
```cpp
#include
#include "bno08x_driver.h"
//imu data callback function, invoked whenever new data is arrived
void imu_data_cb(void *arg);
void app_main(void)
{
BNO08x imu; // imu object handle
BNO08x_config_t cfg = DEFAULT_IMU_CONFIG; // default IMU config modifiable via idf.py menuconfig esp32_BNO08x
// initialize SPI peripheral and gpio
BNO08x_init(&imu, &cfg);
// initialize BNO08x
BNO08x_initialize(&imu);
// register a callback to be executed when new data is available
BNO08x_register_cb(&imu, imu_data_cb);
// enable reports for any data we want to receive
BNO08x_enable_game_rotation_vector(&imu, 100000UL); // 100,000us == 100ms report interval
BNO08x_enable_gyro(&imu, 150000UL); // 150,000us == 150ms report interval
while (1)
{
// delay here is irrelevant, we just don't want cpu watchdog to trip
vTaskDelay(10000 / portTICK_PERIOD_MS);
}
}
void imu_data_cb(void *arg)
{
BNO08x *imu = (BNO08x *)arg; //void pointer should always be casted to BNO08x struct pointer
float x, y, z = 0;
//angular velocity (Rad/s)
x = BNO08x_get_gyro_calibrated_velocity_X(imu);
y = BNO08x_get_gyro_calibrated_velocity_Y(imu);
z = BNO08x_get_gyro_calibrated_velocity_Z(imu);
ESP_LOGW("IMU_cb", "Angular Velocity: x: %.3f y: %.3f z: %.3f", x, y, z);
//absolute heading (degrees)
x = BNO08x_get_roll_deg(imu);
y = BNO08x_get_pitch_deg(imu);
z = BNO08x_get_yaw_deg(imu);
ESP_LOGI("IMU_cb", "Euler Angle: x (roll): %.3f y (pitch): %.3f z (yaw): %.3f", x, y, z);
}
```