寝室自制智能NFC门禁

起因

暑假申请了返校准备比赛,感觉疫情一个学期没有怎么锻炼了,晚上准备跑回宿舍。但是跑步的时候带钥匙太慢了,于是忙里抽闲,做了一个NFC的门禁(这样我就有理由买小米手环了hhh)

结果图

先上结果图

java 生成门禁卡 门禁卡制作设备_github

原理比较简单,寝室是老式的插销,所以可以直接通过MG90s的舵机来驱动(和SG90s舵机比起来力量更大)。

正好手里还有一块上个项目留下来的Arduino UNO R3的板子,由此电源和连接的问题就比较简单了(然而还是焊接了下RC522模块),电源可以使用移动电源(我用的是锂电池),连接部分就可以使用杜邦线了。

初版只有NFC,以后有时间可以用树莓派做个中控,加一下红外模块和摄像。


器件:
1.Arduino UNO R3模块
2.RC522模块(会用电烙铁的话没事,不会用电烙铁的话最好找商家焊好排针,不过可能要多收钱,焊接弯针最好)
3.杜邦线若干
4.锂电池和锂电池的线
5.MG90s舵机一个
6.蜂鸣器(可以不加)
7.胶枪,502,胶带

Tips1:其他单片机平台(stm32或者51)也可,RC522的代码很简单,也有官方的github仓库

Tips2:这里简单说一下,有不知道杜邦线和舵机是什么的小伙伴。简单讲一下,舵机就是一个机器,上面有可以旋转的轴,也因此可以拉动插销。杜邦线有公对母,母对母,公对公的区别,主要就是公的代表是插头,母的代表是插座,具体选什么还是要看寝室的具体情况,线的长度可能也需要具体情况具体讲,不过可以先买30cm的,我的是够用的。

连线图

java 生成门禁卡 门禁卡制作设备_java 生成门禁卡_02


如果不想加蜂鸣器的话可以选择不加蜂鸣器,就把最下面的那个东西的连线都去掉就可以了。

还是不知道怎么连线或者用其他单片机的小伙伴,可以参考RC522的官方github仓库,里面解释比较详细
https://github.com/miguelbalboa/rfid

代码

#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
#define N 2
#define M 4

static const unsigned char f[N][M] =
{
    {0x, 0x, 0x, 0x}, 
    {0x, 0x, 0x2E, 0x}, 
};

MFRC522 mfrc522(10, 9);
Servo mg90s;

void setup()
{
    SPI.begin();

    mg90s.attach(6);
    mg90s.write(0);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    
    return;
}

void loop()
{
    static int c;
    int i, j;
    
    if(mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial())
    {
        for(i = 0; i < N; i ++)
        {
            for(j = 0; j < M; j ++)
                if(mfrc522.uid.uidByte[j] != f[i][j])
                    break;
            if(j == M)
            {
                mg90s.write(180);
                Serial.print("111");
                delay(250);
                
                delay(2750);
                mg90s.write(0);
                c += 3;
                break;
            }
        }
    }
    else
    {
        delay(100);
        c ++;
    }


    if(c >= 20)
    {
        c = 0;
        SPI.end();
        SPI.begin();
        mfrc522.PCD_Init();
        
    }

    return;
}

简单解释一下代码,整体原理是RC522读取卡上的UID之后会和写死在代码里的UID进行比对,如果比对成功,就会驱动舵机,**f[N][M]**里面放的是所有人的UID,N是你写的卡的个数。
Tips:获取卡片UID的方式,比如校园卡,如果你有一个支持NFC的手机,可以下载一个软件查看UID,如果没有就复杂一些,建议借一个带NFC的手机。(比如我,惨兮兮,是通过实验室的门禁知道的,实验室门禁扫描到卡的时候,会在显示屏上显示UID)