借助Arduino做一个RFID门禁系统

分享到:

在学校生活中偶尔会遇到忘带钥匙的情况出现,如果室友碰巧也不在寝室的话,自己只能站在寝室外等待。同时不知道是否宿舍门锁老旧的原因,开门比较纠结花时间,时常有制作自动门锁的想法。后来入手了RFID读卡器,可以正常读取市面上的Mifare S50,S70非接触智能卡(学校的饭卡就可以读取),于是就构想了这个基于RFID的寝室门禁系统。

本系统原理是基于非接触式卡的序列号是唯一的,制造厂家在产品出厂前已将此序列号固化,不可再更改。这样不同的卡都是唯一的存在,可以利用读卡器读取卡的序列号,来判断卡的拥有者(像我的室友)。基本原理可以参考下图:

             门禁系统1.0

制作材料:

Arduino UNO

NOKIA 5110液晶屏

RFID-RC522读卡器

MG-996R舵机

移动电源

首先,是将RFID-RC522和UNO连接起来,这个读卡器是基于SPI通讯。但这里有一个封装比较好的库文件支持RC522,可以自定义SPI针脚位。NOKIA 5110液晶屏也有库文件——支持画图,中文显示,可以自定义针脚位。因为开启门锁需要较强拉力,这样MG-996R所需电量比较大,实际使用时,需要给舵机单独供电。

软件部分

主控部分用的的是Arduino Uno,使用了arduino IDE 1.04,部分代码如下:

//端口定义

#include <SPI.h>

#include <RFID.h>

#include <LCD5110_CN.h>

#define servopin 7

#define sensor 0

#define BL 9

LCD5110 myGLCD(2,3,4,5,6);//CLk-SCK,Din-MOSI,DC,RST-IO,CS-CE

extern uint8_t SmallFont[];

RFID rfid(10,8); //D10–读卡器MOSI引脚、D5–读卡器RST引脚

//4字节卡序列号,第5字节为校验字节

unsigned char serNum[5];

//写卡数据

unsigned char writeDate[16];

String comdata = “”;

……

//舵机驱动定义

void servopulse(int angle)//定义一个脉冲函数

{

int pulsewidth=(angle*11)+500; //将角度转化为500-2480的脉宽值

digitalWrite(servopin,HIGH); //将舵机接口电平至高

delayMicroseconds(pulsewidth); //延时脉宽值的微秒数

digitalWrite(servopin,LOW); //将舵机接口电平至低

delayMicroseconds(20000-pulsewidth);

}

//工作使能

long randNumber = random(0, 20);

unsigned char i,tmp;

unsigned char status;

unsigned char str[MAX_LEN];

unsigned char RC_size;

while (Serial.available() > 0)

{

comdata += char(Serial.read());

delay(2);

}

for(int i=0;i<16;i++)

{

writeDate[i]=comdata[i];

}

//找卡

rfid.isCard();

//读取卡序列号

if (rfid.readCardSerial())

{

Serial.print(“The card’s number is : “);

Serial.print(rfid.serNum[0]);

Serial.print(” , “);

Serial.print(rfid.serNum[1],BIN);

Serial.print(” , “);

Serial.print(rfid.serNum[2],BIN);

Serial.print(” , “);

Serial.print(rfid.serNum[2],BIN);

Serial.print(” , “);

Serial.print(rfid.serNum[4],BIN);

Serial.println(” “);

if(rfid.serNum[0]==205||rfid.serNum[0]==21||rfid.serNum[0]==85||rfid.serNum[0]==117){

for(int i=0;i<100;i++)

{

servopulse(45);

if(rfid.serNum[0]==205||rfid.serNum[0]==117)

{

myGLCD.clrScr();

Serial.println(“Welcome Mr.Xiao”);

myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber));

myGLCD.print(“Mr.Xiao”,int(randNumber)+20,int(randNumber)+20);

analogWrite(BL,HIGH);

}

if(rfid.serNum[0]==85)

{

myGLCD.clrScr();

Serial.println(“Welcome Mr.Yang”);

myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber));

myGLCD.print(“Mr.Yang”,int(randNumber)+20,int(randNumber)+20);

digitalWrite(BL,HIGH);

}

if(rfid.serNum[0]==21)

{

myGLCD.clrScr();

Serial.println(“Welcome Mr.Huang”);

myGLCD.print(“Welcome”,int(randNumber)+20,int(randNumber));

myGLCD.print(“Mr.Huang”,int(randNumber)+20,int(randNumber)+20);

digitalWrite(BL,HIGH);

}

} //引用脉冲函数

delay(3000);

for(int i=0;i<100;i++)

{

servopulse(0);

}

}

}

if (!rfid.readCardSerial()){

digitalWrite(servopin,LOW);

digitalWrite(BL,LOW);

}

rfid.halt(); //指挥卡进入睡眠模式

}

这里有两个库文件。(RFID.h, LCD5110_CN.h)

总装实验

电路连接的部分结束后,我使用了比较简陋的纸壳将整个装置包装起来。电路部分固定在了里面,再将整个包装粘合在门后,其中读卡器是在门缝走线(幸亏是木门)。

介绍视频如下:

后记

以上只是我想法的最基础版本,可以说是系统1.0版吧,但这样已经完成了最初的预想。我想这个基础版还是有很大的发展空间,完全可以基于此,进一步使整个寝室智能化。下一步我想加强系统的稳定性,以及增加密码键功能,开发出后续版本。也希望有兴趣的朋友那个给出宝贵的建议,大家一起分享快乐。

继续阅读
Arduino厨房定时器教程,原理图+源码

一个基于Arduino UNO的经典厨房定时器,带LCD显示屏和蜂鸣器

物联网、云计算、大数据、人工智能,这几个概念有什么区别?

物联网在之前被定义为通过射频识别(RFID)、红外线感应器、全球定位系统、激光扫描器、气体感应器等信息传感设备按约定的协议把任何物品与互联网连接起来进行信息交换,以实现智能化识别、定位、跟踪、监控和管理的一种网络,简言之物联网就是“物物相连的互联网”。

Arduino,你为什么这么红?

如果浏览5—10年前的电子制作资料,你一定可以看到五花八门的单片机选型、各种手工焊制的电路板、纷繁复杂的飞线……而近几年的各种基于单片机的电子制作,则统一了许多,各种不同领域、不同功能的电子DIY作品,大都采用了同一种控制模块为核心——Arduino。

一篇帖子让你学会Arduino!从基础到实战

论坛里有很多不错的Arduino教程,为了能让大家更加方便的找到这些资料,增加一个帖子来存放链接。 大家可以通过这个帖子,从而找到社区内Arduino的分类资源,不必再东翻西找。

图解让Arduino支持DigisparkArduino

以前DigisparkArduino在SourceForge上提供了专用版的Arduino IDE,但是很久没有更新,而且支持的板子较少,不方便。现在在DigisparkArduino的网站上看到了新的方法,可以让最新的Arduino IDE直接支持DigisparkArduino开发板。

©2017 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss