一、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,&reg_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姿态传感器的使用。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