[应用相关] STM32单片机开发光学指纹识别模块(FPM10A)

[复制链接]
1664|41
 楼主| gaonaiweng 发表于 2022-4-30 12:21 | 显示全部楼层 |阅读模式
基于STM32单片机开发光学指纹识别模块(FPM10A)全教程
  • 1.平台
    首先我使用的是 奋斗 STM32 开发板 MINI板

  • 64621626cb893914de.png

 楼主| gaonaiweng 发表于 2022-4-30 12:22 | 显示全部楼层
光学指纹识别模块(FPM10A)
63082626cb96e651ab.png
 楼主| 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 悬空不需要使用。
 楼主| gaonaiweng 发表于 2022-4-30 12:24 | 显示全部楼层
奋斗板上已经有5V的管脚,可以直接供给指纹模块,
这里需要注意的是,指纹模块主要通过串口进行控制,模块和STM32单片机连接的时候,需要进行电平转换
 楼主| gaonaiweng 发表于 2022-4-30 12:25 | 显示全部楼层
 楼主| gaonaiweng 发表于 2022-4-30 12:25 | 显示全部楼层
这样只要把这个转接板插入STM32,接上5V的电,就可以工作了,将模块的发送端接转接板的接收端,接收端接转接板的发送端。
这样,我们的硬件平台就搭建好了!
 楼主| gaonaiweng 发表于 2022-4-30 12:26 | 显示全部楼层
4.模块的测试工作
模块成功上电后,指纹采集窗口会闪一下,表示自检正常,如果不闪,请仔细检查电源,是否接反,接错等。指纹模块使用120MHZ的DSP全速工作,工作时芯片有一些热,经过严格的测试,这是没有问题的可以放心使用,在不使用的时候可以关闭电源,以降低功耗。
 楼主| gaonaiweng 发表于 2022-4-30 12:27 | 显示全部楼层
5.现在我们要进入编程环节了
指纹模块主要是通过串口进行控制,所以这里我们需要用到单片机的串口模块。
 楼主| gaonaiweng 发表于 2022-4-30 12:28 | 显示全部楼层
我们需要用到两个关键函数
1.使用串口发送一个字节的数据
2.使用串口接收一个字节的数据
 楼主| gaonaiweng 发表于 2022-4-30 12:29 | 显示全部楼层
