1、前言
指纹模块和树莓派实现的网上的资料比较少。所以把自己研究成功了的指纹模块给大家分享一下。现在目前市场上指纹模块比较多,大多还支持二次开发,但是难易度不同,一般价格高一点的相对开发简单,很多实现方法都已封装好了。我还是建议买稍微贵一点的,因为我们毕竟不是专业开发和研究它的,能实现我们的功能最好了。这完全是个人的建议。
2、硬件准备
(1)树莓派3b
(2)指纹模块(电容式)
(3)继电器
(4)电磁铁
3、硬件连接
这里重点说一下树莓派和指纹模块的通信的链接,这里用的串口通信,所以通信的针脚是tx和rx。但是这里连接一定得注意,树莓派和指纹模块tx和rx要反的连,意识就是指纹模块的tx连树莓派的rx,指纹模块rx连树莓派tx。
实物连接就是这样的。其它的这个很简单,我相信大家都会。
4、实物效果图
5、代码
TRUE = 1
FALSE = 0
# Basic response message definition
ACK_SUCCESS = 0x00
ACK_FAIL = 0x01
ACK_FULL = 0x04
ACK_NO_USER = 0x05
ACK_TIMEOUT = 0x08
ACK_GO_OUT = 0x0F # The center of the fingerprint is out of alignment with sensor
# User information definition
ACK_ALL_USER = 0x00
ACK_GUEST_USER = 0x01
ACK_NORMAL_USER = 0x02
ACK_MASTER_USER = 0x03
USER_MAX_CNT = 1000 # Maximum fingerprint number
# Command definition
CMD_HEAD = 0xF5
CMD_TAIL = 0xF5
CMD_ADD_1 = 0x01
CMD_ADD_2 = 0x02
CMD_ADD_3 = 0x03
CMD_MATCH = 0x0C
CMD_DEL = 0x04
CMD_DEL_ALL = 0x05
CMD_USER_CNT = 0x09
CMD_COM_LEV = 0x28
CMD_LP_MODE = 0x2C
CMD_TIMEOUT = 0x2E
CMD_FINGER_DETECTED = 0x14
Finger_WAKE_Pin = 23
Finger_RST_Pin = 24
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(Finger_WAKE_Pin, GPIO.IN)
GPIO.setup(Finger_RST_Pin, GPIO.OUT)
GPIO.setup(Finger_RST_Pin, GPIO.OUT, initial=GPIO.HIGH)
GPIO.setup(21,GPIO.IN)
GPIO.setup(20,GPIO.OUT)
g_rx_buf = []
PC_Command_RxBuf = []
Finger_SleepFlag = 0
#rLock = threading.RLock()
ser = serial.Serial("/dev/ttyS0", 19200)
#***************************************************************************
# @brief send a command, and wait for the response of module
#***************************************************************************/
def TxAndRxCmd(command_buf, rx_bytes_need, timeout):
global g_rx_buf
CheckSum = 0
tx_buf = []
tx = ""
tx_buf.append(CMD_HEAD)
for byte in command_buf:
tx_buf.append(byte)
CheckSum ^= byte
tx_buf.append(CheckSum)
tx_buf.append(CMD_TAIL)
for i in tx_buf:
tx += chr(i)
ser.flushInput()
ser.write(tx)
g_rx_buf = []
time_before = time.time()
time_after = time.time()
while time_after - time_before < timeout and len(g_rx_buf) < rx_bytes_need: # Waiting for response
bytes_can_recv = ser.inWaiting()
if bytes_can_recv != 0:
g_rx_buf += ser.read(bytes_can_recv)
time_after = time.time()
for i in range(len(g_rx_buf)):
g_rx_buf[i] = ord(g_rx_buf[i])
if len(g_rx_buf) != rx_bytes_need:
return ACK_TIMEOUT
if g_rx_buf[0] != CMD_HEAD:
return ACK_FAIL
if g_rx_buf[rx_bytes_need - 1] != CMD_TAIL:
return ACK_FAIL
if g_rx_buf[1] != tx_buf[1]:
return ACK_FAIL
CheckSum = 0
for index, byte in enumerate(g_rx_buf):
if index == 0:
continue
if index == 6:
if CheckSum != byte:
return ACK_FAIL
CheckSum ^= byte
return ACK_SUCCESS;
#***************************************************************************
# @brief Get Compare Level
#***************************************************************************/
def GetCompareLevel():
global g_rx_buf
command_buf = [CMD_COM_LEV, 0, 0, 1, 0]
r = TxAndRxCmd(command_buf, 8, 0.1)
if r == ACK_TIMEOUT:
return ACK_TIMEOUT
if r == ACK_SUCCESS and g_rx_buf[4] == ACK_SUCCESS:
return g_rx_buf[3]
else:
return 0xFF
#***************************************************************************
# @brief Set Compare Level,the default value is 5,
# can be set to 0-9, the bigger, the stricter
#***************************************************************************/
def SetCompareLevel(level):
global g_rx_buf
command_buf = [CMD_COM_LEV, 0, level, 0, 0]
r = TxAndRxCmd(command_buf, 8, 0.1)
if r == ACK_TIMEOUT:
return ACK_TIMEOUT
if r == ACK_SUCCESS and g_rx_buf[4] == ACK_SUCCESS:
return g_rx_buf[3]
else:
return 0xFF
这是部分代码。
6、后记
(1)有想了解指纹实现的效果,可以关注我的抖音(抖音号:1206268977)
(2)这是实现的web后台,可以点一下链接,详细看一下效果。(基于javaweb实现的后台,就是web的界面就可以命令指纹模块了)账号 :root 密码:root
web后台
承接毕业设计:微信小程序、ssm和树莓派硬件
有开发好的毕业设计可直接购买,价格便宜。
扫描下面二维码加微信(非诚勿扰):