0


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

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

基于K210的口罩检测系统

K210垃圾分类

文章目录

前言

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

一、前提准备

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

二、项目实战

1.口罩检测系统

1.模型

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

2.发送数据

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

3.SYN6288语音播报模块

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

  1. #include"syn6288.h"#include"usart.h"#include"string.h"#include"delay.h"//Music:Ñ¡Ôñ±³¾°ÒôÀÖ¡£0:ÎÞ±³¾°ÒôÀÖ£¬1~15£ºÑ¡Ôñ±³¾°ÒôÀÖvoidSYN_FrameInfo(u8 Music, u8 *HZdata){/****************ÐèÒª·¢Ë͵ÄÎı¾**********************************/unsignedchar Frame_Info[50];unsignedchar HZ_Length;unsignedchar ecc =0;//¶¨ÒåУÑé×Ö½Úunsignedint i =0;
  2. HZ_Length =strlen((char*)HZdata);//ÐèÒª·¢ËÍÎı¾µÄ³¤¶È/*****************Ö¡¹Ì¶¨ÅäÖÃÐÅÏ¢**************************************/
  3. Frame_Info[0]=0xFD;//¹¹ÔìÖ¡Í·FD
  4. Frame_Info[1]=0x00;//¹¹ÔìÊý¾ÝÇø³¤¶ÈµÄ¸ß×Ö½Ú
  5. Frame_Info[2]= HZ_Length +3;//¹¹ÔìÊý¾ÝÇø³¤¶ÈµÄµÍ×Ö½Ú
  6. Frame_Info[3]=0x01;//¹¹ÔìÃüÁî×Ö£ººÏ³É²¥·ÅÃüÁî
  7. Frame_Info[4]=0x01| Music <<4;//¹¹ÔìÃüÁî²ÎÊý£º±³¾°ÒôÀÖÉ趨/*******************УÑéÂë¼ÆËã***************************************/for(i =0; i <5; i++)//ÒÀ´Î·¢Ë͹¹ÔìºÃµÄ5¸öÖ¡Í·×Ö½Ú{
  8. ecc = ecc ^(Frame_Info[i]);//¶Ô·¢Ë͵Ä×Ö½Ú½øÐÐÒì»òУÑé}for(i =0; i < HZ_Length; i++)//ÒÀ´Î·¢ËÍ´ýºÏ³ÉµÄÎı¾Êý¾Ý{
  9. ecc = ecc ^(HZdata[i]);//¶Ô·¢Ë͵Ä×Ö½Ú½øÐÐÒì»òУÑé}/*******************·¢ËÍÖ¡ÐÅÏ¢***************************************/memcpy(&Frame_Info[5], HZdata, HZ_Length);
  10. Frame_Info[5+ HZ_Length]= ecc;USART3_SendString(Frame_Info,5+ HZ_Length +1);}/***********************************************************
  11. * Ãû ³Æ£º YS_SYN_Set(u8 *Info_data)
  12. * ¹¦ ÄÜ£º Ö÷º¯Êý ³ÌÐòÈë¿Ú
  13. * Èë¿Ú²ÎÊý£º *Info_data:¹Ì¶¨µÄÅäÖÃÐÅÏ¢±äÁ¿
  14. * ³ö¿Ú²ÎÊý£º
  15. * ˵ Ã÷£º±¾º¯ÊýÓÃÓÚÅäÖã¬Í£Ö¹ºÏ³É¡¢ÔÝÍ£ºÏ³ÉµÈÉèÖà £¬Ä¬Èϲ¨ÌØÂÊ9600bps¡£
  16. * µ÷Ó÷½·¨£ºÍ¨¹ýµ÷ÓÃÒѾ­¶¨ÒåµÄÏà¹ØÊý×é½øÐÐÅäÖá£
  17. **********************************************************/voidYS_SYN_Set(u8 *Info_data){
  18. u8 Com_Len;
  19. Com_Len =strlen((char*)Info_data);USART3_SendString(Info_data, Com_Len);}

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

  1. #ifndef__SYN6288_H#define__SYN6288_H#include"sys.h"voidSYN_FrameInfo(u8 Music, u8 *HZdata);voidYS_SYN_Set(u8 *Info_data);#endif

主函数部分如下

  1. 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进行脱机运行,检测一下垃圾模型是不是对的。
如下图
请添加图片描述

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

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

