FastBond3挑战部分-基于XIAO-ESP32C3的智能识别故事机
该项目使用了XIAOESP32C3单片机,实现了通过视觉模块识别手势控制故事播放的设计,它的主要功能为:可以通过按键来控制故事的播放,也可以通过手势来控制故事播放。。
标签
单片机
FastBond第三季
XIAOESP32C3
秦月1
更新2024-10-28
92

一、项目和创意方向介绍

项目概述:

本项目旨在设计一款结合视觉识别与手势控制技术的创新故事播放系统。通过集成矽递科技的XIAO-ESP32C3单片机与Grove Vision AI v2视觉模块,该系统能够实现对用户手势的精准识别,并根据识别结果控制故事的播放。此外,系统还保留了传统的按键控制方式,以满足不同用户的使用习惯和需求。

创意方向:

本项目选择了“物联网与智能控制”的创意方向,并聚焦于“视觉识别与手势控制”的细分领域。通过引入先进的视觉识别技术,我们打破了传统按键控制的局限性,为用户提供了更加自然、直观且富有科技感的手势控制方式。同时,结合XIAO-ESP32C3单片机的低功耗、高性能特点,实现了系统的稳定运行与高效管理。

二、原理图及PCB介绍

设计思路:

通过Vision视觉模块来识别不同的手势,把识别到的数据发送给单片机,单片机对数据进行处理驱动OLED屏幕进行显示,语言模块进行故事播放,也支持按键控制故事播放

方案框图:

使用用VScode上的Draw.io.lntegration扩展绘制。

3054445f5bfd604bd313a70aa8ac6ad.png

电路原理图:

使用嘉立创EDA绘制,整体原理图如下

7b9a16bdae3b8da223fac16a80b235e.png

继电器电路

image.png

蜂鸣器电路

image.png

LED和按键电路

image.png

接口电路

image.pngimage.png

image.pngimage.pngimage.png

引脚扩展电路

image.png

本次项目中使用了指定厂商矽递科技(seeed studio)的XIAO-ESP32C3和莫仕(molex)公司的排针

PCB设计:

使用嘉立创EDA绘制。

image.png

三、成品功能测试

实物图:

45e9989c7742f2370ca7f327d2b52d7.jpg

按键和LED屏功能正常,通过按键控制视觉模块的开关

2e9a6f222d298b16fb18b7d286d2153.jpgd7ae702da3077e34c93cbeca7733eb3.jpg

四、程序说明

包含相关头文件,定义对应变量。

#include <Seeed_Arduino_SSCMA.h>  // 包含 Seeed Arduino SSCMA 库
#include "JQ.h"
#include "KEY.h"  
#include "OLED.h"
bool detect = false;
bool A = false;
bool one = false;
bool gesture = true;
int stone = 0;
SSCMA AI;  // 创建 SSCMA 类型的对象 AI
#define LED D2
unsigned long previousMillis = 0;  // 上一次计时的时间
unsigned long interval = 10;  // 时间间隔,1秒
int printCount_dog = 0;  // 已经打印的次数
int printCount_cat = 0;  // 已经打印的次数
int printCount_zero = 0;
const int targetCount = 20;  // 目标打印的次数

初始化外设

void setup()  
{
    AI.begin();  // 调用 AI 对象的 begin 方法进行初始化
    Serial.begin(9600);  // 初始化串口通信,波特率为 9600
    Init_OLED();
    pinMode(LED, OUTPUT);
    pinMode(D6 , OUTPUT); // 设置GPIO引脚为输出模式  
    pinMode(key1_pin, INPUT_PULLUP);  
    pinMode(key2_pin, INPUT_PULLUP);  
    pinMode(key3_pin, INPUT_PULLUP);  
    pinMode(key4_pin, INPUT_PULLUP);


}

通过循环检测按键

void loop()    
{  
    g_key = key_scan(0);  // 检测按键  
    switch (g_key) {  
        case KEY1_PRESS:  
            detect = !detect;
            if(detect){
              Serial.println("开启手势检测");  
              DisplayOpen();
              show_numberK();
              digitalWrite(LED,HIGH);
            } else{
              Serial.println("关闭手势检测");
              DisplayShut();
              show_numberG();
              digitalWrite(LED,LOW);
            }
             
            break;  
        case KEY2_PRESS:  
           // show_number1();  
           show_numberx(); //下一曲
            break;  
        case KEY3_PRESS:  
            //SendData(0x15);//清空数字
            show_numbery();//上一曲
            break;  
       case KEY4_PRESS:  
            A = !A;  
            if (A) {  
            SendData(0x12); // 播放暂停  
            } else {  
            SendData(0x11); // 播放继续  
           }
           break;  
    }  
     handleGestureDetection();
}

调用的函数

    void handleGestureDetection() {  
    if (detect && !AI.invoke()) {  
        int boxCount = AI.boxes().size();  
        Serial.print("启动摄像头识别");
        if (boxCount > 0) {  
            int target = AI.boxes()[0].target;  
            int score = AI.boxes()[0].score;  
            if (score > 80) {  
                if (target == 1) {  
                    handleTargetDog();  
                } else if (target == 2) {  
                  Serial.print("调用剪刀函数");
                    handleTargetCat();  
                } else if (target == 0) {  
                  Serial.print("调用布函数");
                    handleTargetZero();  
                }  
            }  
        }  
    }  
}
    void incrementAndCheckCount(int& count, int targetCount, const char* action, std::function<void()> mainAction, int threshold, std::function<void()> thresholdAction) {  
    count++;  
    if (count > targetCount) {  
        Serial.println(action);  
        mainAction();  
        count = 0;  
    } else if (count >= threshold) {  
        thresholdAction();  
    }  
}



void handleTargetDog() {  
    Serial.print("识别到拳头");
    printCount_dog++;
    incrementAndCheckCount(printCount_dog, targetCount, "下一曲", []() {  
        DisplayXyq();  
        show_numberx();  
        delay(2000);  
    }, 3, []() {  
        show_number1();  
        Serial.println("歌曲1");  
        DisplayQ();  
        //printCount_dog = 0;
    });  
}
void handleTargetCat() {  
        Serial.print("识别到剪刀");
    printCount_cat++;
    incrementAndCheckCount(printCount_cat, targetCount, "上一曲", []() {  
        DisplaySyq();
        show_numbery();  
        delay(2000);  
    }, 3, []() {  
        show_number2();  
        Serial.println("歌曲2");  
        DisplayJi();
        //printCount_cat = 0;
    });  
}  
void handleTargetZero() {  
         Serial.print("识别到布");
    printCount_zero++;
    incrementAndCheckCount(printCount_zero, targetCount, "关闭故事", []() {  
        DisplayT();
        digitalWrite(LED,LOW);
        SendData(0x13);  
        delay(2000);  
    }, 3, []() {  
        show_number3();  
        Serial.println("歌曲3");  
        DisplayB();
        //printCount_zero = 0;
    });  
}

五、活动总结

很感谢硬禾学堂举办的FastBond活动,给了我们一个很好的机会去实现自己的想法,通过这个活动也让我看见了很多自己的不足并加以改正。

附件下载
JQ8900.zip
ProPrj_基于XIAO-ESP32C3的智能故事机_2024-10-27.epro
团队介绍
单人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号