赞
踩
目录
MFRC522是高度集成的非接触式(13.56MHz)读写卡芯片。此发送模块利用调制和解调的原理,并将它们完全集成到各种非接触式通信方法和协议中。MFRC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议,支持 ISO14443A的多层应用。其内部发送器部分可驱动读写器天线与ISO14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理ISO14443A兼容的应答器信号。数字部分处理ISO14443A帧和错误检测(奇偶&CRC)。此外,它还支持快速CRYPTO1加密算法,用于验证MIFARE系列产品。MFRC522支持MIFARE更高速的非接触式通信,双向数据传输速率高达424kbit/s。
该系统由STM32F103C8T6作为主控制器,外围搭载由蜂鸣器和LED灯构成的报警装置;采用AC、DC电源适配器为整个系统供电;MFRC522射频识别芯片作为该系统RFID读写器; 显示模块采用了0.96’OLED;并以ESP8266物联网芯片作为通信模块,通过WiFi与中国移动OneNET云平台连接,将数据流发送至OneNET。
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、信号线。控制信号一般要求周期为20ms的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 数据传输方案,方便设备使用互联网传输数据。
部分源码
主函数
- #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位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
- RC522_Init(); //初始化射频卡模块
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级
- OLED_Init(); //OLED初始化
- delay_ms(50);
-
- OLED_CLS(); //清屏
-
- while(1)
- {
- RC522_Handel();
- }
- }
-
我们要提前获取到我们空白卡的十六进制序列号(烧录程序后可直接读出来,一般为字母+数字共8位,例如af123456),我们将其转换为10进制的数组,进行储存(两两一组合),最后OLED上读取出来的是依然是十六进制。
- 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);
- }
数据读取测试:提前向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上显示用户信息,舵机转动
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。