您好,欢迎来到微智科技网。
搜索
您的当前位置:首页基于STM32单片机开发光学指纹识别模块

基于STM32单片机开发光学指纹识别模块

来源:微智科技网


基于STM32单片机开发光学指纹识别模块(FPM10A)全教程

收藏人:共同成长888 2014-05-08 | 阅:25 转:0 | 来源 | 分享

基于STM32单片机开发光学指纹识别模块(FPM10A)全教程

 1.平台

首先我使用的是 奋斗 STM32

开发板 MINI板

光学指纹识别模块(FPM10A)

2.购买指纹模块,可以获得三份资料

1.简要使用说明 2.使用指纹模块的功能函数 3.FPM10A用户手册. 3.硬件搭建

根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。 FPM10A光学指纹模块共有5个管脚

1 为 VCC 电源的正极接 3.6V – 5.5V的电压均可。 2 为 GND 电源的负极 接地。 3 为 TXD 串口的发送。 4 为 RXD 串口的接收。 5 为 NC 悬空不需要使用。

奋斗板上已经有5V的管脚,可以直接供给指纹模块,

这里需要注意的是,指纹模块主要通过串口进行控制,模块和STM32单片机连接的时候,需要进行电平转换,

这样只要把这个转接板插入STM32,接上5V的电,就可以工作了,将模块的发送端接转接板的接收端,接收端接转接板的发送端。 这样,我们的硬件平台就搭建好了! 4.模块的测试工作

模块成功上电后,指纹采集窗口会闪一下,表示自检正常,如果不闪,请仔细检查电源,是否接反,接错等。指纹模块使用120MHZ的DSP全速工作,工作时芯片有一些热,经过严格的测试,这是没有问题的可以放心使用,在不使用的时候可以关闭电源,以降低功耗。 5.现在我们要进入编程环节了

指纹模块主要是通过串口进行控制,所以这里我们需要用到单片机的串口模块。

我们需要用到两个关键函数

1.使用串口发送一个字节的数据 2.使用串口接收一个字节的数据

这里我使用的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.}

6.查看FPM10A用户手册 我们来实现比对一个指纹(我们这里假设指纹模块中已经存在指纹模板)

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

我们来看手册上给的操作说明:

我们需要发送给定的数据包给模块,发送的数据已经给我们了,现在我们参看给我们的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.}

说明:这个函数就是检测是否有指纹输入的信息,根据用户手册,当确认码返回值为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.}

7.如何录入一个新的指纹信息呢? 步骤如下

1.获得指纹图像

2.检测是否成功的按了指纹

3.将图像转换成特征码存放在Buffer1中 4.再次获得指纹图像

5.将图像转换成特征码存放在Buffer2中 6.转换成特征码 7.存储到指定地址上

同样的,根据用户手册,我们可以得到以下这样的模块:

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

如果你下次再次写入这个地址,以前存储的指纹模板信息将被覆盖 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.}

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.}

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.}

根据用户手册,我们可以从应答包中得出模块中已经存在指纹数量的大小

这样,我们就轻松把指纹模块搞定!

下面我附上基于STM32单片机光学指纹识别模块(FPM10A)打包好的函数库

第一个是 FPM10A.c

view source print?

001.#include \"stm32f10x.h\"

002.#include \"stm32f10x_usart.h\" 003.#include \"misc.h\"

004.unsigned char dat[18]; 005.

006.//FINGERPRINT通信协议定义

007.unsigned char FP_Pack_Head[6] =

{0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头 008.unsigned char FP_Get_Img[6] =

{0x01,0x00,0x03,0x01,0x0,0x05}; //获得指纹图像 009.unsigned char FP_Templete_Num[6]

={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数

010.unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2}; //搜索指纹搜索范围0 - 929

011.unsigned char FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21};//搜索0-9号指纹

012.unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; //将图像放入到BUFFER1

013.unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; //将图像放入到BUFFER2

014.unsigned char FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09}; //将BUFFER1跟BUFFER2合成特征模版

015.unsigned char FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d,0x00,0x11}; //删除指纹模块里所有的模版

016.unsigned char FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置 017.unsigned char FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0x0,0x0,0x0,0x1,0x0,0x0}; //删除指定的模版 018. 019.

