前言
提示:项目准备需要一定的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
- 电源管理推荐使用传统的7.4V降压方案,如果使用了稳压管,注意元件方向。也推荐12V航模电池降压方案,这样提供c8t6和K210供电,也可以保证较好的稳定性。
- 在电路设计部分,为了实践一下低通滤波电路,光敏电阻的模拟量输出端加了一个无源低通滤波(精度要求不太高,用无源性价比更高),防止光照度急剧变化的时候,OLED屏幕数据出现异常值。
- 舵机控制模块,如果你使用的是蓝色的小型舵机,可以不用上拉电阻,因为它的扭矩比较小,需要的输入电流不需要太大,但是如果使用的是黑色金属外壳的舵机MG995,那么最好使用上拉电阻,利用电源供电提高输入电流,驱动大扭矩的舵机。
注意:关于tips中有关的问题可以浏览博主嘉立创工程
智能小车
总结
本次课程设计,使用到的内容基本是本科期间单片机应用,主要的问题还有通讯容易误码、算法识别效果不太好、PCB集成度不高显得很臃肿。对于推文有疑问或者需要这个工程,请联系QQ邮箱:207393236@qq.com。欢迎交流学习。