指纹识别系统基于STM32微控制器与串口屏

本月,我计划开发一个指纹门锁项目。在选择指纹识别模块时,项目被迫暂停。然而,考虑到已购买的指纹识别模块,我决定先进行测试。

该指纹模块可在线轻松购买,通过UART接口连接至MCU开发板。它支持指纹扫描、指纹输入、指纹比对及指纹删除功能。

由于指纹模块制造商为STM32F103系列微控制器提供了示例程序,我购买了一块基于STM32F103C8T6的开发板。

指纹模块的演示程序使用LED灯提示用户输入指纹并显示比对状态(成功或失败)。但我希望使用串口屏,因此选择了分辨率为480×272的串口屏。该显示屏的具体型号为STONE STVC050WT-01,通过UART与MCU通信,相关内容将在后续章节中详细说明。

硬件组件
共使用三个硬件模块:
  • STM32开发板
  • 指纹模块
  • STONE STVC050WT-01 串口屏

带UART-TTL接口的指纹识别模块

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

UART指纹读取模块采用STMicro的STM32F205高速数字处理器,集成了指纹算法(TFS-9)及高精度光学传感器(TFS-d400)。支持指纹采集、图像处理、特征值提取、模板生成、模板存储、指纹比对及搜索功能。该模块通过 UART 接口与主控微控制器或处理器连接。

特点

  • 高灵敏度指纹识别与快速识别速度:指纹模块采用高精度光学路径和成像组件,使用时仅需手部接触。
  • 稳定性优先:模块采用 STM32F205 MCU,具有低功耗和高速运行特性。速度与稳定性优于国产芯片
  • “科学结构”:模块采用模块化设计,包含指纹传感器、处理主板及算法平台。
  • 标准16针通用接口:传感器可独立选择并更换为光学或其他类型传感器;采用商用算法。
  • 易于开发:串口UART操作(可直接连接任何带串口单片机),操作极简。公司提供演示软件、学习软件、MCU例程及相关工具。
  • 开放性:指纹图像、指纹特征值文件及各种指纹操作可自由输入输出。

应用场景

典型应用包括指纹锁、指纹保险箱、指纹门禁控制、指纹考勤、对讲系统、人员识别、权限管理等…

该指纹模块可在Aliexpress购买。

STONE 5英寸 STVC050WT-01 4:3 串口屏

480×272 TFT LCD 显示屏介绍

在本项目中,我计划使用 STONE STVC050WT-01 TFT LCD 显示屏来显示指纹模块的状态(进入状态、比对状态及指纹数据删除状态)。该显示屏配备驱动芯片,并提供开发软件用于用户界面开发。用户只需通过软件添加设计好的UI图片以及所需的按钮或文本框,然后生成配置文件并烧录到显示屏即可。

STONE STVC050WT-01显示屏通过UART-TTL信号与MCU通信。

理论上,STONE显示屏与指纹模块可直接通信。但由于通信数据协议不同,无法建立连接。因此仍需MCU处理串行通信。

更多技术信息(包括数据手册)请查阅产品页面。

使用STONE触摸屏LCD模块的4个步骤

  • 使用Photoshop或其他图片编辑软件设计用户显示界面。
  • 使用 STONE TOOL 软件设计显示逻辑和按钮逻辑,并将设计文件下载到显示模块。
  • MCU 通过串口与 STONE LCD 模块通信。
  • 步骤 3 中获取的数据将用于 MCU 的其他操作。

STONE TOOL 软件安装

从官方网站下载 STONE TOOL 软件的最新版本(当前为 TOOL 2019)并安装。

软件安装完成后,将打开以下界面:

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

点击左上角的“文件”按钮创建新项目,具体操作将在后续章节中详细说明。

STM32 MCU开发板

我们使用了基于STM32F103C8T6 MCU的开发板,可在Aliexpress上以不到$2的价格购买(含运费)。

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

STM32开发环境

Keil Vision是由Keil公司开发的一体化开发环境。目前有Vision2、Vision3、Vision4和Vision5多个版本。2005年,Keil被Arm公司收购。2011年3月,Arm发布的最新一体化开发环境Realview MDK开发工具集成了Keil uVision4的最新版本,其编译器和调试工具经过优化,适用于Arm设备。

STM32使用KEIL MDK开发环境,可在公司官网获取。

STONE LCD指纹模块测试项目实现

硬件连接至开发板和STONE LCD模块

为确保后续编写代码的可行性,必须首先验证硬件连接的可靠性。

STM32F103C8T6开发板与STVC050WT-01 TFT-串口屏通过UART连接,随后STM32F103C8T6开发板与指纹模块也通过UART连接。

确认硬件连接无误后,继续进行下一步。

仅需1步即可设计UI图形

首先,我们需要设计一个UI显示图像,可使用Photoshop软件或其他图像设计工具进行设计。设计完成后,将图像保存为JPG格式。以下是我在Photoshop中设计的UI。

TFT-LCD显示模块设计

打开STONE TOOL2019软件并创建新项目:

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

删除新项目默认加载的图像,并添加我们自行设计的UI图像。

如何通过STONE Tool添加字体文件

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

UI包含一个实时显示指纹验证状态的状态栏,因此需要添加字体、文本显示组件及按钮。

效果如下:

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

如何生成STONE LCD的配置文件

完成上述UI设计后,可生成配置文件并下载至STVC050WT-01显示屏,具体操作请参考STONE开发资料。

执行步骤1生成配置文件,然后将USB闪存盘插入计算机。闪存盘将显示出来。然后点击“下载到U盘”将配置文件下载到USB闪存盘,再将USB闪存盘插入STVC050WT-01完成升级。

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

