push_on_table

Example of the component espressif/bmi270_sensor v0.1.0
# BMI270 桌面前推检测示例

## 概述

本示例演示如何使用 BMI270 传感器进行桌面前推手势检测。

## 功能特点

- **多轴检测**:支持 X、Y、Z 三个前推方向
- **低功耗**:BMI270 INT 引脚触发 GPIO 中断,支持实现硬件级手势检测触发,连接 RTC GPIO 可实现 deepsleep 手势唤醒
- **实时处理**:低延迟手势识别响应
- **桌面优化**:专门针对桌面前推检测的配置

## 硬件要求

- ESP32 开发板:
  - ESP-SPOT-C5
  - ESP-SPOT-S3
  - ESP-ASTOM-S3
  - ESP-ECHOEAR-S3
  - 自定义开发板
- BMI270 传感器

## 配置说明

### Menuconfig 配置

1. **开发板选择**:
   ```
   Component config -> BMI270 Sensor -> Board Selection
   ```
   选择对应的开发板型号

2. **自定义引脚配置**:
   ```
   Component config -> BMI270 Sensor -> Custom Pin Configuration
   ```
   配置 I2C 和中断引脚:
   - I2C SCL Pin
   - I2C SDA Pin
   - INT Pin

### 代码配置

以下参数可在 `push_on_table_main.c` 中调整:

```c
// 推压检测灵敏度的高G阈值(针对桌面表面优化)
uint16_t high_g_threshold = 0x0800;  // 默认阈值

// 加速度计配置
config[BMI2_ACCEL].cfg.acc.odr = BMI2_ACC_ODR_200HZ;    // 200Hz 采样率
config[BMI2_ACCEL].cfg.acc.range = BMI2_ACC_RANGE_16G;  // ±16G 量程
config[BMI2_ACCEL].cfg.acc.bwp = BMI2_ACC_NORMAL_AVG4;  // 带宽参数
config[BMI2_ACCEL].cfg.acc.filter_perf = BMI2_PERF_OPT_MODE; // 滤波器性能

// 陀螺仪配置
config[BMI2_GYRO].cfg.gyr.odr = BMI2_GYR_ODR_200HZ;     // 200Hz 采样率
config[BMI2_GYRO].cfg.gyr.range = BMI2_GYR_RANGE_2000;   // ±2000dps 量程
config[BMI2_GYRO].cfg.gyr.bwp = BMI2_GYR_NORMAL_MODE;   // 带宽参数
config[BMI2_GYRO].cfg.gyr.noise_perf = BMI2_POWER_OPT_MODE; // 噪声性能
config[BMI2_GYRO].cfg.gyr.filter_perf = BMI2_PERF_OPT_MODE; // 滤波器性能
```

#### 配置函数

该示例包含两个专门针对桌面表面优化的函数:

**1. `adjust_high_g_threshold_for_on_table()`**
- **作用**:针对桌面表面检测优化高G阈值
- **功能**:设置高G阈值为 0x0800 以获得更敏感的检测
- **使用**:在初始化时调用以配置灵敏度
- **寄存器**:修改寄存器 0x30 的阈值值

**2. `adjust_high_g_axis_by_rolling()`**
- **作用**:根据滚动运动动态调整高G轴选择
- **功能**:分析滚动数据以确定最佳轴配置
- **使用**:检测到滚动中断时调用
- **逻辑**:
  - 从寄存器 0x1e 读取滚动轴数据
  - 临时禁用高G和推压功能
  - 更新寄存器 0x32 中的轴选择
  - 使用新轴配置重新启用功能

#### 可调参数

您可以根据不同的灵敏度需求修改这些函数:

```c
// 在 adjust_high_g_threshold_for_on_table() 中
uint16_t high_g_threshold = 0x0800;  // 调整灵敏度(更低 = 更敏感)

// 在 adjust_high_g_axis_by_rolling() 中
uint8_t select_x = 1;  // 启用/禁用 X 轴检测
uint8_t select_y = 1;  // 启用/禁用 Y 轴检测
uint8_t select_z = 1;  // 启用/禁用 Z 轴检测
```

## 使用方法

1. **编译和烧录**:
   ```bash
   idf.py build
   idf.py flash monitor
   ```

2. **运行测试**:
   - 将传感器放置在桌面表面
   - 在桌面上进行推压手势
   - 观察串口输出中的检测结果
   - 根据实际需要调整灵敏度

## 输出示例

```
I (1378) bmi270_api: BMI270 sensor created successfully
I (1388) MAIN: Push feature enabled, result: 0
I (1488) MAIN: Move the sensor to get push interrupt...
I (6198) MAIN: Push generated!
I (6198) MAIN: Push direction: +x
I (6198) MAIN: Waiting 3 seconds before next detection...
I (9198) MAIN: Ready for next push detection...
I (11008) MAIN: Push generated!
I (11008) MAIN: Push direction: -y
I (11008) MAIN: Waiting 3 seconds before next detection...
```

To create a project from this example, run:

idf.py create-project-from-example "espressif/bmi270_sensor=0.1.0:push_on_table"

or download archive (~9.37 KB)