打印
[应用相关]

STM32单片机开发光学指纹识别模块(FPM10A)

[复制链接]
968|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
基于STM32单片机开发光学指纹识别模块(FPM10A)全教程
  • 1.平台
    首先我使用的是 奋斗 STM32 开发板 MINI板



使用特权

评论回复
沙发
gaonaiweng|  楼主 | 2022-4-30 12:22 | 只看该作者
光学指纹识别模块(FPM10A)

使用特权

评论回复
板凳
gaonaiweng|  楼主 | 2022-4-30 12:22 | 只看该作者
2.购买指纹模块,可以获得三份资料
1.简要使用说明 2.使用指纹模块的功能函数 3.FPM10A用户手册.
3.硬件搭建
根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。

使用特权

评论回复
地板
gaonaiweng|  楼主 | 2022-4-30 12:23 | 只看该作者
FPM10A光学指纹模块共有5个管脚
1 为 VCC 电源的正极接 3.6V – 5.5V的电压均可。
2 为 GND 电源的负极 接地。
3 为 TXD 串口的发送。
4 为 RXD 串口的接收。
5 为 NC 悬空不需要使用。

使用特权

评论回复
5
gaonaiweng|  楼主 | 2022-4-30 12:24 | 只看该作者
奋斗板上已经有5V的管脚,可以直接供给指纹模块,
这里需要注意的是,指纹模块主要通过串口进行控制,模块和STM32单片机连接的时候,需要进行电平转换

使用特权

评论回复
6
gaonaiweng|  楼主 | 2022-4-30 12:25 | 只看该作者
   

使用特权

评论回复
7
gaonaiweng|  楼主 | 2022-4-30 12:25 | 只看该作者
这样只要把这个转接板插入STM32,接上5V的电,就可以工作了,将模块的发送端接转接板的接收端,接收端接转接板的发送端。
这样,我们的硬件平台就搭建好了!

使用特权

评论回复
8
gaonaiweng|  楼主 | 2022-4-30 12:26 | 只看该作者
4.模块的测试工作
模块成功上电后,指纹采集窗口会闪一下,表示自检正常,如果不闪,请仔细检查电源,是否接反,接错等。指纹模块使用120MHZ的DSP全速工作,工作时芯片有一些热,经过严格的测试,这是没有问题的可以放心使用,在不使用的时候可以关闭电源,以降低功耗。

使用特权

评论回复
9
gaonaiweng|  楼主 | 2022-4-30 12:27 | 只看该作者
5.现在我们要进入编程环节了
指纹模块主要是通过串口进行控制,所以这里我们需要用到单片机的串口模块。

使用特权

评论回复
10
gaonaiweng|  楼主 | 2022-4-30 12:28 | 只看该作者
我们需要用到两个关键函数
1.使用串口发送一个字节的数据
2.使用串口接收一个字节的数据

使用特权

评论回复
11
gaonaiweng|  楼主 | 2022-4-30 12:29 | 只看该作者
这里我使用的STM32单片,所以这两个程序如下:


