【DigiKey“智造万物,快乐不停”创意大赛】基于树莓派的智能考勤机+驱动指纹模块
[复制链接]
本帖最后由 青春最好时 于 2023-12-20 09:33 编辑
#####
最近比较忙,距离上次发帖的时间过了3周左右了,所以得加快进度了。考勤机计划使用的两种识别方案,指纹识别和人脸识别,人脸识别在前3个贴子中已经实现且可以在OLED12864屏幕上显示出识别到的人脸信息以及人脸ID。所以接下来进行指纹模块的驱动编写以及驱动指纹模块识别指纹。
由于使用时发现树莓派芯片发热量较大,因此在淘宝上购买了散热器来给芯片散热,由于VCC和GND引脚被OLED屏幕占用,所以就使用的被动散热。
######
首先先准备一个USB转串口模块,将USB插头插在树莓派上,指纹模块接在USB转TTL模块上。
指纹模块的线序如下:
接线线序
USB to TTL指纹模块
TX————> RX
RX————> TX
VCC(3.3V) ————> Vi
GND————> GND
指纹模块的WAK引脚是检测是否有指纹放上去,有的话输出高电平,没有指纹放在指纹模块上时,输出是低电平。在本项目中这里WAK空接即可。
#####################
淘宝上的指纹模块资料都是基于51和32单片机的驱动,在linux情况下的驱动没有,网上资料也较少,所以就只能自己写几个主要的功能驱动指纹进行工作
1、录入功能、2、指纹对比、3、删除指纹、4、清空指纹库、
首先看录入功能,通过读取芯片手册可知录入指纹的协议帧如下
注:芯片地址默认的是0XFFFFFFFF,
所以定义录入指纹的命令
# 录入图像
PS_Getimage = [
0XEF, 0X01, 0XFF, 0XFF, 0XFF, 0XFF, 0X01, 0X00, 0X03, 0X01, 0X00, 0X05
]
当得的指纹数据以后需要进行图像处理,然后保存到指纹的特征区内,由芯片手册,
所以定义
# 在特征区1生成特征
PS_GenChar1 = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x02, 0x01, 0x00,
0x08
]
# 在特征区2生成特征
PS_GenChar2 = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x04, 0x02, 0x02, 0x00,
0x09
]
当特征区1和2中的数据相同时,说明对于同一个指纹匹配成功,‘’
定义:
PS_Match = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x03, 0x00, 0x07
] # 对比匹配与否
然后将特征区1和2中的数据和并,生成一个指纹模版(ID),所以定义
PS_RegModel = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x05, 0x00, 0x09
] # 合并1、2区特征并存于1、2区
最后就可以进行将指纹模版进行录入到指纹模块中
定义:
PS_StoreChar_1tox = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x06, 0x06, 0x01, 0x00,
0x03, 0x00, 0x11
] # 在指纹库指定ID处添加指纹
###########################
接下来是指纹对比(指纹识别)
同理定义
PS_Search_stored1 = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x08, 0x04, 0x01, 0x00,
0x01, 0x00, 0x20, 0x00, 0x2F
] # 以特征区1的指纹特征进行全局搜索
PS_Search_stored2 = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x08, 0x04, 0x02, 0x00,
0x01, 0x00, 0x20, 0x00, 0x30
] # 以特征区2的指纹特征进行全局搜索
#########
最后是清空指纹
分为清空单个指纹和整个指纹库。
定义:
PS_DeletChar = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x07, 0x0c, 0x00, 0x01,
0x00, 0x01, 0x00, 0x16
]# 删除单个指纹
定义:
PS_Empty = [
0xEF, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x03, 0x0d, 0x00, 0x11
] # 清空指纹库
当指纹的命令定义好以后,开始使用树莓派控制指纹模块进行工作,由于这里使用的USB转串口,因此需要知道指纹模块对应的串口号,输入命令
lsusb
可以看到检测到USB设备,然后查看下端口号
ls –l /dev
可以看到有个ttyUSB0,这就是USB to TTL模块所对应的端口号
所以定义
serialPort = '/dev/ttyUSB0' # 串口6 '/dev/ttyUSB0'
baudRate = 115200 # 波特率
####串口命令发送函数
def Send_A_Cmd(serInstance, atCmdStr):
serInstance.write(atCmdStr)
###串口命令接受
def receive_data(ser):
global rec_data
while not (ser.inWaiting() > 0):
pass
rec_data = []
time.sleep(0.1)
if ser.inWaiting() > 0:
for num in range(0, ser.inWaiting()):
rec_data.insert(num, ser.read(1))
###先得到指纹数据
def GET_FINGERPRINT(ser, path='pic/origin.png'):
print("请输入指纹!")
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_Getimage)
receive_data(ser)
rec_data[9] = 3
Send_A_Cmd(ser, PS_UPImage)
getData(ser)
extractImage(path)
###添加数据
def ADD_FINGERPRINT(ser):
global ID
ID = eval(input("请输入ID: "))
while ID < 1 or ID > 200:
ID = eval(input("ID不正确,请重新输入(1-200): "))
print("请第一次输入指纹!")
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_Getimage)
receive_data(ser)
rec_data[9] = 3
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_GenChar1)
receive_data(ser)
rec_data[9] = 3
print("请第二次输入指纹!")
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_Getimage)
receive_data(ser)
rec_data[9] = 3
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_GenChar2)
receive_data(ser)
rec_data[9] = 3
print("两次指纹匹配结果: ")
Send_A_Cmd(ser, PS_Match)
receive_data(ser)
if rec_data[9] != b'\x00':
print("不匹配!录入指纹失败!")
return 0
else:
print("匹配!")
rec_data[9] = 3
while rec_data[9] != b'\x00':
Send_A_Cmd(ser, PS_RegModel)
receive_data(ser)
print("合成特征成功!")
rec_data[9] = 3
check_and_set(ID)
Send_A_Cmd(ser, PS_StoreChar_1tox)
receive_data(ser)
if rec_data[9] == b'\x00':
print("录入指纹成功!")
rec_data[9] = 3
return 1
return 0
###主函数
if __name__ == '__main__':
ser = serial.Serial(serialPort, baudRate, timeout=0.2)
print("参数设置:串口= %s ,波特率= %d" % (serialPort, baudRate))
while (1):
print("请选择功能:1.录入指纹 2.身份验证 3.删除ID=x起的n枚指纹 4.清空指纹库 5.获取指纹图像 6.退出")
selection = eval(input())
if selection == 1:
ADD_FINGERPRINT(ser)
elif selection == 2:
CHECK_FINGERPRINT(ser)
elif selection == 3:
DELETE_FINGERPRINTS(ser)
elif selection == 4:
CLEAR_LIBRARY(ser)
elif selection == 5:
GET_FINGERPRINT(ser)
elif selection == 5:
break
ser.close()
########此时指纹录入函数代码编写完毕,然后进行测试,
此时指纹录入程序可以工作。
其余的函数代码直接给出见附件,以下是测试结果
指纹对比:
指纹删除录入的第一个指纹:
清空指纹库:
然后再放上手指进行对比:
可以发现指纹库中没有之前录入的指纹了。
##################
本贴使用到的代码见附件py文件,AS608芯片手册一同附上
|