如何将宿舍门变成指纹开锁?

一、序言

话不多说,先上图

这里写图片描述

这里写图片描述

在写自己的整个心路历程之前,想先说明几点,以防大家喷:

1.我只是做着玩,怎么方便怎么来,电路乱但我看着爽,懒得整理。
2.我一点也不懂电路,用的都是某宝买的模块,真的不会什么放大电路,电源也不会做,求说我浪费的大大绕个路,模块都是我用奖学金买的,我自己觉得开心就好。
3.做这个的目的是,舍友一直忘记带钥匙,可以增加一种开门的选择,纯属好玩。我们寝室平时都不断电,只有在半夜11点才断电。假如有哪一天,四个人都忘了带钥匙,并且寝室碰巧断电,那我也认了,只能硬着头皮去找宿管大爷了QAQ
4.说我乱拉电线、损坏公物什么什么的,我们寝室已经很破了,如果学校真让我们赔钱换个新门,我一点也不介意,就当是造福下一代了。什么通告批评、处分之类的我不怕的。。。

二、我用了一些什么东西

以前用旧的单片机开发板、指纹模块、电磁铁、继电器、声音录放模块、开关电源、排插、螺丝、螺丝刀、电线、电钻(只能钻门了=。=)。

三、模块分析

想了想,我这个东西可以大概分为三个模块: 声音模块、指纹模块、开锁模块,中控用的是51单片机开发板,我知道用一整个板子很浪费,用一个最小系统就好了,但是我平常几乎不用单片机,所以放那里也是浪费,这点大家就不用喷我啦。

A.声音模块
ISD1820录放模块

这个模块使用起来很简单,在自己调试的时候不用接单片机,电源VCC端接在单片机开发板的5V,GND接单片机开发板的GND,然后按住REC说话,可以将自己的声音录进去,播放用其他两个键就可以啦。我用这个模块的目的是进门的时候,如果有软萌软萌的声音跟你说“欢迎光临”的话。。咳咳,想想就很心动。
如果调试成功的话,将左边的P-L端,接在单片机的IO口,输出高电平就可以播放欢迎语啦。

这里写图片描述

B.指纹模块

先看一下实物图

这里写图片描述

我买的这个指纹模块有6个接口,从左到右分别是:
探测手指电路电源、模块电源正输入端、TXD、RXD、GND、手指探测信号输出
解释一下:手指探测电路,也就是接口1和接口6是为了减小指纹模块的损耗,在实际使用中不用也行,编程时候只要循环获取手指图像就好了,但这么好的功能怎么能不用呢!有一点需要注意一下,接口6在探测到手指时,会开漏输出低,需要接上拉电阻,然后接到单片机的外部中断0处就好了。

这里写图片描述

C.开锁模块

这个是我当时有做指纹开门想法的时候,最纠结的一块了。声音和指纹都很好想,但是开门要怎么开?要用什么开?于是我就百度,看到了一张图给了我灵感,那就是用电磁铁,可以利用电磁铁通电瞬间的吸力,将门锁拉开。那如何控制电磁铁呢?大概的想法就是利用继电器控制电磁铁的电源,如果指纹比对通过的话,单片机输出信号给继电器,然后继电器的常断端闭合,电磁铁把锁拉开。

这里写图片描述

三、So Easy的编程
单片机的编程很简单,会编写串口通信那部分就好了,指纹模块购买之后,卖家会给你它的使用文档,里面有通信协议。什么是通信协议呢,就是你的指纹模块收到什么指令会进行采集图像,收到什么指令会进行指纹比对等等。那指令只能靠单片的TXD发啦。我们来整理一下编程思路:

这里写图片描述

四、下面贴出主要源码

  • fingerPrint.c
#include <reg52.h>
#include "qxmcs51_config.h"
#include    "delay.h"      
#include    "uart.h"
#include <stdio.h>
#include <intrins.h>

unsigned char FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; 
 //协议包头
unsigned char FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};   
 //获得指纹图像
unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; 
//将图像放入到BUFFER1
unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; 
//将图像放入到BUFFER2
unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2};
 //搜索指纹搜索范围0 - 929

//以上可以根据通信协议写出

extern unsigned char RECEVICE_BUFFER[24];


sbit beep = P2^3;
sbit door = P1^2;
sbit voice = P1^3;




void GetImage()                 //获取指纹图像 
{ 
  unsigned char i;
  for(i=0;i<6;i++) //发送包头
       Send_uart(FP_Pack_Head[i]);
  for(i=0;i<6;i++) //发送命令
       Send_uart(FP_Get_Img[i]);
       Recevice_Data(0x0C);
}

void GenChar()                   //提取指纹特征
{ 
  unsigned char i;
  for(i=0;i<6;i++) //发送包头
       Send_uart(FP_Pack_Head[i]);
  for(i=0;i<7;i++) //发送命令
       Send_uart(FP_Img_To_Buffer1[i]);
  Recevice_Data(0x0C);

}

void Search()                   //在指纹库中进行比对
{
  unsigned char i;
  for(i=0;i<6;i++) //发送包头
       Send_uart(FP_Pack_Head[i]);
  for(i=0;i<11;i++) //发送命令
       Send_uart(FP_Search[i]);
  Recevice_Data(0x10);
    if(RECEVICE_BUFFER[9]==0x00)
    {
        door = 0;
        voice = 1;
        Delay_Ms(2000);
        door = 1;
    }
    else
    {
        door = 1;
        voice =0;
    } 

}
  • uart.c
#include <reg52.h>
#include <stdio.h>
#include    "delay.h"
#define uchar unsigned char
#define uint  unsigned int

volatile unsigned char RECEVICE_BUFFER[24];

void UART_init()
{   
    SCON = 0x50;
    TMOD = 0x21;
    TCON = 0x40;    
    TH1 = 0xFF;
    TL1 = 0xFF;
    PCON = 0x80;
    RI = 0;        
    TI = 0;         
    TR1 = 1;            
    EA  = 1;        //开总中断
    ES  = 1;        //串口中断打开
    EX0 = 1;
    IT0 = 0;

}

void Send_uart(unsigned char c)
{

    SBUF = c;
    while(!TI);
    TI = 0;

}

unsigned char Receive_uart()
{   
    unsigned char dat;
    while(!RI);
    RI = 0;
    dat = SBUF;
    return (dat);

}

void Recevice_Data(unsigned char length)
{
  unsigned char i;

  for (i=0;i<length;i++)
     RECEVICE_BUFFER[i] = Receive_uart();

}
  • main.c
#include "qxmcs51_config.h"
#include    "delay.h"      
#include    "uart.h"
#include   "GetImage.h"
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>

extern voice;

void main()
{      
       Delay_Ms(100);
       UART_init();
       voice = 0;
       while(1);                                       
}

void int0() interrupt 0
{       

       GetImage();
       GenChar();
       Search();

}

五、总结一下下

学校附近很坑,各种材料都没有地方能买,只能从某宝买,我觉得我等快递的时间比我真正做东西的时间还长QAQ。其实还有很多小细节没有写,比如电磁铁的要求电压是24V,电流6A,那我怎么得到这样的电压电流呢。。因为我真的不懂电路,所以只能买了一个24V,10A的开关电源。还有电磁铁的拉力至关重要,第一次买的电磁铁拉力太小拉不开,只好又买了一个拉力大的。甚至螺丝的大小都要量一下,不然东西固定不到门上。然后还有单片机怎么供电?开关电源怎么供电等等,这些都是需要考虑的问题啦。
所以做完这个东西虽然花了不少钱,但还是蛮开心的,学到的东西还算是有点用?
大家有什么问题可以评论里问啦。
再加一句,大神不要来嘲笑我!!!我只是一个渣渣。。。。

over。。。

展开阅读全文

没有更多推荐了,返回首页