基于树莓派实现指纹模块(指纹门禁)

1、前言
指纹模块和树莓派实现的网上的资料比较少。所以把自己研究成功了的指纹模块给大家分享一下。现在目前市场上指纹模块比较多,大多还支持二次开发,但是难易度不同,一般价格高一点的相对开发简单,很多实现方法都已封装好了。我还是建议买稍微贵一点的,因为我们毕竟不是专业开发和研究它的,能实现我们的功能最好了。这完全是个人的建议。
2、硬件准备
(1)树莓派3b
(2)指纹模块(电容式)
(3)继电器
(4)电磁铁
3、硬件连接
这里重点说一下树莓派和指纹模块的通信的链接,这里用的串口通信,所以通信的针脚是tx和rx。但是这里连接一定得注意,树莓派和指纹模块tx和rx要反的连,意识就是指纹模块的tx连树莓派的rx,指纹模块rx连树莓派tx。
基于树莓派实现指纹模块(指纹门禁)_第1张图片
实物连接就是这样的。其它的这个很简单,我相信大家都会。
4、实物效果图
基于树莓派实现指纹模块(指纹门禁)_第2张图片
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、后记

你可能感兴趣的:(树莓派)