设为首页收藏本站

极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13424|回复: 101

【占坑】抛弃钥匙,寝室RFID门禁系统进化史...

  [复制链接]
发表于 2014-1-2 17:11:48 | 显示全部楼层 |阅读模式
本帖最后由 code-AR 于 2014-4-7 15:26 编辑

       不知道大家是否在学校生活中常常会有忘带钥匙的情况出现,每当忘带钥匙,室友不在寝室的话,站在寝室外等待各种尴尬。同时不知道是不是学校门锁老旧,开门比较纠结花时间。那时候就有制作自动门锁的想法。后来入手了RFID读卡器,可以正常读取市面上的Mifare S50,S70非接触智能卡,像学校的饭卡就可以读取。就构想了这个基于RFID的寝室门禁系统。
        系统原理是基于非接触式卡的序列号是唯一的,制造厂家在产品出厂前已将此序列号固化,不可再更改。这样不同的卡都是唯一的存在,可以利用读卡器读取卡的序列号,来判断卡的拥有者(像我的室友)。基本原理可以参考下图:

原理

原理

           
寝室RFID门禁系统1.0
        首先来一张全景图吧。
         

全图

全图

        
(1)        准备工作
制作材料:
        Arduino UNO
        NOKIA 5110液晶屏
        RFID-RC522读卡器
        MG-996R舵机
        移动电源

器件

器件


舵机

舵机
   

移动电源

移动电源


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

(2)        软件部分
主控部分用的的是Arduino Uno,使用了arduino IDE 1.04。
代码如下:
[pre lang="arduino" line="1"]#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--读卡器SDA引脚、D8--读卡器RST引脚

//4字节卡序列号,第5字节为校验字节
unsigned char serNum[5];

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

{

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

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

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

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

  delayMicroseconds(20000-pulsewidth);

}
void setup()
{
   myGLCD.InitLCD();
  Serial.begin(9600);
  pinMode(BL,OUTPUT);
  pinMode(servopin,OUTPUT);
  myGLCD.setFont(SmallFont);
  SPI.begin();
  rfid.init();
}

void loop()
{
/* int val1=analogRead(sensor);
if(val1>200)
  {analogWrite(BL,512);}
  else
  {digitalWrite(BL,LOW);}*/
//通过光敏,控制5110的背光

  long randNumber = random(0, 20);

  
  unsigned char i,tmp;
  unsigned char status;
  unsigned char str[MAX_LEN];
  unsigned char RC_size;

  //找卡
  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]==170||rfid.serNum[0]==219||rfid.serNum[0]==117||rfid.serNum[0]==155){
      for(int i=0;i<100;i++)
      {
        servopulse(45);
        if(rfid.serNum[0]==205||rfid.serNum[0]==117||rfid.serNum[0]==155)
        {
          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]==219)
        {
          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]==170)
        {
          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();                //指挥卡进入睡眠模式            
  }[/pre]
      
这里有两个库文件
LCD5110_Graph.zip (404.98 KB, 下载次数: 182)
回复

使用道具 举报

 楼主| 发表于 2014-1-2 17:12:41 | 显示全部楼层
本帖最后由 code-AR 于 2015-5-16 18:52 编辑

占楼备用...

      占楼一年多了,还是没填坑。惭愧呀!!!

      现在填些坑吧,后来版本我加入了休眠机制,进一步降低了功耗,一块5000mAH的移动电源可以支持一个星期没问题。新版本在我的寝室已经正常工作了半年多了吧。如果还想减低功耗,就要自己绘制电路开板了,麻烦了就搁置了。
     硬件方面就是比原来的版本多了个外部唤醒的开关,去除了内部的显示屏,在这里把新的代码贴下
[pre lang="arduino" line="1"]#include<SPI.h>
#include<RFID.h>
#include <Enerlib.h>//低功耗公共库
#define servopin 7

Energy energy;             // 宣告"Energy"程式物件