020.//从 USART1 发送一个字节

021.void USART1_SendByte(unsigned char temp) 022.{

023. USART_SendData(USART1, temp);

024. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 025.} 026.

027.//从 USART1 读取一个字节

028.unsigned char USART1_ReceivByte() 029.{

030. unsigned char recev;

031. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

032. recev = USART_ReceiveData(USART1); 033. return recev; 034.}

035.//FINGERPRINT命令字

036.//FINGERPRINT_获得指纹图像命令 037.void FINGERPRINT_Cmd_Get_Img(void) 038.{

039. unsigned char i; 040.

041. for(i=0;i<6;i++) //发送包头

042. USART1_SendByte(FP_Pack_Head[i]); 043.

044. for(i=0;i<6;i++) //发送命令 0x1d 045. USART1_SendByte(FP_Get_Img[i]); 046.

047. for(i=0;i<12;i++)//读回应答信息 048. dat[i]=USART1_ReceivByte(); 049.} 050.

051.//删除所有指纹模版

052.void FINGERPRINT_Cmd_Delete_All_Model(void) 053.{

054. unsigned char i; 055.

056. for(i=0;i<6;i++) //发送包头

057. USART1_SendByte(FP_Pack_Head[i]); 058.

059. for(i=0;i<6;i++) //发送命令 0x1d

060. USART1_SendByte(FP_Delet_All_Model[i]); 061.

062. for(i=0;i<12;i++)//读回应答信息 063. dat[i]=USART1_ReceivByte(); 0.} 065.

066.//讲图像转换成特征码存放在Buffer1中

067.void FINGERPRINT_Cmd_Img_To_Buffer1(void) 068.{

069. unsigned char i;

070. for(i=0;i<6;i++) //发送包头 071. {

072. USART1_SendByte(FP_Pack_Head[i]); 073. }

074. for(i=0;i<7;i++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1 075. {

076. USART1_SendByte(FP_Img_To_Buffer1[i]); 077. }

078. for(i=0;i<12;i++)//读应答信息 079. {

080. dat[i]=USART1_ReceivByte();//把应答数据存放到缓冲区 081. } 082.} 083.

084.//将图像转换成特征码存放在Buffer2中

085.void FINGERPRINT_Cmd_Img_To_Buffer2(void) 086.{

087. unsigned char i;

088. for(i=0;i<6;i++) //发送包头 0. {

090. USART1_SendByte(FP_Pack_Head[i]); 091. } 092.

093. for(i=0;i<7;i++) //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1 094. {

095. USART1_SendByte(FP_Img_To_Buffer2[i]); 096. }

097. for(i=0;i<12;i++) 098. {

099. dat[i]=USART1_ReceivByte();//读回应答信息 100. } 101.} 102.

103.//将BUFFER1 跟 BUFFER2 中的特征码合并成指纹模版 104.void FINGERPRINT_Cmd_Reg_Model(void) 105.{

106. unsigned char i; 107.

108. for(i=0;i<6;i++) //包头 109. {

110. USART1_SendByte(FP_Pack_Head[i]); 111. } 112.

113. for(i=0;i<6;i++) //命令合并指纹模版 114. {

115. USART1_SendByte(FP_Reg_Model[i]);

116. } 117.

118. for(i=0;i<12;i++) 119. {

120. dat[i]=USART1_ReceivByte(); 121. } 122.} 123.

124.//存储模版到特定地址

125.void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char, unsigned charucL_Char) 126.{

127. unsigned long temp = 0; 128. unsigned char i; 129.

130. FP_Save_Finger[5] = ucH_Char; 131. FP_Save_Finger[6] = ucL_Char; 132. 133.

134. for(i=0;i<7;i++) //计算校验和 135. temp = temp + FP_Save_Finger[i]; 136.

137. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据 138. FP_Save_Finger[8]= temp & 0x0000FF; 139. 140.

141. for(i=0;i<6;i++)

142. USART1_SendByte(FP_Pack_Head[i]); //发送包头 143.

144. for(i=0;i<9;i++)

145. USART1_SendByte(FP_Save_Finger[i]); //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1 146.

147. for(i=0;i<12;i++)

148. dat[i]=USART1_ReceivByte(); 149.} 150.

