大家好,又见面了,我是你们的朋友风君子。
射频识别技术RFID(Radio Frequency Identification),又称为电子标签、无线射频识别,是一种非接触式的自动识别技术,通过无线电讯号识别特定目标并读写相关数据而无需识别系统与特定目标之间建立机械或光学接触。可用于识别高速运动物体并可同时识别多个标签,过程中无需人工干预,操作快捷方便。可工作于各种环境,实现对各类物体或设备(人员、物品)在不同状态(移动、静止或恶劣环境)下的自动识别和管理。
RFID系统主要由应答器、阅读器和高层应用组成,其中的应答器包括集成电路芯片。阅读器用于产生射频载波与应答器进行信息交互。高层应用包括信息的管理和决策。
接线
Arduino Uno <——> RFID-RC522
10 <——> SDA
13 <——> SCK
11 <——> MOSI
12 <——> MISO
–null– <——> IRQ IRQ是中断才用到的此处没有用到可以不接)
GND <——> GND
9 <——> RST
3.3V <——> 3.3V
需要下载有关的第三方库
实现读取卡片信息的代码:
/*
* --------------------------------------------------------------------------------------------------------------------
* Example sketch/program showing how to read new NUID from a PICC to serial.
* --------------------------------------------------------------------------------------------------------------------
* This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
*
* Example sketch/program showing how to the read data from a PICC that is: a RFID Tag or Card) using a MFRC522 based RFID
* Reader on the Arduino SPI interface.
*
* When the Arduino and the MFRC522 module are connected see the pin layout below), load this sketch into Arduino IDE
* then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE hit Ctrl+Shft+M). When
* you present a PICC that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
* will show the type, and the NUID if a new card has been detected. Note: you may see "Timeout in communication" messages
* when removing the PICC from reading distance too early.
*
* @license Released into the public domain.
*
* Typical pin layout used:
* -----------------------------------------------------------------------------------------
* MFRC522 Arduino Arduino Arduino Arduino Arduino
* Reader/PCD Uno/101 Mega Nano v3 Leonardo/Micro Pro Micro
* Signal Pin Pin Pin Pin Pin Pin
* -----------------------------------------------------------------------------------------
* RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
* SPI SS SDASS) 10 53 D10 10 10
* SPI MOSI MOSI 11 / ICSP-4 51 D11 ICSP-4 16
* SPI MISO MISO 12 / ICSP-1 50 D12 ICSP-1 14
* SPI SCK SCK 13 / ICSP-3 52 D13 ICSP-3 15
*/
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfidSS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];
void setup) {
Serial.begin9600);
SPI.begin); // Init SPI bus
rfid.PCD_Init); // Init MFRC522
for byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.printlnF"This code scan the MIFARE Classsic NUID."));
Serial.printF"Using the following key:"));
printHexkey.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.printF"PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetTyperfid.uid.sak);
Serial.printlnrfid.PICC_GetTypeNamepiccType));
// 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.printlnF"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.printlnF"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.printlnF"The NUID tag is:"));
Serial.printF"In hex: "));
printHexrfid.uid.uidByte, rfid.uid.size);
Serial.println);
Serial.printF"In dec: "));
printDecrfid.uid.uidByte, rfid.uid.size);
Serial.println);
}
else Serial.printlnF"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 printHexbyte *buffer, byte bufferSize) {
for byte i = 0; i < bufferSize; i++) {
Serial.printbuffer[i] < 0x10 ? " 0" : " ");
Serial.printbuffer[i], HEX);
}
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDecbyte *buffer, byte bufferSize) {
for byte i = 0; i < bufferSize; i++) {
Serial.printbuffer[i] < 0x10 ? " 0" : " ");
Serial.printbuffer[i], DEC);
}
}
两种不同形状的卡片所对应的识别结果: