RFID门禁实验
RFID套件介绍
RFID(Radio Frequency Identification),也称为射频识别,是一种通信技术。 它可以通过无线电信号识别特定目标并读取和写入数据,而无需在识别系统和特定目标之间建立机械或光学接触。 射频一般为微波,1-100GHz,适合短距离识别通信。
RFID读写器也分为移动和固定类型。 目前RFID技术应用广泛,如:图书馆,门禁系统,食品安全可追溯性等
RFID套件组件
S50 IC卡(应答器)S50是飞利浦PHILIPS下属子公司恩智浦NXP出品的NXP Mifare1系列芯片型号。封装这种芯片的卡类,称为S50卡。S50卡属于非接触式IC卡,其芯片和感应天线无裸露部分,通过无线电波来完成与读卡器之间的读写操作。它由天线,耦合元件和芯片组成。 通常,发送应答器看起来像标签,每个标签都有一个独特的电子代码,通过将它们附加在它们上来识别对象。卡进入读写器的射频范围时,接收到读写器发出的电源信号,通过L/C
串联谐振电路产生谐振,产生电荷来供给芯片工作,以完成数据的接收、读取、修改、储存、发送等操作。
存储容量:S508Kbit16个分区,每分区两组密码
工作频率:13.56 MHz
通讯速率:106KBoud
读写距离:2.510 CM
IC钥匙扣卡(S50复旦卡):
读卡器: RC522是应用于13.56MHz非接触式通信中高集成度的读写卡芯片,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。 MF RC522利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。支持14443A兼容应答器信号。数字部分处理ISO14443A帧和错误检测。此外,还支持快速CRYPTO1加密算法,用语验证MIFARE系列产品。MFRC522支持MIFARE系列更高速的非接触式通信,双向数据传输速率高达424kbit/s
工作电压:3.3V
通讯方式:SPI
数据传输速率:最大10Mbit/s
工作准则
RFID技术的基本原理并不复杂:标签将接收读取器在进入磁场时发送的RF信号,然后将获得的能量中存储的芯片(无源标签)中的信息发送出感应电流, 或者有源标签发送一个特定的频率,由阅读器读取和解码信息,并发送给中央信息系统处理
一套完整的RFID系统由三部分组成:读卡器,电子标签(即应答器)和应用系统。 工作原理是读者发射一个特定频率的无线电波能量驱动电路发出内部数据,然后读者有序接收中断数据并发送给应用程序做相应的处理。
从电子标签之间的通信和能量感应模式来看,存在电感耦合和反向散射耦合。 低频RFID通常使用第一种类型,而高频使用第二种类型。
根据结构和技术,读取器可以是读取或读/写设备,它是RFID系统信息的控制和处理中心。读卡器通常由耦合模块,收发模块,控制模块和接口单元组成。通常,半双工通信模式用于在读取器和应答器之间交换信息,并且读取器通过耦合提供无源应答器的能量和定时。
工作原理
(1)IC卡激活:门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号码),将这个UID录入数据库激活IC卡。
(2)刷卡:刷卡时读卡器读取到UID,查询数据库,如果数据库中存在这个UID则表示有效用户,继而控制继电器断电,此时电磁锁开门。
实验目的
通过读卡器读取,如果标签与我们使用的标签匹配,则蜂鸣器以低频率发出蜂鸣声。 否则,会发出仓促警报
组件清单
Keywish Arduino UNO R3 主板
面包板
USB sjx
RFID suite *1
蜂鸣器 *1
若干跳线
接线
RFID
Arduino Uno R3
SDA
10
SCK
13
MOSI
11
MISO
12
IRQ
NALL
GND
GND
RST
9
VCC
3.3V
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];
void setup() {
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  Serial.println(F("This code scan the MIFARE Classsic NUID."));
  Serial.print(F("Using the following key:"));
  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
void loop() {
  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));
  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }
  if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] ) {
    Serial.println(F("A new card has been detected."));
    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
 
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("Card read previously."));
  // Halt PICC
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
key恩地void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}
程序
Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));
  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }
  if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] ) {
    Serial.println(F("A new card has been detected."));
    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
 
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("Card read previously."));
  // Halt PICC
  rfid.PICC_HaltA();
  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}