执行步骤1生成配置文件,然后将USB闪存盘插入计算机。闪存盘将显示出来。然后点击“下载到U盘”将配置文件下载到USB闪存盘,再将USB闪存盘插入STVC050WT-01完成升级。

如何通过UART-TTL连接指纹模块

指纹模块实际上由两部分组成:

  • 光学采集器
  • 驱动电路

核心部分是驱动电路,集成了STM32F2系列芯片。指纹算法和扫描算法嵌入到芯片中,通过UART通信获取结果,这使得应用开发非常方便。

硬件连接:

VCC —— — 3.3V 或 5V

GND — — — — — -GND

TXD(指纹模块串口发送) —— RXD(PC 或 MCU 串口接收)

RXD(指纹模块串口接收) —— TXD(PC 或 MCU 串口发送)

BL(指纹头背光,未连接)—— IO 端口

RST(指纹模块复位,未连接)—— IO 端口

首次使用时,可通过串口使用 Windows 电脑与指纹模块进行通信以进行测试。更多详情请参阅 Waveshare Wiki(中文)。

STM32 应用开发

访问 指纹模块供应商的官方网站,下载指纹模块演示程序,然后使用 KEIL 软件打开程序。

但在进行软件开发之前,让我们先连接硬件。

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

然后通过串口控制台发送指令以检查连接是否正常工作

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

我们对程序进行了少量修改,最终代码(main.c)如下:

#include
#include "usart.h"
#include "timer.h"
#include "fingerprint.h"
#define ADDUSER_BTN_ADDR       0x01
#define VERIFY_BTN_ADDR        0x05
#define CLEAR_BTN_ADDR         0x09
#define TEXT_STATUS_ADDR       0x0c
#define USER_SUCESS            0x01
#define USER_FAIL              0X00
u8 data_send[8]=  {0xA5, 0x5A, 0x05, 0x82, 0x00, 0x00, 0x00,0x00};
void delay()
{
u16 i, j;
for (i = 0; i < 1000; i++)
for(j = 0; j < 10000; j++);
}
//void USERGPIO_Init(void)
//{
// GPIO_InitTypeDef  GPIO_InitStructure;
//
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
//
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOF, &GPIO_InitStructure);
// GPIO_ResetBits(GPIOF,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
// GPIO_Init(GPIOG, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
//}
//u8 key_scan(void)
//{
// if(!USER_KEY||!PRESS_KEY||!DEL_KEY)
// {
// delay();
// if(!USER_KEY) return 1;
// if(!PRESS_KEY) return 2;
// if(!DEL_KEY) return 3;
// }
// return 0;
//}
void UART1_Send_Array(u8 send_array[],unsigned char num)
{
u8 i=0;
while(i<num)< p=""></num)<>
{
USART_SendData(USART1,send_array[i]);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET);
i++;
}
}
extern u8  USART_RX_BUF[10];
extern u8 USART_RX_END;
extern u16 USART_RX_STA;
int main(void)
{
int i = 5;
SystemInit();
// USERGPIO_Init();
usart_Configuration(115200,19200); //Ö¸ÎÆÄ£¿éĬÈÏÊÇ19200
// printf("Test Uart Fingerprint Reader\r\n");
SetcompareLevel(5);
// printf("compare level£º%d\r\n", GetcompareLevel());
// printf("time out£º%d\r\n",GetTimeOut());
// printf("total user:%d\r\n",GetUserCount());
while(1)
{
if(USART_RX_END)
{
//UART1_Send_Array(USART_RX_BUF,8);
switch (USART_RX_BUF[5])
{
case ADDUSER_BTN_ADDR:
//printf("User:%d\r\n",GetUserCount());
switch(AddUser(i))
{
case ACK_SUCCESS:
i++;
//printf("finger add success\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_SUCESS;
UART1_Send_Array(data_send,8);
LED2_ON;
delay();
LED2_OFF;
break;
case ACK_FAIL:
//printf("fail\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_FAIL;
UART1_Send_Array(data_send,8);
LED3_ON;
delay();
LED3_OFF;
break;
case ACK_FULL:
//printf("full\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_FAIL;
UART1_Send_Array(data_send,8);
LED4_ON;
delay();
LED4_OFF;
break;
}
break;
case VERIFY_BTN_ADDR:
switch(VerifyUser())
{
case ACK_SUCCESS:
//printf("Verify sucess\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_SUCESS;
UART1_Send_Array(data_send,8);
LED2_ON;
delay();
LED2_OFF;
break;
case ACK_NO_USER:
//printf("NO_USER\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_FAIL;
UART1_Send_Array(data_send,8);
LED3_ON;
delay();
LED3_OFF;
break;
case ACK_TIMEOUT:
//printf("time out\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_FAIL;
UART1_Send_Array(data_send,8);
LED3_ON;
delay();
LED3_OFF;
break;
case ACK_GO_OUT:
//printf("GO OUT\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_FAIL;
UART1_Send_Array(data_send,8);
break;
};
break;
case CLEAR_BTN_ADDR:
ClearAllUser();
//printf("all user remove\r\n");
data_send[5]=TEXT_STATUS_ADDR;
data_send[7]=USER_SUCESS;
UART1_Send_Array(data_send,8);
break;
default:
USART_RX_END=0;
USART_RX_STA=0;
}
USART_RX_END=0;
USART_RX_STA=0;
}
}
}

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

最终结果

只需连接STM32开发板、指纹模块、串口屏和电源。按下STONE串口屏上方的按钮,即可实现添加、删除和验证指纹的功能。

Fingerprint-module-test-with-STONE-TFT-LCD-via-Uart-TTL (1)

滚动至顶部