ESP32-S3 I2C驱动QMI8685姿态传感器
QMI8658是一款6轴/9轴惯性测量单元(IMU)传感器,支持±16g加速度计和±2000dps陀螺仪,适用于智能穿戴、VR/AR等应用。文章介绍了如何通过ESP32的I2C接口驱动QMI8658,包括I2C初始化、寄存器读写、传感器初始化以及加速度数据读取的实现方法。重点展示了使用ESP-IDF框架编写I2C驱动程序的过程,包括参数配置、设备安装和读写操作的具体代码实现,为开发基于ESP32和
·
一、QMI8658简介
QMI8658是由 Quaternion Microsystems(奇点微电子) 设计的一款 6轴或9轴惯性测量单元(IMU)传感器,集成了:
| 项目 | 说明 |
|---|---|
| 传感器类型 | 6轴(陀螺仪 + 加速度计)或 9轴(带外部磁力计) |
| 加速度计范围 | ±2g / ±4g / ±8g / ±16g |
| 陀螺仪范围 | ±125 / ±250 / ±500 / ±1000 / ±2000 dps |
| 输出数据速率(ODR) | 支持最高 1kHz(或更高) |
| 接口 | I²C / SPI |
| 嵌入式算法 | 支持姿态解算(四元数)、步数计数等 |
| 电源电压 | 通常是 1.8V 或 3.3V(取决于型号) |
| 封装尺寸 | 小型 LGA 封装,适合嵌入式设备 |
📦 常见应用:
-
智能穿戴设备(手环、手表)
-
移动设备(手机、平板)
-
姿态检测(VR/AR、遥控器、飞控)
-
步态识别、运动检测
-
智能音箱手势识别
ESP32-S3 + QMI8658 是一个非常流行的组合,适合做姿态识别、动作检测、IMU融合等项目。ESP32-S3 提供了 SPI 和 I2C 接口,可以与 QMI8658 灵活通信
二、ESP32 I2C 初始化(使用 ESP-IDF)
esp_err_t I2c_Init(void)
{
i2c_config_t i2c_conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = GPIO_NUM_1,
.scl_io_num = GPIO_NUM_2,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ,
};
esp_err_t err = i2c_param_config(BSP_I2C_NUM, &i2c_conf);
if (err != ESP_OK) {
ESP_LOGE("I2C", "i2c_param_config failed: %s", esp_err_to_name(err));
return err;
}
err = i2c_driver_install(BSP_I2C_NUM, I2C_MODE_MASTER, 0, 0, 0);
if (err != ESP_OK) {
ESP_LOGE("I2C", "i2c_driver_install failed: %s", esp_err_to_name(err));
}
return err;
}
三、I2C的读写函数
esp_err_t Qmi8685_Read_Reg(uint8_t reg_addr,uint8_t *data, size_t len)
{
return i2c_master_write_read_device(BSP_I2C_NUM,QMI8658_I2C_ADDR,®_addr,1,data,len,100/portTICK_PERIOD_MS);
}
esp_err_t Qmi8685_Write_reg(uint8_t reg_addr, uint8_t value)
{
uint8_t buf[2] = {reg_addr,value};
return i2c_master_write_to_device(BSP_I2C_NUM,QMI8658_I2C_ADDR,buf,2,100/portTICK_PERIOD_MS);
}
四、QMI8685初始化
void Qmi8685_Init(void)
{
uint8_t id = 0;
Qmi8685_Read_Reg(QMI8658_REG_CHIP_ID, &id, 1);
ESP_LOGI("QMI8658", "Chip ID: 0x%02X", id);
if (id != QMI8658_EXPECTED_ID) {
ESP_LOGE("QMI8658", "Chip ID mismatch");
return;
}
// Step 1: Soft Reset(可选)
Qmi8685_Write_reg(0x60, 0xb0);
vTaskDelay(pdMS_TO_TICKS(10));
Qmi8685_Write_reg(0x02, 0x40);
Qmi8685_Write_reg(0x08, 0x03);
Qmi8685_Write_reg(0x03, 0x95);
Qmi8685_Write_reg(0x04, 0xd5);
vTaskDelay(pdMS_TO_TICKS(20));
}
五、数据读取
该数据为传感器原始数据
void qmi8658_read_accel(int16_t *ax, int16_t *ay, int16_t *az)
{
uint16_t data[6];
esp_err_t ret = Qmi8685_Read_Reg(0x35, &data, 12);
if (ret != ESP_OK) {
ESP_LOGE("QMI8658", "Read accel failed: %s", esp_err_to_name(ret));
return;
}
*ax = (int16_t)((data[1] << 8) | data[0]);
*ay = (int16_t)((data[3] << 8) | data[2]);
*az = (int16_t)((data[5] << 8) | data[4]);
}
六、总结
通过本文的 学习可以掌握ESP32的I2C驱动以及QMI8685姿态传感器的使用。
更多推荐



所有评论(0)