课程设计之基于K210人脸识别的简易门禁系统设计


前言

提示:项目准备需要一定的C语言基础或python语言基础,C语言方面大致就是能自己写出驱动文件和主程序,看得懂代码大致怎么运行的就可以了。

写这一篇推文的主要目的是记录课程设计的历程和一些想法,中间有博主遇到的常见问题,例如K210TKA2140001的固件烧录问题、stm32f103c8t6与K210双机通讯逻辑问题等等,以时间顺序简述遇到的坑和解决方法,以供UU们参考。

此为总体架构图。
总体架构图


一、设计核心思路和可行性分析

首先,博主是光电相关专业的,为了更好地提高选题和课程内容的契合度,选择了人脸识别的一个大方向(本文仅仅是很基础的入门级人脸识别应用场景介绍),考虑到资金有限,市面上的openMV价格近两三年走高,朋友推荐K210这款个人觉得目前更实惠的识别硬件。此外,为了提高课设的竞争力,加入一些单片机课程学习到的内容,比如舵机驱动、串口通讯等;实用性方面,根据市面上已有的门禁系统方案,增加语音提示、红外热释电检测人体的模块。

为了防止代码编写过程中出现逻辑混淆的情况,自行绘制识别的流程图。
人脸识别流程图

二、设计流程及各要点简介

1.K210TKA2140001的固件烧录与识别代码调试

花了上百大洋,拿到了K210实物(实物不在身边,图片自行百度),下面开始烧录固件,等于给这个东西烧程序(类似单片机程序的烧录),不过这里烧录的是更底层的类似于运行环境的代码。之后使用IDE编程的时候,库的引用才不会报错。(所以import报错还可以检查检查固件型号对不对)。
这里需要注意,博主没有尝试自己写IDE软件,因为需要适配各种协议,比较花费时间,下面使用的官方发布的IDE软件,其中的调试和初始化步骤,官网都有详细介绍。
maixpy3.0

烧录方面,博主遇到的问题是数据线的种类不对,Type-C数据线一部分是仅具有充电功能,一部分既具有充电功能,又具有数据传输功能。选择的时候需要自行甄别。
kflash烧录指导

根据扩展功能固件库的不同,K210可以被赋予各种基础功能。识别部分代码可以直接使用官方推荐,也可以参考另一位博主。
基于K210的人脸识别门禁
这里需要注意的是,在官方代码的基础上适配项目的时候,必须知道变量含义,方便通讯。这里使用串口通讯,传输仅标记识别成功(1)和识别失败(0)。使用串口发送信息的时候,可以自行定义一段帧头检验,或者利用高速处理的性能,以某一识别成功次数作为触发阈值,在此基础上可以自行编码。

2.控制部分

重点介绍main函数的逻辑处理:

int main(void)
{
	// 底层延时函数初始化
	delay_init();	
	
	// 72MHz分频初始化
	RCC_Configuration();
  	USART_Config();
	audio_init();
	NVIC_Configuration();
	TIM3_Init(2000, 719);
	Adc_Init();
	Do_GPIO_Config();
	OLED_Init();
	LED_Init();
	printf("欢迎使用智能门禁系统\n\n\n\n");
	OLED_ShowString(1,1," ADC value:");	
	voice1();
  /* 打印指令输入提示信息 */
    Show_Message();
	dj(500);
  while(1)
	{	
		// 读取单片机电压值并用OLED显示
		ADC_ConvertedValueLocal=Get_battery_volt();
    OLED_ShowFNum(2,8,ADC_ConvertedValueLocal);	
		if (Serial_RxFlag1 == 1)
		{

			if (Serial_RxData1 == '1')
			{
				OLED_ShowString(3,1,"               ");	
				OLED_ShowString(3,1,"success!");	
				dj(500);
				voice2(); // 识别成功请进入
			}
			else if (Serial_RxData1 == '2')
			{
				OLED_ShowString(3,1,"               ");	
				OLED_ShowString(3,1,"error!");	
				voice3(); // 识别错误请重试
			}
			else
			{
				OLED_ShowString(3,1,"               ");	
				OLED_ShowString(3,1,"unexpected E");	
			}
			OLED_ShowString(4,1,"               ");
			OLED_ShowChar(4,5,Serial_RxData1);	
			Serial_RxFlag1 = 0;  // 一次操作结束,标志位清零
		} 
		if(Do_Scan(DO_GPIO_PORT, DO_GPIO_PIN) == 1)
		{
			OLED_ShowString(2,2,"true");
			// 开灯
			LED_ON();
		}
		else
		{
			OLED_ShowString(2,2,"false");
			// 关灯
			LED_OFF();
		}
	}	
}

注意:灯的打开与否通过红外热释电模块控制,以提高用户使用和离开的交互性;语音交互实际上使用的是串口与语音模块的通信;c8t6与K210的通信也是通过串口进行的;舵机的转动模拟开门的场景。


tips

  1. 电源管理推荐使用传统的7.4V降压方案,如果使用了稳压管,注意元件方向。也推荐12V航模电池降压方案,这样提供c8t6和K210供电,也可以保证较好的稳定性。
  2. 在电路设计部分,为了实践一下低通滤波电路,光敏电阻的模拟量输出端加了一个无源低通滤波(精度要求不太高,用无源性价比更高),防止光照度急剧变化的时候,OLED屏幕数据出现异常值。
  3. 舵机控制模块,如果你使用的是蓝色的小型舵机,可以不用上拉电阻,因为它的扭矩比较小,需要的输入电流不需要太大,但是如果使用的是黑色金属外壳的舵机MG995,那么最好使用上拉电阻,利用电源供电提高输入电流,驱动大扭矩的舵机。
    注意:关于tips中有关的问题可以浏览博主嘉立创工程
    智能小车

总结

本次课程设计,使用到的内容基本是本科期间单片机应用,主要的问题还有通讯容易误码、算法识别效果不太好、PCB集成度不高显得很臃肿。对于推文有疑问或者需要这个工程,请联系QQ邮箱:207393236@qq.com。欢迎交流学习。

  • 23
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值