1、MFRC522简介
2、概述
3、硬件设计
4、软件设计
5、实物测试
1、MFRC522简介
MFRC522是高度集成的非接触式(13.56MHz)读写卡芯片。该发送模块利用调制和解调的原理,将其完全集成到各种非接触式通信方法和协议中。MFRC522采用先进的调制和解调概念,完全集成在13.56MHz下所有类型的被动非接触式通信方式和协议,支持 ISO14443A多层应用。内部发送器可以驱动读写器天线与ISO14443A/MIFARE没有其他电路可以通信卡和应答机。接收器部分为处理提供了一个坚固有效的解调和解码电路ISO14443A兼容的应答器信号。处理数字部分ISO14443A帧和错误检测(奇偶)&CRC)。此外,它还支持快速CRYPTO1用于验证加密算法MIFARE系列产品。MFRC522支持MIFARE双向数据传输速率高达424kbit/s。
2、概述
该系统由STM32F103C8T6作为主控制器,外围配有蜂鸣器和蜂鸣器LED报警装置由灯组成;使用AC、DC电源适配器为整个系统供电;MFRC522射频识别芯片作为系统RFID读写器; 0用于显示模块.96’OLED;并以ESP8266物联网芯片作为通信模块,通过WiFi与中国移动OneNET云平台连接,将数据流发送到OneNET。
3、硬件设计
STM32F该系列属于中低端32位ARM该系列芯片是意大利半导体(ST)公司生产,其核心是Cortex-M3。按片内的系列芯片Flash大小可分为三类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。F103C8T6属于中容量产品,程序存储容量为64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。
报警装置主要由蜂鸣器和LED构成,当系统出现异常情况时(如读取的卡为伪卡等),LED灯会点亮,蜂鸣器鸣响,实现异常报警功能。
我采用0显示模块.96’OLED,即有机发光二极管(Organic Light-Emitting Diode),也叫有机电激光显示(Organic Electroluminesence Display)。OLED由于具有自发光、无背光源、对比度高、厚度薄、视角广、反应速度快、柔性面板、使用温度范围广、结构简单、工艺简单等优良特点,被认为是下一代平面显示器的新兴应用技术。
我采用了MG995舵机作为门禁驱动装置。舵机上有三条线,分别是VCC、GND、信号线。控制信号通常需要20个周期ms的PWM信号。VCC、GND另外需要驱动给舵机供电,必须与开发板共用,控制相对简单。最大扭矩可达13KG/cm,满足设计要求。
我选择了通信ATK-ESP8266WIFI模块与中国移动OneNET云平台连接。ATK-ESP8266是ALIENTEK 高性能推出 UART-WiFi(串口-无线 WIFI)模块, ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,与产品连接非常方便。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA WIFI AP 快速构建串口的模式-WIFI 数据传输方案,方便设备使用互联网传输数据。
4、软件设计
主函数
#include "delay.h" #include "sys.h" #include "usart.h" #include "pwm.h" #include "rc522.h" #include "OLED_I2C.h" int main(void) { TIM1_PWM_Init(199,7199);/不分频。PWM频率===(7200*200)/72000000=0.02=20ms delay_init(); //延迟函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)//设置中断优先级分组2:2抢占优先级,二位响应优先级 uart_init(115200); //串口初始化为115200 RC522_Init(); /// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3)//设置中断优先级分组为3:2抢占优先级,二位响应优先级 OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS(); //清屏 while(1) { RC522_Handel(); } }
unsigned char card_hy[4]= {12,34,138,199};//以十进制的形式存放 unsigned char card_zp[4]= {26,49,39,25};//以十进制的形式存放
寻卡函数
#include "sys.h" #include "rc522.h" #include "delay.h" #include "usart.h" #include "string.h" #include "OLED_I2C.h" #include "pwm.h" /******************************* *连线说明: *1--SDA <----->PA4 *2--SCK <----->PA5 *3--MOSI <----->PA7 *4--MISO <----->PA6 *5--悬空 *6--GND <----->GND *7--RST <----->PB0 *8--VCC <----->VCC ************************************/ /*全局变量*/ unsigned char CT[2];//卡类型 unsigned char SN[4]; //卡号 unsigned char RFID[16];//存放RFID unsigned char card_hy[4]= {12,34,138,199}; unsigned char card_zp[4]= {26,49,39,25}; u8 KEY[6]= {0xff,0xff,0xff,0xff,0xff,0xff}; /*函数声明*/ unsigned char status; unsigned char s=0x08; unsigned char string1[10]; unsigned char string2[10]; #define RC522_DELAY( delay_us(20)
void RC522_Handel(void)
{
status = PcdRequest(PICC_REQALL,CT);//寻卡
if(status==MI_OK)// 寻卡成功
{
status=MI_ERR;
status = PcdAnticoll(SN);// 防冲撞
}
if (status==MI_OK)// 防冲撞成功
{
OLED_CLS(); //清屏
status=MI_ERR;
OLED_ShowCN(16,0,6);
OLED_ShowCN(16+16,0,7);
sprintf((char*)string1,"%02x%02x%02x%02x",SN[0],SN[1],SN[2],SN[3]);
OLED_ShowStr(16+40,0,string1,2);
if((SN[0]==card_hy[0])&&(SN[1]==card_hy[1])&&(SN[2]==card_hy[2])&&(SN[3]==card_hy[3]))
{
OLED_ShowCN(16,2,2);
OLED_ShowCN(16+16,2,3);
OLED_ShowCN(16+40,2,0);
OLED_ShowCN(16+56,2,1);
OLED_ShowCN(16,4,4);
OLED_ShowCN(16+16,4,5);
OLED_ShowStr(16+40,4,"031940306",2);
OLED_ShowCN(32,6,8);
OLED_ShowCN(16+32,6,9);
OLED_ShowCN(16+48,6,10);
OLED_ShowCN(16+64,6,11);
TIM_SetCompare1(TIM1,190);
delay_ms(500);
TIM_SetCompare1(TIM1,175);
}
if((SN[0]==card_zp[0])&&(SN[1]==card_zp[1])&&(SN[2]==card_zp[2])&&(SN[3]==card_zp[3]))
{
OLED_ShowCN(16,2,2);
OLED_ShowCN(16+16,2,3);
OLED_ShowCN(16+40,2,12);
OLED_ShowCN(16+56,2,13);
OLED_ShowCN(16,4,4);
OLED_ShowCN(16+16,4,5);
OLED_ShowStr(16+40,4,"031940720",2);
OLED_ShowCN(32,6,8);
OLED_ShowCN(16+32,6,9);
OLED_ShowCN(16+48,6,10);
OLED_ShowCN(16+64,6,11);
TIM_SetCompare1(TIM1,190);
delay_ms(500);
TIM_SetCompare1(TIM1,175);
}
status =PcdSelect(SN);
}
5、实物测试
提前向STM32F103C8T6单片机中写入用户信息,本系统中录入两名同学的学号和姓名,当阅读器识别到系统中已录入的卡时,可将卡号、姓名、学号等信息一并展示在OLED。
为更清晰的观察到防冲突实验现象,在本系统测试时分别采用一张录入STM32系统的卡和一张不录入系统的卡进行测试,本系统通过对IC卡内独一无二的十六进制序列号进行判断,最终读取卡内信息。这种方法可以保证任何情况下都能选出一张卡片。
为实际检测RFID阅读器阅读距离,我们分别将2张RC522-IC卡放在阅读器的1-10cm处进行测试,检测阅读器响应结果,具体测试情况如下表所示。
测试距离 |
卡1响应结果 |
卡2响应结果 |
10cm |
不响应 |
不响应 |
9cm |
不响应 |
不响应 |
8cm |
不响应 |
不响应 |
7cm |
不响应 |
不响应 |
6cm |
响应 |
不响应 |
5cm |
响应 |
响应 |
4cm |
响应 |
响应 |
3cm |
响应 |
响应 |
2cm |
响应 |
响应 |
1cm |
响应 |
响应 |
根据上述测试可以发现,理论上RFID阅读器的射频距离可达10cm,但是在实际应用中, RC522-IC卡与RFID阅读器之间距离约为5cm左右时,RFID才能够读取到卡内信息。
首先给该系统上电,首先将未录入信息的IC卡靠近RFID阅读器,识别不成功。然后将RC522-IC卡靠近RFID阅读器后阅读器识别成功,OLED上显示用户信息,舵机转动