目录

  • 0x00 前言
  • 0x01 材料
  • 0x02 连接
  • 0x03 编程
  • References


0x00 前言

本人由于过于懒惰,同时又发现宿舍门实在简陋,2021年了都不能刷校园卡进门,正值暑假留校,就突然想整整活,打造一个智能化宿舍。

0x01 材料

  • arduino uno 开发板,便宜的一般¥20左右,正版贵一点,但没有使用区别
  • mg90s舵机
  • rc522模块
  • 公对公和母对母杜邦线若干
  • 充电宝
  • 502胶水 或者 强力双面胶 或者 热熔胶+胶枪

0x02 连接

nfc模块使用 nfc模块贵吗_nfc模块使用

按照图示连接好后就可以将驱动板通过USB接口连接上电脑了,下载好Arduino IDE,可以在微软商店直接下载,还可以到官网下载:

Software

安装好后,同时保证开发板的驱动程序也安装好,驱动程序的安装程序可以问买家要。

打开Arduino IDE,在工具-端口中选择合适的端口,开发板选择Arduino uno,然后就可以烧录程序了。

0x03 编程

项目地址:

GitHub - yym68686/Arduino-uno-NFC: 使用Arduino uno开发板实现识别NFC并驱动MG90S舵机

项目文件目录:

│  readme.md         
│  
├─final
│      final.ino    #实现识别NFC并驱动MG90S舵机的程序
│      RC522.cpp    #NFC读卡器的源码
│      RC522.h      #NFC读卡器的头文件
│      
├─mg90s
│      mg90s.ino    #单独测试舵机的程序
│      
└─reader
        RC522.cpp   #NFC读卡器的源码
        RC522.h     #NFC读卡器的头文件
        reader.ino  #单独测试读卡器是否正常工作的程序

final.ino源代码:

#include "RC522.h" //RC522模块所需头文件
#include <SPI.h>
#include <Servo.h>
#include <string.h>
#include <math.h>

Servo myservo;           // 创建一个伺服电机对象
unsigned char serNum[5]; //ic卡的id码
int decid = 0;
int i = 0;

void setup()
{
    Serial.begin(9600);
    Serial.println("welcome!");
    SPI.begin();

    pinMode(chipSelectPin, OUTPUT);
    digitalWrite(chipSelectPin, LOW);
    pinMode(NRSTPD, OUTPUT);
    myservo.attach(8); // 8号引脚输出舵机的控制信号
    MFRC522_Init();
    myservo.write(0); //舵机初始角设为0
    pinMode(8, OUTPUT);
}

int time = 0;

void loop() //持续检测是否感应到ic卡
{
    decid = 0;
    myservo.write(0);
    unsigned char status; //状态变量
    unsigned char str[MAX_LEN];
    status = MFRC522_Request(PICC_REQIDL, str); //传入卡状态,2为无卡,0为感应到卡
    if (status == MI_OK) //读取到ID卡时候,MI_OK=0
    {
        status = MFRC522_Anticoll(str);
        if (status == MI_OK) //下一个时刻仍能读取到ID卡
        {
            memcpy(serNum, str, 5);
            Serial.print("ID:");
            ShowCardID(serNum); //输出卡ID,16进制

            unsigned char *id = serNum;
            if (id[0] == 0x70 && id[1] == 0x52 && id[2] == 0x22 && id[3] == 0x85) //这里和下面的星号都是需要替换的。每一个循环是一张卡的id,如果要增加或者减少卡片张数自己修改代码改变循环就行
            {
                myservo.write(90); // 打开舵机
                Serial.println("The Host 1!");
                delay(1300);
                myservo.write(0);
            }
            for (i = 0; i < 4; i++)
            {
                decid = decid + id[i] * pow(16, i); //16转10进制
            }
            Serial.print("DECID:");
            Serial.println(decid); //输出卡DECID,10进制

            switch (decid)
            {
            case 26989:  //lzs card    //允许通过的卡ID
            case 6005:   //smk phone
            case -27841: //ycl phone
                         //若需要添加新卡,在此处新添加一个case XXXX:

                Serial.println("Pass!");
                myservo.write(180); //舵机转180度

                for (; status == MI_OK;) //若卡一直贴在感应器上,保证门锁始终打开
                {
                    delay(2000); //添加2s的刷卡延迟,方便单手开门
                    MFRC522_Halt();
                    delay(100);
                    status = MFRC522_Request(PICC_REQIDL, str); //读取记录此时的卡状态
                    memcpy(serNum, str, 5);
                }

                myservo.write(0); //舵机转回
                break;            //跳出case

            default: //如果不在允许的ID中

                Serial.println("Strange Card");
                delay(10000); //暂停10秒
                break;        //跳出default
            }
        }
    }
    MFRC522_Halt();
    delay(500); //每0.5s检测一次
}

注意事项:

  • 调试输出可以用工具-串口监视器来查看。
  • 可以用这个名为NFC Tools软件:
    NFC Tools - Apps on Google Play来提取校园卡的编码。