3.SYN6288语音播报模块

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

  1. #include"timer.h"
  2. u16 t=0;voidTIM2_Int_Init(u16 arr,u16 psc){
  3. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  4. NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//ʱÖÓʹÄÜ//¶¨Ê±Æ÷TIM3³õʼ»¯
  5. TIM_TimeBaseStructure.TIM_Period =999;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
  6. TIM_TimeBaseStructure.TIM_Prescaler =71;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
  7. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
  8. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIMÏòÉϼÆÊýģʽTIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );//ʹÄÜÖ¸¶¨µÄTIM3ÖжÏ,ÔÊÐí¸üÐÂÖжÏ//ÖжÏÓÅÏȼ¶NVICÉèÖÃ
  9. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM3ÖжÏ
  10. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;//ÏÈÕ¼ÓÅÏȼ¶0¼¶
  11. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;//´ÓÓÅÏȼ¶3¼¶
  12. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQͨµÀ±»Ê¹ÄÜNVIC_Init(&NVIC_InitStructure);//³õʼ»¯NVIC¼Ä´æÆ÷TIM_Cmd(TIM2, DISABLE);//ʹÄÜTIMx //ÏÈ¹Ø±Õ }//¶¨Ê±Æ÷3ÖжϷþÎñ³ÌÐòvoidTIM2_IRQHandler(void)//TIM3ÖжÏ{if(TIM_GetITStatus(TIM2, TIM_IT_Update)!= RESET)//¼ì²éTIM3¸üÐÂÖжϷ¢ÉúÓë·ñ{
  13. t++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update );//Çå³ýTIMx¸üÐÂÖжϱêÖ¾ }}voidTIM3_PWM_Init(u16 arr,u16 psc)//¶à·¶æ»ú¿ØÖÆ£¬¶¨Òå¶ÔÓ¦Òý½Å£¬Ê¹ÄÜÏàӦͨµÀ£¬Ö÷º¯ÊýͬÑùÐèҪʹÄÜÏàӦͨµÀ{
  14. GPIO_InitTypeDef GPIO_InitStructure;
  15. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  16. TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//ʹÄܶ¨Ê±Æ÷3ʱÖÓRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA , ENABLE);//ʹÄÜGPIOÍâÉèºÍAFIO¸´Óù¦ÄÜÄ£¿éʱÖÓ//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3²¿·ÖÖØÓ³Éä TIM3_CH2->PB5 //ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM3 CH2µÄPWMÂö³å²¨ÐÎ GPIOB.5
  17. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//ÉèÖÃΪ¸´ÓÃÍÆÍìÊä³ö
  18. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
  19. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);
  20. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  21. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
  22. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//³õʼ»¯TIM3
  23. TIM_TimeBaseStructure.TIM_Period = arr;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
  24. TIM_TimeBaseStructure.TIM_Prescaler =psc;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
  25. TIM_TimeBaseStructure.TIM_ClockDivision =0;//ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
  26. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIMÏòÉϼÆÊýģʽTIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»//³õʼ»¯TIM3 Channel2 PWMģʽ
  27. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  28. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  29. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC1Init(TIM3,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  30. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  31. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  32. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC2Init(TIM3,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  33. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  34. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  35. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC3Init(TIM3,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  36. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  37. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  38. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC4Init(TIM3,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷TIM_Cmd(TIM3, ENABLE);//ʹÄÜTIM3}voidTIM4_PWM_Init(u16 arr,u16 psc){
  39. GPIO_InitTypeDef GPIO_InitStructure;
  40. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  41. TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//ʹÄܶ¨Ê±Æ÷3ʱÖÓRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//ʹÄÜGPIOÍâÉèºÍAFIO¸´Óù¦ÄÜÄ£¿éʱÖÓ//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3²¿·ÖÖØÓ³Éä TIM3_CH2->PB5 //ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM3 CH2µÄPWMÂö³å²¨ÐÎ GPIOB.5
  42. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//ÉèÖÃΪ¸´ÓÃÍÆÍìÊä³ö
  43. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  44. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//³õʼ»¯TIM3
  45. TIM_TimeBaseStructure.TIM_Period = arr;//ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ
  46. TIM_TimeBaseStructure.TIM_Prescaler =psc;//ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
  47. TIM_TimeBaseStructure.TIM_ClockDivision =0;//ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
  48. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIMÏòÉϼÆÊýģʽTIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»//³õʼ»¯TIM3 Channel2 PWMģʽ
  49. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  50. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  51. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC1Init(TIM4,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  52. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  53. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  54. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC2Init(TIM4,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  55. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  56. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  57. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC3Init(TIM4,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷
  58. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;//Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2
  59. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ
  60. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ßTIM_OC4Init(TIM4,&TIM_OCInitStructure);//¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM3 OC2TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//ʹÄÜTIM3ÔÚCCR2ÉϵÄԤװÔؼĴæÆ÷TIM_Cmd(TIM4, ENABLE);//ʹÄÜTIM3}

.h

  1. #ifndef__TIMER_H#define__TIMER_H#include"sys.h"voidTIM2_Int_Init(u16 arr,u16 psc);voidTIM3_Int_Init(u16 arr,u16 psc);voidTIM3_PWM_Init(u16 arr,u16 psc);voidTIM3_Int_Init(u16 arr,u16 psc);voidTIM4_Int_Init(u16 arr,u16 psc);voidTIM4_PWM_Init(u16 arr,u16 psc);#endif

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

总结

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


本文转载自: https://blog.csdn.net/qq_51963216/article/details/121109358
版权归原作者 我与nano 所有, 如有侵权,请联系我们删除。

“K210项目实战(口罩检测系统和垃圾分类系统)”的评论:

还没有评论