目录
1.1MG200指纹模块介绍
MG200是一种高性能的指纹模块,具有可靠、安全、易集成等特点。它采用高精度光学指纹模组,并集成了先进的指纹识别算法,可以快速、准确地识别指纹信息。同时,它支持RS232/485、USB、Wiegand等多种通讯方式,可以广泛应用于门禁、考勤、安防等领域。此外,MG200指纹模块还具有防伪功能,支持对指纹图像的加密和解密,有效防止指纹被破解和盗用。
1.2MG200的具体介绍
MG200指纹模块(指纹模块传感器)
*指纹分为光学式和电容式,MG200为电容式指纹(内置算法,管理模式,数据库,串口)
*管理程序的通信接口由若干指令组合而成,模块的每个功能由主控单元MCU(或上位机) 发送独立的指令来执行
*执行状态通过串口反馈给主控单元MCU进行逻辑交互。通过合理的组合使用接口指令,如何实现功能逻辑则完全由主控单元MCU(或上位机)决定
*MCU负责发送指令(实现功能)和接收反馈(工作状态、结果)
*MCU通过USART6与MG200通信
*USART6_TX --- PC6 --- 复用模式---MG200_RX
*USART6_RX --- PC7 --- 复用模式---MG200_TX
*MCU与指纹模块的通信通过发送命令数据包然后接收MG200返回应答数据包的形式
*指纹模块的 UART 串口不能同时进行收发动作 (Half-Duplex 通信)
1.3MG200的内部工作过程
MCU 主控单元向指纹识别模块发送指纹采集及特征量提取的指令。指纹模块接收到该指令后,通过指纹传感器采集指纹并对图像质量进行判断。 若指纹图像不正常(图像质量差)时,模块将评价结果发送给 MCU 主控单元。若指纹图像正常时,模块对图像进行特征点提取,并将比对成功与否的结果通知发送 至 MCU 主控单元。
首先就是提取指纹保存在数据库里,然后我们再重新录入指纹与数据库的指纹进行对比,如何与门锁模块与语言模块以及其他模块联合使用。
通过MG200_PWR管脚来给指纹模块上电,通过MG200_DETECT来检测模块有没有手指按下首先就是管脚和串口的初始化,这个不同的单片机初初始化代码不一样。作者使用的单片机是STM32F401RET6。
1.4 MG200发送指令
*指纹模块通过采集的指纹图像特征点与已存指纹的数据库进行对比
*发送数据包格式:起始码(0x6c)+Checksum(校验和)+发送地址(0x63) + 接收地址(0x62) +
指令码(cmd) + 参数(parameter) + 预留(0x00)(共7字节)
*接收数据包格式:起始码(0x6c)+Checksum(校验和)+发送地址(0x62) + 接收地址(0x62) +
应答码(cmd) +返回值(result)+ 参数(parameter) + 预留(0x00)(共8字节)
* Mg200_RecData(u8 cmd,u8 *result,u8 *parameter)---接收MG200的应答数据包
通过判断数据包的Checksum(校验和)+发送地址(0x62) + 接收地址(0x62) + + 预留(0x00)+起始位
看通信是否正常。
*CaptureAndExtract(u8 num)----先判断数据包接收结果,成功就判断接收数据包的result接收应答码,
就是指令发送的结果,然后根据函数需求返回result或parameter
/*
函数功能:MG200发送数据包
形参:
u8 cmd 发送发送指令码
u8 parameter 发送参数
返回值:void
函数说明:
*/
void Mg200_SendData(u8 cmd,u8 parameter)
{
u8 checksum;
usart6_send_byte(0x6c);//起始码
usart6_send_byte(0x63);//发送地址 --- MCU
usart6_send_byte(0x62);//接收地址 --- MG200
usart6_send_byte(cmd);//指令码
usart6_send_byte(parameter);//参数
usart6_send_byte(0x00);//预留
/*计算校验和*/
checksum = (0x63 + 0x62 + cmd + parameter + 0x00) & 0xff;
usart6_send_byte(checksum);//校验和
}
/*
函数功能:MG200接收数据包
形参:
u8 cmd 接收指令码 注意:接收指令码跟发送指令码一样
u8 *result 接收返回值 --- 结果
u8 *parameter 接收参数
返回值:u8 接收正常函数返回0 接收非正常函数返回非0
函数说明:
*/
u8 Mg200_RecData(u8 cmd,u8 *result,u8 *parameter)
{
u8 checksum;
//等待数据接收完成 TC_Flag置1为数据接收完成
while(!mg200_rec.TC_Flag);
mg200_rec.TC_Flag = 0;//清空标志位
if(mg200_rec.buff[0] != 0x6c)
{
return 1;
}
if(mg200_rec.buff[1] != 0x62)
{
return 2;
}
if(mg200_rec.buff[2] != 0x63)
{
return 3;
}
if(mg200_rec.buff[3] != cmd)
{
return 4;
}
*result = mg200_rec.buff[4];//接收返回值
*parameter = mg200_rec.buff[5];//接收参数
if(mg200_rec.buff[6] != 0x00)
{
return 5;
}
checksum = (0x62 + 0x63 + cmd + *result + *parameter + 0x00) & 0xff;
if(mg200_rec.buff[7] != checksum)
{
return 6;
}
return 0;//接收正常返回0
}
发送指令目录:
应答指令目录:
1.5指纹模块具体功能实现:
1.捕捉指纹特征量过程
1.等待手指按下
2.手指按下后,发送提取特征量命令数据包(通过串口通信发送,指纹模块的UART串口不能同时进行收发动作,所以需等串口接收完成再发)
3.判断接收数据包结果,判断是否通信成功(通信判断的是起始码,发送地址,接收地址,校验和,指令码,预留位),通信成功后
4.通过接收数据包函数形参接收返回的值result和参数parameter,判断返回的值result,分析捕捉指纹特征量的结果如何。
/*
函数功能:提取指纹特征量
形参:u8 num 决定第几次提取指纹特征量 0 - 4
返回值:u8 返回result结果
函数说明:
*/
u8 CaptureAndExtract(u8 num)
{
u8 result;
u8 parameter;
printf("请按下手指\r\n");
//等待手指按下
while(!MG200_DETECT);
Mg200_SendData(0x51,num);//发送数据包
if(Mg200_RecData(0x51,&result,¶meter) == 0)
{
//接收数据正常
switch(result)
{
case 0x00:printf("抓取指纹图像及特征量提取成功\r\n");break;
default:printf("抓取指纹图像及特征量提取失败\r\n");break;
}
}
else
{
printf("通信失败\r\n");
return 0xff;
}
return result;
}
2.注册指纹过程
1.通过do while 语句确保成功提取三次特征量
2.成功提取后,发送注册指纹命令数据包 把提取的特征量注册到数据库去
3.判断接收数据包结果,判断是否通信成功(通信判断的是起始码,发送地址,接收地址,校验和,指令码,预留位),通信成功后
4.通过接收数据包函数形参接收返回的值result和参数parameter,判断返回的值result,分析注册指纹的结果如何。
/*
函数功能:注册指纹
形参:void
返回值:u8 返回result结果
0:注册成功 非0:注册失败
先提取三次指纹特征量
函数说明:
*/
u8 Enroll(u8 num)
{
u8 ret;
u8 result;
u8 parameter;
printf("第一次提取指纹特征量\r\n");
do
{
ret = CaptureAndExtract(0x00);
}while(ret);
printf("第二次提取指纹特征量\r\n");
do
{
ret = CaptureAndExtract(0x01);
}while(ret);
printf("第三次提取指纹特征量\r\n");
do
{
ret = CaptureAndExtract(0x02);
}while(ret);
//提取指纹特征量完成,开始发送注册指纹指令
Mg200_SendData(0x7f,num);//发送数据包
if(Mg200_RecData(0x7f,&result,¶meter) == 0)
{
//接收数据正常
switch(result)
{
case 0x00:printf("注册指纹成功!!!!!\r\n");break;
default:printf("注册指纹失败\r\n");break;
}
}
else
{
printf("通信失败\r\n");
return 0xff;
}
return result;
}
3.比对手指过程
1.等待捕捉指纹特征量函数返回捕捉成功结果
2.发送对比指纹命令数据包(捕捉到的特征量会与已注册的用户特征量进行比对)
3.判断接收数据包结果,判断是否通信成功(通信判断的是起始码,发送地址,接收地址,校验和,指令码,预留位),通信成功后
4.通过接收数据包函数形参接收返回的值result和参数parameter,判断返回的值result,如果成功说明比对指纹为已注册用户指纹。并通过
参数parameter,返回对比的指纹用户ID
/*
函数功能:比对指纹
形参:void
返回值:返回值 非0 :对比成功,且为ID号 0:比对失败
u8 参数 非零:ID号(比对成功) 零:比对失败(找不到ID)
先提取一次指纹特征量
函数说明:
*/
u8 Match1N(void)
{
u8 result;
u8 parameter;
if(MG200_DETECT)//手指按下之后再进行指纹比对
{
while(CaptureAndExtract(0x00));//提取一次指纹特征量
//提取指纹特征量完成,开始发送比对指纹指令
Mg200_SendData(0x71,0x00);//发送数据包
if(Mg200_RecData(0x71,&result,¶meter) == 0)
{
//接收数据正常
switch(result)
{
case 0x00:printf("比对指纹成功,ID号:%d\r\n",parameter);break;
default:printf("比对失败\r\n");break;
}
}
else
{
printf("通信失败\r\n");
return 0;
}
}
return parameter;
//返回值 非0 :对比成功,且为ID号 0:比对失败
}
接下来删除指定指纹,删除所有指纹,获取指纹数量等操作跟上面差不多。