zsy-s 发表于 2024-11-8 14:17

【2024 DigiKey创意大赛】+ 体感控制小游戏的实现

本帖最后由 zsy-s 于 2024-11-26 11:00 编辑

# 前言
本设计只要是实现了通过传感器,实现对被控物的移动,实现体感小游戏的小设计。
时间紧迫,原先设计的许多细节不实现了,最先最简单的被控物移动。
本项目基于官方例程 usb_keyboard 修改。
使用了两个模块:ESP32-S3-LCD-EV-Board和 ICM-20948
# 结构设计


## ESP32-S3-LCD-EV-Board
ESP32-S3-LCD-EV-Board搭载了ESP32-S3-WROOM-1模组,该模组内置ESP32-S3系列芯片,配备了一块GC9503CV LCD触摸屏,支持480x480分辨率,显示效果清晰。同时,它采用了FT5x06触摸屏驱动,确保触摸操作的准确性和响应速度。这样的配置使得用户可以通过触摸方式与开发板进行交互,ESP32-S3-LCD-EV-Board以其强大的核心性能、清晰的显示效果、准确的触摸操作、丰富的扩展接口以及详细的文档和例程等优点,成为了一款备受关注的屏幕交互开发板。它适用于物联网应用、AIoT领域的多种应用场景以及智能家居控制等领域,是开发者和工程师们进行项目开发的得力助手。
## ICM-20948
ICM-20948是一款备受好评的高性能九轴运动传感器,集成了3轴陀螺仪、3轴加速度计、3轴磁力计以及数字运动处理器(DMP),使得这款传感器能够同时监测设备的旋转、加速度以及磁场信息,非常适合用于姿态检测、运动跟踪等应用场景。支持I2C和SPI通信接口,这两种接口都是常用的微控制器通信协议,使得传感器与微控制器的连接更加便捷。ICM-20948的低功耗和高精度特性使其成为物联网应用中的理想选择。例如,在智能家居系统中,可以利用该传感器监测门窗的开关状态、人体的运动状态等。是一款性能卓越、功能强大的九轴运动传感器。其低功耗、高精度、封装小巧以及完善的驱动支持等特点,使得它在物联网应用、可穿戴设备、无人机与机器人等领域具有广泛的应用前景。对于需要精确运动检测的开发者来说,ICM-20948无疑是一个值得考虑的选择。


# 代码讲解
功能简单,从大佬 alanlan86 借了一些代码,计算出来航向角的值。
得到传感器的方向角
```c

void
icm_read_task(void *args)
{
        esp_err_t ret = icm20948_configure(ACCE_FS_2G, GYRO_FS_1000DPS);
        if (ret != ESP_OK) {
                ESP_LOGE(TAG, "ICM configuration failure");
                vTaskDelete(NULL);
        }
        ESP_LOGI(TAG, "ICM20948 configuration successfull!");

        icm20948_acce_value_t acce;
        icm20948_gyro_value_t gyro;
        icm20948_temp_value_tttmp;
        icm20948_Drec_t *ffff ;
        while(1) {
                ret = icm20948_get_acce(icm20948, &acce);
                if (ret == ESP_OK){
                        //ESP_LOGI(TAG, "ax: %lf ay: %lf az: %lf", acce.acce_x, acce.acce_y, acce.acce_z);
                }
                ret = icm20948_get_gyro(icm20948, &gyro);
                if (ret == ESP_OK){
                        //ESP_LOGI(TAG, "gx: %lf gy: %lf gz: %lf", gyro.gyro_x, gyro.gyro_y, gyro.gyro_z);
                }

                icm20948_get_Temp(icm20948, &ttmp);
                if (ret == ESP_OK){
                        //ESP_LOGI(TAG, "temp: %lf",ttmp.temp);
                }

                ffff = getxAngle(acce.acce_x_r,acce.acce_y_r,acce.acce_z_r,gyro.gyro_y);
        //        ESP_LOGI(TAG, "getxAngle: %d : %d",ffff->xxx,ffff->yyy);
                while(((ffff->xxx != 1) && (ffff->xxx != 0)) && ((ffff->yyy != 1) && (ffff->yyy != 0))){
                        ffff->xxx = ffff->xxx/2;
                        ffff->yyy = ffff->yyy/2;
                }
                xxCnt = ffff->xxx;
                yyCnt = ffff->yyy;
                ESP_LOGI(TAG, "------getxAngle: %d : %d",xxCnt,yyCnt);

                vTaskDelay(10 / portTICK_PERIOD_MS);
        }

        vTaskDelete(NULL);
}

```
移动被控物的代码,通过传感器得到移动方向
```c
void MoveMan()
{
        ESP_LOGI(TAG, "--------xxCnt[%d]------yyCnt[%d]----------",xxCnt,yyCnt);
        lv_coord_t xx = lv_obj_get_x(objMan);
        lv_coord_t yy = lv_obj_get_y(objMan);
        if((xxCnt == 0) && (yyCnt == 0)) return;
        //lv_style_set_translate_y(&styleMan, -20); //Translation
        if(xxCnt < 0){
                //xx += -1;
                xx = xx <= -4? -1:xx-1;
                xxCnt++;
        }else if(xxCnt == 0){
               
        }else{
                xx = 470 < xx? 468:xx+1;
                xx += 1;
                xxCnt--;
        }

        if(yyCnt < 0){
                //yy += -1;
                yy = yy < -4? -1:yy-1;
                yyCnt++;
        }else if(yyCnt == 0){
               
        }else{
                //yy += 1;
                yy = 470 < yy? 468:yy+1;
                yyCnt--;
        }
        //ESP_LOGI(TAG, "---move-----x[%d]------y[%d]----------",xx,yy);
        lv_obj_set_pos(objMan, xx, yy);
}
```

循环刷新 ui上被控物
```c
    while (1) {
          //ESP_LOGI(TAG, "------------------------");
      //vTaskDelay(pdMS_TO_TICKS(1));
                MoveMan();
    }
```

# 疑难问题
了解了一个新的知识点: 卡尔曼滤波器
十分遗憾,真看不明白,数学知识忘光光了。
相关文档:[卡尔曼滤波:从入门到精通](https://zhuanlan.zhihu.com/p/36745755 "卡尔曼滤波:从入门到精通")
        esp32 项目添加一个自定义的模块操作:
        开始是加到了managed_components文件夹中,按照官方文件添加了 cmakelsit和kconfig文件。
        但是通过idf menuconfig 找不到自定义的组件。
        后来查看项目路径,发现managed_components是有配置,编译脚本自动创建的受管理的组件。
        自定义组件需要新建文件夹 components, 就能找到了。
       
       
# 代码/手册/文档





# 演示视频
19b25d397f73670e55c4c5e4d3c932c7<br/>

# 项目总结
非常感谢eeworld的活动,有幸参数本次活动。非常抱歉,由于时间紧张,项目没有完全实现功能设计。代码编写过程中确实学到了很多新东西。一个简单的陀螺仪,会有如此多的细节需要考虑。esp32项目结构有很多细节需要继续研究。
总之,下次会留出足够时间去实现设想,研究的深一点,细一点,再次感谢eeworld。

wangerxian 发表于 2024-11-8 15:33

<p>可以做一个贪吃蛇的小游戏。</p>

hellokitty_bean 发表于 2024-11-8 20:06

<p>有点小意思。。。。。。。。。。。。。。还可以做更多吗。。。<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/loveliness.gif" width="48" /></p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【2024 DigiKey创意大赛】+ 体感控制小游戏的实现