const byte swPin = 2;      // 外部开关引脚
byte times = 0;            // 记录睡眠状态
volatile byte state = 0;  

RFID rfid(10,8);
//4字节卡序列号,第5字节为校验字节
unsigned char serNum[5];

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

{

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

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

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

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

  delayMicroseconds(20000-pulsewidth);

}
void wakeISR() {
  if (energy.WasSleeping()) {
    state = 1;
  }
  else {
    state = 2;
  }
}

void setup()
{
  //Serial.begin(9600);
  attachInterrupt(0, wakeISR,RISING);//CHANGE);
  pinMode(servopin,OUTPUT);
  SPI.begin();
  rfid.init();
}

void loop()
{
  unsigned char i,tmp;
  unsigned char status;
  unsigned char str[MAX_LEN];
  unsigned char RC_size;

  if (state == 1) {
    //Serial.println("Was sleeping...");
  }
  else if (state == 2) {
    //Serial.println("Was awake...");
  }
  state = 0;

  //找卡
  rfid.isCard();
  //读取卡序列号
  if (rfid.readCardSerial())
  {
    if(rfid.serNum[0]==155||rfid.serNum[0]==234||rfid.serNum[0]==219){
      for(int i=0;i<100;i++)
      {
        servopulse(45);        
      }      //引用脉冲函数
      delay(3000);
      for(int i=0;i<100;i++)
      {
        servopulse(0);
      }
    }
  }  
  if (!rfid.readCardSerial()){
    digitalWrite(servopin,LOW);  
  }
  if(!rfid.isCard())
  {
    energy.PowerDown();      
  }
  rfid.halt();                //指挥卡进入睡眠模式
}

[/pre]

低功耗库下方
Enerlib.zip (2.34 KB, 下载次数: 59)

点评

本人信任一个请问怎么接线,跪求接线图真的跪求!没有图没事说一下就好!本人q906306092希望在这个星期可以得到回复真的谢谢了!  发表于 2015-8-20 00:20
回复 支持 反对

使用道具 举报

发表于 2014-1-2 17:38:07 | 显示全部楼层
哈哈,小心读卡模块被人偷走哦~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-1-2 17:53:28 | 显示全部楼层
读卡器放在门里边读不到卡吗?如果被人拿走不哭死,移动电源多长时间充次电?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-2 18:59:50 | 显示全部楼层
Cupid 发表于 2014-1-2 17:53
读卡器放在门里边读不到卡吗?如果被人拿走不哭死,移动电源多长时间充次电?

一般可以支持3-4天,所以希望改进供电部分。
回复 支持 反对

使用道具 举报

发表于 2014-1-2 19:20:20 来自手机 | 显示全部楼层
Damn_intuition 发表于 2014-1-2 17:38
哈哈,小心读卡模块被人偷走哦~~~~~

嗯嗯,直接拿走好了
回复 支持 反对

使用道具 举报

发表于 2014-1-2 22:12:59 | 显示全部楼层
几十块买个磁性门锁,控制电路依然是你那套东西,完美了
回复 支持 反对

使用道具 举报

发表于 2014-1-2 23:03:27 | 显示全部楼层
pipapi 发表于 2014-1-2 22:12
几十块买个磁性门锁,控制电路依然是你那套东西,完美了

有道理 这个应该是个比较好的方案 我也看一下比如下面这个

http://item.taobao.com/item.htm? ... &id=18770053569
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-3 00:06:10 | 显示全部楼层
pipapi 发表于 2014-1-2 22:12
几十块买个磁性门锁,控制电路依然是你那套东西,完美了

这个是寝室,还不太敢拆门锁
回复 支持 反对

使用道具 举报

发表于 2014-1-3 09:29:45 | 显示全部楼层
门是铁的吗?隔着铁不是RC522不能用了吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号  

GMT+8, 2016-9-30 04:20 , Processed in 0.262145 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表