151.//获得指纹模板数量

152.void FINGERPRINT_Cmd_Get_Templete_Num(void) 153.{

154. unsigned int i; 155.

156. for(i=0;i<6;i++) //包头

157. USART1_SendByte(FP_Pack_Head[i]);

158.

159. //发送命令 0x1d 160. for(i=0;i<6;i++)

161. USART1_SendByte(FP_Templete_Num[i]); 162.

163. for(i=0;i<12;i++)

1. dat[i]=USART1_ReceivByte(); 165.} 166.

167.//搜索全部用户999枚

168.void FINGERPRINT_Cmd_Search_Finger(void) 169.{

170. unsigned char i; 171. //发送命令搜索指纹库 172. for(i=0;i<6;i++) 173. {

174. USART1_SendByte(FP_Pack_Head[i]); 175. } 176.

177. for(i=0;i<11;i++) 178. {

179. USART1_SendByte(FP_Search[i]); 180. } 181.

182. for(i=0;i<16;i++) 183. {

184. dat[i]=USART1_ReceivByte(); 185. } 186.} 187.

188.//搜索用户0~9枚

1.void FINGERPRINT_Cmd_Search_Finger_Admin(void) 190.{

191. unsigned char i;

192. for(i=0;i<6;i++) //发送命令搜索指纹库 193. {

194. USART1_SendByte(FP_Pack_Head[i]); 195. } 196.

197. for(i=0;i<11;i++) 198. {

199. USART1_SendByte(FP_Search_0_9[i]); 200. } 201.

202. for(i=0;i<12;i++)

203. dat[i]=USART1_ReceivByte(); 204.} 205.

206.//添加一个新的指纹

207.unsigned char FP_add_new_user(unsigned char ucH_user,unsigned char ucL_user) 208.{ 209. do 210. {

211. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像

212. } while ( dat[9]!=0x0 ); //检测是否成功的按了指纹 213.

214. FINGERPRINT_Cmd_Img_To_Buffer1(); //将图像转换成特征码存放在Buffer1中 215. 216. do 217. {

218. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像 219. } while( dat[9]!=0x0 ); 220.

221. FINGERPRINT_Cmd_Img_To_Buffer2(); //将图像转换成特征码存放在Buffer2中 222.

223. FINGERPRINT_Cmd_Reg_Model(); //转换成特征码 224.

225. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user); 226.

227. return 0; 228.}

第2个 FPM10A.h

view source print?

01.#ifndef _FPM10A_H 02.#define _FPM10A_H 03.#include 04.

05.extern unsigned char dat[18]; 06.

07.extern void FINGERPRINT_Cmd_Get_Img();

08.extern void FINGERPRINT_Cmd_Img_To_Buffer1();

09.extern void FINGERPRINT_Cmd_Img_To_Buffer2(); 10.extern void FINGERPRINT_Cmd_Reg_Model();

11.extern void FINGERPRINT_Cmd_Delete_All_Model(void); 12.extern void FINGERPRINT_Cmd_Search_Finger(void); 13.extern void FINGERPRINT_Cmd_Get_Templete_Num(void); 14.extern void FINGERPRINT_Cmd_Search_Finger_Admin(void); 15.extern void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char, unsigned charucL_Char);

16.extern unsigned char FP_add_new_user(unsigned char ucH_user,unsigned charucL_user); 17. 18.

19.extern void USART1_SendByte(unsigned char temp); 20.extern unsigned char USART1_ReceivByte(); 21.

22.extern void Delay_ms1(uint32_t nCount); 23.

24.void Delay_nus1(uint32_t nCount) 25.{

26. uint32_t j; 27. while(nCount--) 28. { 29. j=8;

30. while(j--); 31. } 32.} 33.

34.void Delay_ms1(uint32_t nCount) 35.{

36. while(nCount--) 37. Delay_nus1(1100); 38.} 39.

40.unsigned char test_fig()//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败 41.{

42. unsigned char fig_dat;

43. FINGERPRINT_Cmd_Get_Img(); 44. Delay_ms1(20); 45. fig_dat=dat[9]; 46. return(fig_dat); 47.} 48.

49.#endif

有了这两个东西,加入到你的工程中,就可以直接调用啦!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务