view source
print?
01.
// 从 USART1 发送一个字节
02.
void
USART1_SendByte(unsigned
char
temp)
03.
{
04.
USART_SendData(USART1, temp);
05.
while
(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
06.
}
07.
08.
// 从 USART1 读取一个字节
09.
unsigned
char
USART1_ReceivByte()
10.
{
11.
unsigned
char
recev;
12.
while
(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
13.
recev = USART_ReceiveData(USART1);
14.
return
recev;
15.
}

使用特权

评论回复
12
gaonaiweng|  楼主 | 2022-4-30 12:30 | 只看该作者
6.查看FPM10A用户手册 我们来实现比对一个指纹(我们这里假设指纹模块中已经存在指纹模板)

首先我们需要让指纹模块检测是否有指纹输入(也就是是否有手指放在指纹模块上检测)

使用特权

评论回复
13
gaonaiweng|  楼主 | 2022-4-30 12:30 | 只看该作者
我们来看手册上给的操作说明:

使用特权

评论回复
14
gaonaiweng|  楼主 | 2022-4-30 12:31 | 只看该作者
我们需要发送给定的数据包给模块,发送的数据已经给我们了,现在我们参看给我们的C例程
view source
print?
01.
//应答包数组
02.
unsigned
char
dat[18];
03.
04.
//获得指纹图像
05.
06.
unsigned
char
FP_Get_Img[6] ={0x01,0x00,0x03,0x01,0x0,0x05};
07.
08.
//协议包头
09.
10.
unsigned
char
FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};
11.
12.
//FINGERPRINT_获得指纹图像命令
13.
void
FINGERPRINT_Cmd_Get_Img(
void
)
14.
{
15.
unsigned
char
i;
16.
17.
for
(i=0;i<6;i++)
//发送包头
18.
USART1_SendByte(FP_Pack_Head[i]);
19.
20.
for
(i=0;i<6;i++)
//发送命令 0x1d
21.
USART1_SendByte(FP_Get_Img[i]);
22.
23.
for
(i=0;i<12;i++)
//读回应答信息
24.
dat[i]=USART1_ReceivByte();
25.
}

使用特权

评论回复
15
gaonaiweng|  楼主 | 2022-4-30 12:32 | 只看该作者
说明:这个函数就是检测是否有指纹输入的信息,根据用户手册,当确认码返回值为0时,表示成功录入,所以,我们可以有下面的函数:

view source
print?
01.
//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败
02.
unsigned
char
test_fig()
03.
{
04.
unsigned
char
fig_dat;
05.
FINGERPRINT_Cmd_Get_Img();
06.
Delay_ms1(20);
07.
fig_dat=dat[9];
08.
return
(fig_dat);
09.
}
10.
11.
因此,我们在主函数中可以这样调用:
12.
void
main
13.
{
14.
if
(test_fig()==0)
15.
{
16.
//do something
17.
}
18.
}

使用特权

评论回复
16
gaonaiweng|  楼主 | 2022-4-30 12:32 | 只看该作者
7.如何录入一个新的指纹信息呢?
步骤如下
1.获得指纹图像
2.检测是否成功的按了指纹
3.将图像转换成特征码存放在Buffer1中
4.再次获得指纹图像
5.将图像转换成特征码存放在Buffer2中
6.转换成特征码
7.存储到指定地址上
同样的,根据用户手册,我们可以得到以下这样的模块:

当调用的时候,你只要给这个函数附上两个值就可以了,例如:
unsigned char FP_add_new_user(00,01);

使用特权

评论回复
17
gaonaiweng|  楼主 | 2022-4-30 12:33 | 只看该作者
如果你下次再次写入这个地址,以前存储的指纹模板信息将被覆盖


view source
print?
01.
//添加一个新的指纹
02.
unsigned
char
FP_add_new_user(unsigned
char
ucH_user,unsigned
char
ucL_user)
03.
{
04.
do
05.
{
06.
FINGERPRINT_Cmd_Get_Img();
//获得指纹图像
07.
}
while
( dat[9]!=0x0 );
//检测是否成功的按了指纹
08.
09.
FINGERPRINT_Cmd_Img_To_Buffer1();
//将图像转换成特征码存放在Buffer1中
10.
11.
do
12.
{
13.
FINGERPRINT_Cmd_Get_Img();
//获得指纹图像
14.
}
while
( dat[9]!=0x0 );
15.
16.
FINGERPRINT_Cmd_Img_To_Buffer2();
//将图像转换成特征码存放在Buffer2中
17.
18.
FINGERPRINT_Cmd_Reg_Model();
//转换成特征码
19.
20.
FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
21.
22.
return
0;
23.
}
24.
25.
//存储模版到特定地址
26.
void
FINGERPRINT_Cmd_Save_Finger( unsigned
char
ucH_Char, unsigned
char
ucL_Char)
27.
{
28.
unsigned
long
temp = 0;
29.
unsigned
char
i;
30.
31.
FP_Save_Finger[5] = ucH_Char;
32.
FP_Save_Finger[6] = ucL_Char;
33.
34.
for
(i=0;i<7;i++)
//计算校验和
35.
temp = temp + FP_Save_Finger[i];
36.
37.
FP_Save_Finger[7]=(temp & 0x00FF00) >> 8;
//存放校验数据
38.
FP_Save_Finger[8]= temp & 0x0000FF;
39.
40.
41.
for
(i=0;i<6;i++)
42.
USART1_SendByte(FP_Pack_Head[i]);
//发送包头
43.
44.
for
(i=0;i<9;i++)
45.
USART1_SendByte(FP_Save_Finger[i]) ;
//发送命令将图像转换成特征码存放CHAR_buffer1
46.
47.
for
(i=0;i<12;i++)
48.
dat[i]=USART1_ReceivByte();
49.
}

使用特权

评论回复
18
gaonaiweng|  楼主 | 2022-4-30 12:34 | 只看该作者
8.如何删除一个模板?

view source
print?
01.
//删除所有指纹模版
02.
void
FINGERPRINT_Cmd_Delete_All_Model(
void
)
03.
{
04.
unsigned
char
i;
05.
06.
for
(i=0;i<6;i++)
//发送包头
07.
USART1_SendByte(FP_Pack_Head[i]);
08.
09.
for
(i=0;i<6;i++)
//发送命令 0x1d
10.
USART1_SendByte(FP_Delet_All_Model[i]);
11.
12.
for
(i=0;i<12;i++)
//读回应答信息
13.
dat[i]=USART1_ReceivByte();
14.
}

使用特权

评论回复
19
gaonaiweng|  楼主 | 2022-4-30 12:35 | 只看该作者
9.如何获取已经存取的指纹模板信息?
这个模块一共可以存储0~999枚指纹信息


view source
print?
01.
//搜索全部用户999枚
02.
void
FINGERPRINT_Cmd_Search_Finger(
void
)
03.
{
04.
unsigned
char
i;
05.
//发送命令搜索指纹库
06.
for
(i=0;i<6;i++)
07.
{
08.
USART1_SendByte(FP_Pack_Head[i]);
09.
}
10.
11.
for
(i=0;i<11;i++)
12.
{
13.
USART1_SendByte(FP_Search[i]);
14.
}
15.
16.
for
(i=0;i<16;i++)
17.
{
18.
dat[i]=USART1_ReceivByte();
19.
}
20.
}

使用特权

评论回复
20
gaonaiweng|  楼主 | 2022-4-30 12:35 | 只看该作者
根据用户手册,我们可以从应答包中得出模块中已经存在指纹数量的大小
这样,我们就轻松把指纹模块搞定!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

697

帖子

3

粉丝