时间:2024-07-28
王 斌,施 杰,孙 鹏,董子琨,沈 鹏,宁旺云
(云南农业大学机电工程学院,云南 昆明 650201)
由于住宅、办公楼等场所盗窃、伤害等事件频发[1],因此对门禁系统的安全性要求越来越高。目前常见的门禁系统主要有机械式、电子密码式、射频识别式、生物识别式(指纹识别、人脸识别)等,一般都是单重认证,它们在使用安全性、制造成本等方面各有优劣。如传统的机械门锁使用不隐蔽且钥匙易遗失、损坏;普通电子密码锁存在密码易泄露、按键易失灵的缺点[2];射频识别门禁系统虽然应用最广泛,成本也较低,但存在认卡不认人的缺陷;生物识别门禁系统无需携带卡片等介质,识别重复率低,安全性也高,但识别速度慢、制造成本较高。除机械式门禁系统外,其他门禁系统还普遍存在系统断电时无法开锁的缺陷。
本文在Proteus软件平台上,设计了一种以Arduino单片机为控制单元,将密码判断与射频识别有机结合的双重认证门禁系统,通过多次Proteus仿真与对原型系统功能实际测试,结果表明:该系统具有断电定时开锁、声光报警、门禁管理、人机交互等功能,与目前常见单重认证门禁系统相比具有成本低、安全性高、维护方便等优点,可推广使用。
如图1所示,该系统具有断电定时开锁、身份认证、声光报警、门禁管理(密码修改、IC卡授权与撤销,IC卡个人信息修改)、人机交互(时间显示、持卡人信息显示、欢迎与警告界面显示)等功能。
双重认证门禁系统的工作流程如图2所示。当系统运行时,显示模块显示当前时间,并提示用户输入密码,系统将输入的密码与系统设定的密码进行比较,若正确,绿灯点亮同时显示模块提示用户输入IC卡,接着射频识别模块检测是否有IC卡靠近,若有,读取IC卡的ID号,同时判断该卡是否已经授权,若授权,显示模块和声光报警模块开启欢迎模式,开锁控制模块完成开锁动作;若密码输入错误2次或IC卡为未授权卡,声光报警模块则开启报警模式。
图1 系统功能结构图
该双重认证门禁系统主要由单片机控制单元、射频识别模块、矩阵键盘密码输入模块、LCD1602显示模块、声光报警模块、时钟模块、开锁控制模块、断电定时开锁模块组成。经综合考虑,系统选择Arduino Mega 2560单片机作为核心控制单元。
Arduino Mega 2560单片机是Arduino单片机中的高端产品,它的处理器为ATmega 2560,具有54个数字输入输出接口、16个模拟输入输出接口、1个USB接口及8KB RAM和4KB EEPROM、128KB闪存[3],因此能最大程度地满足系统开发的要求。
图2 系统工作流程图
系统硬件结构如图3所示,各模块与Arduino Mega 2560单片机不同的引脚连接完成后就组成了双重认证门禁系统的硬件。
图3 系统硬件结构图
1)射频识别模块。
选取MFRC522作为系统的射频识别模块。由于其天线是内置在芯片中的,因此该模块具有体积小、安全系数高等优点。该模块与单片机之间采用SPI接口进行通信,精度高且工作稳定。用户使用S50 IC卡与该射频识别模块中的读卡器进行无线通信以达到身份验证的目的,读卡器还支持写的工作模式,修改用户信息较简便。
2)时钟模块。
从方便使用的角度考虑,该模块采用美国DALLAS公司推出的一种高性能、低功耗、带RAM的RTC实时钟——DS1307时钟芯片[4]。DS1307时钟芯片外接频率为32.768kHz的晶体谐振器和3V的银芯纽扣电池以及100μF的电容,因为32.768kHz=215Hz,即分频15次后为1Hz,周期=1s,所以选用32.768kHz的晶体谐振器较合适[5]。3V银芯纽扣电池为备份电源,保证主电源关闭后时钟仍能正常运行。时钟电路原理图如图4所示。
图4 DS1307时钟芯片电路原理图
3)开锁控制模块。
如图5所示,开锁控制模块由继电器、1N4001型二极管、2N2222型三极管、电阻、外部电源以及电磁门锁装置构成。由于Arduino单片机的数字引脚最大输出电流小于40mA,而该模块中继电器的工作吸合电流为65mA,单片机引脚输出电流达不到驱动继电器的吸合电流,故必须选用合适的三极管来放大电流。
图5 开锁控制模块电路原理图
当三极管由放大状态变为截止状态时,继电器线圈会产生一个过大的反向电压即自感电动势,该反向电压与电源电压叠加后加到三极管集电极、发射极上,可能导致发射极被击穿。为防止反向击穿,在继电器线圈两端反向并联一个续流二极管,通过续流二极管导通形成的环流将自感电压释放,起到保护三极管的作用。由于本模块中电磁锁的额定电压为直流12V,与单片机额定电压5V不同,为方便起见,采用4节3V可充电电池供电。
4)声光报警模块。
如图6所示,该模块由红色LED、绿色LED、蜂鸣器、限流电阻组成。单片机控制单元将检测到的数据与存储的数据进行比对,若相同则绿色LED亮,蜂鸣器发出乐曲声,反之则红色LED亮,蜂鸣器发出警报声。发光二极管也具有单向导通性,通过5mA左右的电流即可正常发光,且电流越大,二极管亮度越高,但是倘若电流过大,则影响其寿命甚至直接烧毁。Arduino电源额定电压VCC为5V,据此可算出发光二极管的限流电阻R1=R2=5V/5mA=1kΩ,因此在发光二极管一侧加上阻值为1kΩ的限流电阻即可保证其正常发光。声光报警模块不仅包括发光二极管还应包括一只蜂鸣器用于发出警报。只有当大于20mA的电流通过时,蜂鸣器才发出警报声,据此计算出其限流电阻值为R9=5V/20mA=250Ω。因此在蜂鸣器一侧串联1个100Ω的电阻,即可保证蜂鸣器正常工作。
图6 声光报警模块电路原理图
5)断电定时开锁模块。
目前常见的门禁系统普遍存在系统断电时无法开锁的问题。为解决此问题,本系统特别设计了断电定时开锁模块,如图7所示,该模块由按钮、开关、下拉电阻组成。当系统断电时,用户可先通过充电宝等外接电源给系统供电,然后进入设定时间界面:当开关1或开关2被按下时,数字引脚13为+5V(高电平),未按下时接地为0V(低电平),读取该引脚的电平值,可以知道是处于时间设置模式(引脚13为高电平)还是开锁触发模式(引脚12为高电平),或是只处于显示时间模式(引脚13和引脚12都为低电平)。若引脚13为高电平,则进入设定时间模式,为防止陌生人利用系统断电的情况给系统外接电源进行开锁,系统首先要求用户输入密码,密码正确才能设定时钟和分钟。当按下按钮1或按钮2时,系统检测到引脚11或引脚10为高电平,分别增加时钟或分钟,然后按下按钮2,系统显示当前时间,最后按下按钮1,触发开锁模式,以此来实现断电定时开锁的功能。综合考虑功耗节约与足够的电流驱动,选用330Ω的下拉电阻。
图7 断电定时开锁模块电路原理图
6)其他模块。
矩阵键盘密码输入模块采用的是4×4矩阵键盘。用户通过键盘输入密码,控制单元根据输入密码的有效性控制其他模块做出相应的操作。
LCD1602显示模块由LCD1602显示屏和电位器构成,可显示数字、字符和字母,实现人机信息交互,其工作电压为3.3V~5V。显示屏的对比度由电位器调节。正常运行状态下显示当前时间,开锁过程中显示输入密码位数和IC卡的ID号等。
系统硬件模块只是门禁系统的骨骼,要让它们发挥各自的作用就得靠软件的帮助。软件设计包括应用程序流程和算法设计两部分,门禁系统程序包括密码输入及比对程序、控制系统读取ID号及比对程序、密码修改程序、断电定时开锁程序、开锁控制程序、时钟电路读写以及LCD显示程序。系统程序流程图如图8所示。
系统软件采用C语言编程,以Arduino IDE为开发环境。系统程序要求用户先通过矩阵键盘输入密码,正确后系统再对用户出示的射频识别IC卡进行授权验证,若二者皆符合则执行开锁命令。以下仅列出系统的几个主要算法——密码输入及比对算法、系统读取ID号及比对算法、断电定时开锁算法。
1)密码输入及比对算法。
void keypad( ){
char key = getKey();
图8 程序流程图
codeBuffer[keypressCount]=key;
if( key != 0) {
keypressCount++;
if (keypressCount==6){
delay(500);
if (memcmp(codeBuffer, code,6)==0) {
rfid( );}//调用射频识别子函数
memset(codeBuffer, 0, 6);//密码达6位重输入
keypressCount=0; }}}
2)系统读取ID号及比对算法。
void rfid( ){
uchar status;
uchar str[MAX_LEN]; //搜寻卡片
status=MFRC522_Request(PICC_REQIDL, str); if (status != MI_OK) { return; }
status = MFRC522_Anticoll(str);
if (status == MI_OK)
{memcpy(serNum, str, 5);
ShowCardID(serNum);//输出卡ID号
uchar* id = serNum; // 检测IC卡是否授权
if(id[0]==0x49&&id[1]==0x6F&&id[2]==0x0D&&id[3]==0x23) {
unlock();} } } //调用开锁子函数
3)断电定时开锁算法。
void timing ( ){
int alarmArmed=digitalRead
(alarmArmedPin); //读取12引脚电平值
if (alarmArmed==HIGH){armed=true;
} else {armed=false;}
if(armed){ if (!alarm){
checkAlarm(); } else {unlock();//开锁
alarm=false;}}
int setMode = digitalRead(alarmSetPin);
if (setMode==HIGH){//读取13引脚电平值
displayAlarmSet=true;
setAlarm(); }//设定时间
else { displayAlarmSet=false;}}
对于一个实际应用项目,如果设计方案存在原理性错误,将会浪费许多不必要的开销和时间。利用Proteus仿真软件对原理电路进行仿真,可以及时发现设计中的问题[7]。
Proteus 最新的8.4版本中集成了Arduino编译器,只需要设置好编译器就能直接进行仿真实验。由于Proteus元件库没有电磁锁和射频识别模块,这里用一只12V白炽灯元件等效代替电磁锁。射频识别模块功能的检验放在原型系统中进行,这里只对密码输入及比对功能和断电定时开锁功能进行仿真。在Proteus软件中进行电气规则检查无误后,点击仿真按钮,得到密码输入及比对功能与断电定时开锁功能仿真结果如图9所示。
图9(a)显示,当密码输入正确后绿色LED点亮,蜂鸣器发出乐曲声,显示模块显示密码输入正确同时提示用户输入IC卡,随后白炽灯也被点亮,表示开锁控制模块工作正常。
图9(b)显示,当断电定时开锁模块按钮2被按下,用户输入密码正确后,显示模块提示用户设定开锁小时与分钟,表示该模块工作正常。
通过Proteus仿真,各个模块都能实现其相应的功能,验证了系统总体设计的可行性。
图10所示为原型系统硬件结构实物图。
系统实现结果也表明:各个模块都能实现其相应的功能,且运行稳定、防盗保密效果好,原型系统成功实现了系统总体设计要求。
图9 Proteus仿真结果
本文设计了一种以Arduino单片机作为控制单元、密码和射频识别相结合的双重认证门禁系统。运用Proteus软件进行仿真,有效验证了前期理论设计结果的正确性。对制作的原型系统进行试验,系统各模块工作正常且平稳,安全性高。该系统有效弥补了目前单重认证门禁系统普遍存在的安全性低、成本高、断电无法开锁等不足,其成功的设计对于Arduino单片机在其他场合的应用有一定的参考价值。
图10 原型系统硬件结构实物图
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!