K210项目实战(口罩检测系统和垃圾分类系统)

在前面我学习了使用K210训练模型做目标检测,然后也学会了使用K210做串口通信,学完之后我就把K210丢在箱子里吃灰了,因为学校疫情原因,两年一届的电赛很遗憾不能参加了,然后我就想拿他做个口罩检测系统(检测到没戴口罩可以语言提醒),这个真的好简单,哈哈哈,接下来加点难度,做个垃圾分类系统,半天就做好了。哈哈哈,希望想做这两个项目的各位看了这篇博客也能很快的做出来,加油。

基于K210的口罩检测系统

K210垃圾分类

文章目录

前言

做项目,参加比赛才能真正的学到东西,将理论应用于实践,一起加油,一起进步。

一、前提准备

1.32单片机(这里我使用的是zet6最小系统板和c8t6)
2.K210(什么型号都可以)
3.SYN6288语音播报模块
4.舵机
5.垃圾桶
Keil5软件和Maixpy软件

二、项目实战

1.口罩检测系统

1.模型

相信大家看完我的第一篇博客,口罩检测的模型已经训练出来了,大家按照我上一篇介绍的脱机运行烧录到自己的K210里,这时脱机检测就可以运行了。
如下图

K210项目实战(口罩检测系统和垃圾分类系统)

; 2.发送数据

如果大家还不会串口通信可以看我的博客,里面详细介绍了关于K210的串口通信部分,相信大家看完后就可以将masks,un_masks。数据发送到电脑上了。
如下图

K210项目实战(口罩检测系统和垃圾分类系统)
K210项目实战(口罩检测系统和垃圾分类系统)

3.SYN6288语音播报模块

这个便是这个项目第二个重要的部分了,通过单片机接收到数据,然后发送给语音播报模块,语音播报模块处理数据,播报出相应的语音。在这里因为只有两个标签,我没有处理字符串,直接用的接收到字符长度来判断的,所以我用了很短的时间就做出来了。
.c文件如下

#include "syn6288.h"
#include "usart.h"
#include "string.h"
#include "delay.h"

void SYN_FrameInfo(u8 Music, u8 *HZdata)
{

  unsigned  char  Frame_Info[50];
  unsigned  char  HZ_Length;
  unsigned  char  ecc  = 0;
  unsigned  int i = 0;
  HZ_Length = strlen((char*)HZdata);

  Frame_Info[0] = 0xFD ;
  Frame_Info[1] = 0x00 ;
  Frame_Info[2] = HZ_Length + 3;
  Frame_Info[3] = 0x01 ;
  Frame_Info[4] = 0x01 | Music << 4 ;

  for(i = 0; i < 5; i++)
  {
    ecc = ecc ^ (Frame_Info[i]);
  }

  for(i = 0; i < HZ_Length; i++)
  {
    ecc = ecc ^ (HZdata[i]);
  }

  memcpy(&Frame_Info[5], HZdata, HZ_Length);
  Frame_Info[5 + HZ_Length] = ecc;
  USART3_SendString(Frame_Info, 5 + HZ_Length + 1);
}

void YS_SYN_Set(u8 *Info_data)
{
  u8 Com_Len;
  Com_Len = strlen((char*)Info_data);
  USART3_SendString(Info_data, Com_Len);
}

不知道为什么从keil5粘贴过来变成了乱码,你粘贴到keil5是没有问题的
.h文件如下

#ifndef __SYN6288_H
#define __SYN6288_H

#include "sys.h"

void SYN_FrameInfo(u8 Music, u8 *HZdata);
void YS_SYN_Set(u8 *Info_data);

#endif

主函数部分如下

         if(len==6)
            {
                    TIM_SetCompare2(TIM4, 1910);
                    SYN_FrameInfo(0, "[v7][m1][t5]ÇëÄúÕýÈ·Åå´÷¿ÚÕÖ");
          delay_ms(8000);
              delay_ms(8000);
              delay_ms(8000);
                    delay_ms(8000);
                            TIM_SetCompare2(TIM4, 1850);
            }
                         if(len==5)
            {
                            TIM_SetCompare4(TIM4, 1930);
                    SYN_FrameInfo(0, "[v7][m1][t5]ÄúÒÑÅå´÷¿ÚÕÖ");
         delay_ms(8000);
              delay_ms(8000);
              delay_ms(8000);
                            delay_ms(2000);

到这里整个项目就算完成了,当你真正学会了K210之后你就会发现真的好简单。
完整的工程代码和K210代码需要的话可以在下面留下你的邮箱,我会发到你的邮箱里。
我也将完整的32代码和K210文件上传到了我的资源里,需要的也可以自行下载。

2.垃圾分类系统

1.模型

同样你需要做垃圾分类,你就要训练垃圾的模型,还需要不同种类,这里我放上标注好的图片链接,大家可以自行训练。(不会的可以看我主页链接)

链接:https://pan.baidu.com/s/1K6qbEQZ97PcyMWcgTCq1hw
提取码:qhnx
训练好之后,将模型烧录进sd卡,让K210进行脱机运行,检测一下垃圾模型是不是对的。
如下图

K210项目实战(口罩检测系统和垃圾分类系统)

; 2.串口通信数据处理部分

又到了串口通信部分,大家可以看我主页另外一篇博客,这里我不过多赘述了。和上面一样。

3.SYN6288语音播报模块

同上,代码如下
.c
(这里就是很简单的32定时器配置)

#include "timer.h"

u16 t=0;
void TIM2_Int_Init(u16 arr,u16 psc)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_TimeBaseStructure.TIM_Period = 999;
    TIM_TimeBaseStructure.TIM_Prescaler =71;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );

    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM2, DISABLE);
}

void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
            t++;
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );
        }
}

void TIM3_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA , ENABLE);

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);

    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);

    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);

    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_Cmd(TIM3, ENABLE);
}

void TIM4_PWM_Init(u16 arr,u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);

    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);

    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);

    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC4Init(TIM4, &TIM_OCInitStructure);

    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

    TIM_Cmd(TIM4, ENABLE);
}

.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM2_Int_Init(u16 arr,u16 psc);
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
void TIM3_Int_Init(u16 arr,u16 psc);
void TIM4_Int_Init(u16 arr,u16 psc);
void TIM4_PWM_Init(u16 arr,u16 psc);
#endif

主函数就是简单的PWM波这里就不过多赘述了。到这里垃圾分类也结束了,需要完整的工程文件可以在下面留下邮箱,大家一起学习。稍后我也会讲工程文件上传,需要的可自行下载。

总结

到这里这篇文章就结束了,学习了K210的模型训练与串口通信,搞了一下口罩检测系统和垃圾分类,做了两个小小的项目练了练手,感觉还不错,哈哈哈。这段时间正在做水果分拣车,等做完之后同样也会写一篇博客记录下来,加油。

Original: https://blog.csdn.net/qq_51963216/article/details/121109358
Author: 我与nano
Title: K210项目实战(口罩检测系统和垃圾分类系统)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/647796/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球