相關(guān)商品
【創(chuàng)客學(xué)堂】借助Arduino做一個RFID門禁系統(tǒng)
編輯:Jason2014-12-15 瀏覽次數(shù):4282
本系統(tǒng)原理是基于非接觸式卡的序列號是唯一的,制造廠家在產(chǎn)品出廠前已將此序列號固化,不可再更改。這樣不同的卡都是唯一的存在,可以利用讀卡器讀取卡的序列號,來判斷卡的擁有者(像我的室友)?;驹砜梢詤⒖枷聢D:
門禁系統(tǒng)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
#include
#include
#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字節(jié)卡序列號,第5字節(jié)為校驗字節(jié)
unsigned char serNum[5];
//寫卡數(shù)據(jù)
unsigned char writeDate[16];
String comdata = “”;
……
//舵機驅(qū)動定義
void servopulse(int angle)//定義一個脈沖函數(shù)
{
int pulsewidth=(angle*11)+500; //將角度轉(zhuǎn)化為500-2480的脈寬值
digitalWrite(servopin,HIGH); //將舵機接口電平至高
delayMicroseconds(pulsewidth); //延時脈寬值的微秒數(shù)
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);
}
} //引用脈沖函數(shù)
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)
總裝實驗
電路連接的部分結(jié)束后,我使用了比較簡陋的紙殼將整個裝置包裝起來。電路部分固定在了里面,再將整個包裝粘合在門后,其中讀卡器是在門縫走線(幸虧是木門)。
介紹視頻如下:
后記
以上只是我想法的最基礎(chǔ)版本,可以說是系統(tǒng)1.0版吧,但這樣已經(jīng)完成了最初的預(yù)想。我想這個基礎(chǔ)版還是有很大的發(fā)展空間,完全可以基于此,進一步使整個寢室智能化。下一步我想加強系統(tǒng)的穩(wěn)定性,以及增加密碼鍵功能,開發(fā)出后續(xù)版本。也希望有興趣的朋友那個給出寶貴的建議,大家一起分享快樂。
相關(guān)文章:
玩轉(zhuǎn)Arduino-脈寬調(diào)制(PWM)實例
用戶評價
暫時還沒有任何用戶評論