这里我使用的STM32单片,所以这两个程序如下:


  1. view source
  2. print?
  3. 01.
  4. // 从 USART1 发送一个字节
  5. 02.
  6. void
  7. USART1_SendByte(unsigned
  8. char
  9. temp)
  10. 03.
  11. {
  12. 04.
  13. USART_SendData(USART1, temp);
  14. 05.
  15. while
  16. (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  17. 06.
  18. }
  19. 07.
  20. 08.
  21. // 从 USART1 读取一个字节
  22. 09.
  23. unsigned
  24. char
  25. USART1_ReceivByte()
  26. 10.
  27. {
  28. 11.
  29. unsigned
  30. char
  31. recev;
  32. 12.
  33. while
  34. (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  35. 13.
  36. recev = USART_ReceiveData(USART1);
  37. 14.
  38. return
  39. recev;
  40. 15.
  41. }
 楼主| gaonaiweng 发表于 2022-4-30 12:30 | 显示全部楼层
6.查看FPM10A用户手册 我们来实现比对一个指纹(我们这里假设指纹模块中已经存在指纹模板)

首先我们需要让指纹模块检测是否有指纹输入(也就是是否有手指放在指纹模块上检测)
 楼主| gaonaiweng 发表于 2022-4-30 12:30 | 显示全部楼层
我们来看手册上给的操作说明:
75745626cbb6dbd8b6.png
 楼主| gaonaiweng 发表于 2022-4-30 12:31 | 显示全部楼层
我们需要发送给定的数据包给模块,发送的数据已经给我们了,现在我们参看给我们的C例程
  1. view source
  2. print?
  3. 01.
  4. //应答包数组
  5. 02.
  6. unsigned
  7. char
  8. dat[18];
  9. 03.
  10. 04.
  11. //获得指纹图像
  12. 05.
  13. 06.
  14. unsigned
  15. char
  16. FP_Get_Img[6] ={0x01,0x00,0x03,0x01,0x0,0x05};
  17. 07.
  18. 08.
  19. //协议包头
  20. 09.
  21. 10.
  22. unsigned
  23. char
  24. FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};
  25. 11.
  26. 12.
  27. //FINGERPRINT_获得指纹图像命令
  28. 13.
  29. void
  30. FINGERPRINT_Cmd_Get_Img(
  31. void
  32. )
  33. 14.
  34. {
  35. 15.
  36. unsigned
  37. char
  38. i;
  39. 16.
  40. 17.
  41. for
  42. (i=0;i<6;i++)
  43. //发送包头
  44. 18.
  45. USART1_SendByte(FP_Pack_Head[i]);
  46. 19.
  47. 20.
  48. for
  49. (i=0;i<6;i++)
  50. //发送命令 0x1d
  51. 21.
  52. USART1_SendByte(FP_Get_Img[i]);
  53. 22.
  54. 23.
  55. for
  56. (i=0;i<12;i++)
  57. //读回应答信息
  58. 24.
  59. dat[i]=USART1_ReceivByte();
  60. 25.
  61. }
 楼主| gaonaiweng 发表于 2022-4-30 12:32 | 显示全部楼层
说明:这个函数就是检测是否有指纹输入的信息,根据用户手册,当确认码返回值为0时,表示成功录入,所以,我们可以有下面的函数:

  1. view source
  2. print?
  3. 01.
  4. //检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败
  5. 02.
  6. unsigned
  7. char
  8. test_fig()
  9. 03.
  10. {
  11. 04.
  12. unsigned
  13. char
  14. fig_dat;
  15. 05.
  16. FINGERPRINT_Cmd_Get_Img();
  17. 06.
  18. Delay_ms1(20);
  19. 07.
  20. fig_dat=dat[9];
  21. 08.
  22. return
  23. (fig_dat);
  24. 09.
  25. }
  26. 10.
  27. 11.
  28. 因此,我们在主函数中可以这样调用:
  29. 12.
  30. void
  31. main
  32. 13.
  33. {
  34. 14.
  35. if
  36. (test_fig()==0)
  37. 15.
  38. {
  39. 16.
  40. //do something
  41. 17.
  42. }
  43. 18.
  44. }
 楼主| gaonaiweng 发表于 2022-4-30 12:32 | 显示全部楼层
7.如何录入一个新的指纹信息呢?
步骤如下
1.获得指纹图像
2.检测是否成功的按了指纹
3.将图像转换成特征码存放在Buffer1中
4.再次获得指纹图像
5.将图像转换成特征码存放在Buffer2中
6.转换成特征码
7.存储到指定地址上
同样的,根据用户手册,我们可以得到以下这样的模块:

当调用的时候,你只要给这个函数附上两个值就可以了,例如:
unsigned char FP_add_new_user(00,01);
 楼主| gaonaiweng 发表于 2022-4-30 12:33 | 显示全部楼层
如果你下次再次写入这个地址,以前存储的指纹模板信息将被覆盖


view source
print?
  1. 01.
  2. //添加一个新的指纹
  3. 02.
  4. unsigned
  5. char
  6. FP_add_new_user(unsigned
  7. char
  8. ucH_user,unsigned
  9. char
  10. ucL_user)
  11. 03.
  12. {
  13. 04.
  14. do
  15. 05.
  16. {
  17. 06.
  18. FINGERPRINT_Cmd_Get_Img();
  19. //获得指纹图像
  20. 07.
  21. }
  22. while
  23. ( dat[9]!=0x0 );
  24. //检测是否成功的按了指纹
  25. 08.
  26. 09.
  27. FINGERPRINT_Cmd_Img_To_Buffer1();
  28. //将图像转换成特征码存放在Buffer1中
  29. 10.
  30. 11.
  31. do
  32. 12.
  33. {
  34. 13.
  35. FINGERPRINT_Cmd_Get_Img();
  36. //获得指纹图像
  37. 14.
  38. }
  39. while
  40. ( dat[9]!=0x0 );
  41. 15.
  42. 16.
  43. FINGERPRINT_Cmd_Img_To_Buffer2();
  44. //将图像转换成特征码存放在Buffer2中
  45. 17.
  46. 18.
  47. FINGERPRINT_Cmd_Reg_Model();
  48. //转换成特征码
  49. 19.
  50. 20.
  51. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
  52. 21.
  53. 22.
  54. return
  55. 0;
  56. 23.
  57. }
  58. 24.
  59. 25.
  60. //存储模版到特定地址
  61. 26.
  62. void
  63. FINGERPRINT_Cmd_Save_Finger( unsigned
  64. char
  65. ucH_Char, unsigned
  66. char
  67. ucL_Char)
  68. 27.
  69. {
  70. 28.
  71. unsigned
  72. long
  73. temp = 0;
  74. 29.
  75. unsigned
  76. char
  77. i;
  78. 30.
  79. 31.
  80. FP_Save_Finger[5] = ucH_Char;
  81. 32.
  82. FP_Save_Finger[6] = ucL_Char;
  83. 33.
  84. 34.
  85. for
  86. (i=0;i<7;i++)
  87. //计算校验和
  88. 35.
  89. temp = temp + FP_Save_Finger[i];
  90. 36.
  91. 37.
  92. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8;
  93. //存放校验数据
  94. 38.
  95. FP_Save_Finger[8]= temp & 0x0000FF;
  96. 39.
  97. 40.
  98. 41.
  99. for
  100. (i=0;i<6;i++)
  101. 42.
  102. USART1_SendByte(FP_Pack_Head[i]);
  103. //发送包头
  104. 43.
  105. 44.
  106. for
  107. (i=0;i<9;i++)
  108. 45.
  109. USART1_SendByte(FP_Save_Finger[i]) ;
  110. //发送命令将图像转换成特征码存放CHAR_buffer1
  111. 46.
  112. 47.
  113. for
  114. (i=0;i<12;i++)
  115. 48.
  116. dat[i]=USART1_ReceivByte();
  117. 49.
  118. }
 楼主| 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.
}
 楼主| 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.
}
 楼主| gaonaiweng 发表于 2022-4-30 12:35 | 显示全部楼层
根据用户手册,我们可以从应答包中得出模块中已经存在指纹数量的大小
这样,我们就轻松把指纹模块搞定!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

875

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部