步驟1:操作
RFID系統(tǒng)基本上由帶有解碼器的收發(fā)器,天線和應(yīng)答器組成。以及它如何運(yùn)作?這些卡中有一個(gè)卷軸。當(dāng)您從閱讀器接近它們時(shí),它們會(huì)通過(guò)連接到閱讀器的天線發(fā)出無(wú)線電信號(hào)。帶電標(biāo)簽(即卡)對(duì)存儲(chǔ)在其內(nèi)存中的信息進(jìn)行調(diào)制,然后將該數(shù)據(jù)發(fā)送到讀取器。然后,該卡進(jìn)入讀取區(qū)域并從讀取器接收電源以執(zhí)行操作。 RFID閱讀器接收標(biāo)簽發(fā)送的信息,將數(shù)據(jù)解碼并將其發(fā)送到服務(wù)器應(yīng)用程序。
步驟2:內(nèi)存
《如前所述,這種芯片內(nèi)部有1k的內(nèi)存。并且,EEPROM存儲(chǔ)器的組織方式如下:4個(gè)塊的16個(gè)扇區(qū)。每個(gè)塊包含16個(gè)字節(jié)。請(qǐng)記住,在源代碼中,您僅引用塊號(hào)。
步驟3:電路
在此圖中,帶有RFID芯片的鑰匙扣,除了組裝件,我們還有傳統(tǒng)的卡。以及該電路如何工作?嗯,在互聯(lián)網(wǎng)上,您會(huì)發(fā)現(xiàn)RFID-RC522模塊非常適合Arduino使用,但問(wèn)題是該Arduino(無(wú)論是Mega,Nano),無(wú)論型號(hào)如何,都無(wú)法通信,例如WiFi網(wǎng)絡(luò),以太網(wǎng),彼此之間。所以我們?cè)谶@里使用ESP32。它已經(jīng)具有藍(lán)牙,RF,即易于通信。那么我在這里指出,幾乎所有與Arduino兼容的東西都可以在ESP32上使用。
返回電路,當(dāng)在對(duì)卡或芯片進(jìn)行分析時(shí),綠色LED亮起時(shí),這意味著標(biāo)識(shí)已完成,訪問(wèn)被釋放。紅色LED點(diǎn)亮?xí)r,表明數(shù)據(jù)尚未通過(guò)驗(yàn)證。
步驟4:WiFi NodeMCU-32S ESP-WROOM-32
步驟5:RFID-RC522
在這里,我們獲得了卡和鑰匙圈以及RFID天線的圖像。一個(gè)重要的細(xì)節(jié)是它的接口是SPI。
第6步:組裝
在我們的組裝中,我們的ESP32由USB,并以Arduino IDE的串行連接,有兩個(gè)LED指示讀取是否成功,還有RFID讀取器RC522。我們有帶芯片和卡的鑰匙圈。
將鑰匙圈放在播放器上會(huì)顯示0表示讀取數(shù)據(jù),1表示記錄數(shù)據(jù)。我們以一個(gè)示例為例,該示例顯示讀取芯片或卡后,如果綠色指示燈點(diǎn)亮,則讀取器會(huì)識(shí)別出該數(shù)字。如果指示燈為紅色,則表示發(fā)生了某種類型的錯(cuò)誤,并且未執(zhí)行身份驗(yàn)證。
在示例中,我仍然展示了如何將數(shù)據(jù)寫(xiě)入標(biāo)簽,下面將對(duì)此進(jìn)行說(shuō)明。
第7步:庫(kù)
添加以下庫(kù)“ MFRC522”。
只需訪問(wèn)“草圖” 》》包括庫(kù)》》管理庫(kù)。..”
步驟8:源代碼
我們的程序?qū)匆韵路绞焦ぷ鳎簡(jiǎn)?dòng)后,程序?qū)⒌却ɑ驑?biāo)簽被識(shí)別。之后,將出現(xiàn)一個(gè)菜單,供用戶在閱讀或記錄內(nèi)容之間進(jìn)行選擇。然后將執(zhí)行該操作。
步驟9:設(shè)置
在這一部分中,我們處理庫(kù)的包含并定義緩沖區(qū)和塊數(shù)據(jù)大小。我們創(chuàng)建對(duì)象并初始化引腳,以及串行,SPI通信,LED和天線服務(wù)。我已經(jīng)開(kāi)始在串行監(jiān)視器上包含消息了。
#include //library responsible for communicating with the module RFID-RC522
#include //library responsible for communicating of SPI bus
#define SS_PIN 21
#define RST_PIN 22
#define SIZE_BUFFER 18
#define MAX_SIZE_BLOCK 16
#define greenPin 12
#define redPin 32
//used in authentication
MFRC522::MIFARE_Key key;
//authentication return status code
MFRC522::StatusCode status;
// Defined pins to module RC522
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup()
{
Serial.begin(9600);
SPI.begin(); // Init SPI bus
pinMode(greenPin, OUTPUT);
pinMode(redPin, OUTPUT);
// Init MFRC522
mfrc522.PCD_Init();
Serial.println(“Approach your reader card.。.”);
Serial.println();
步驟10:循環(huán)
在循環(huán)中,我們等待卡方法并選擇相同的方法。在菜單中,我們提供了讀取或?qū)懭霐?shù)據(jù)的選項(xiàng)。當(dāng)設(shè)備應(yīng)從活動(dòng)狀態(tài)變?yōu)橥V範(fàn)顟B(tài)時(shí),我們對(duì)此部分進(jìn)行了指示。我們必須使用這種方法來(lái)啟用新的讀數(shù)。
void loop()
{
// Aguarda a aproximacao do cartao
//waiting the card approach
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Select a card
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
// Dump debug info about the card; PICC_HaltA() is automatically called
// mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
//call menu function and retrieve the desired option
int op = menu();
if(op == 0)
readingData();
else if(op == 1)
writingData();
else {
Serial.println(F(“Incorrect Option!”));
return;
}
//instructs the PICC when in the ACTIVE state to go to a “STOP” state
mfrc522.PICC_HaltA();
// “stop” the encryption of the PCD, it must be called after communication with authentication, otherwise new communications can not be initiated
mfrc522.PCD_StopCrypto1();
}
步驟11:閱讀
在這一部分中,我們將閱讀卡/標(biāo)簽的數(shù)據(jù)。我們必須準(zhǔn)備所有鍵,處理緩沖區(qū)的大小,并對(duì)要操作的塊進(jìn)行身份驗(yàn)證。最后,我們?cè)O(shè)置讀取數(shù)據(jù)的打印方式。
//reads data from card/tag
void readingData()
{
//prints the technical details of the card/tag
mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));
//prepare the key - all keys are set to FFFFFFFFFFFFh
for (byte i = 0; i 《 6; i++) key.keyByte[i] = 0xFF;
//buffer for read data
byte buffer[SIZE_BUFFER] = {0};
//the block to operate
byte block = 1;
byte size = SIZE_BUFFER;
//authenticates the block to operate
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
if (status != MFRC522::STATUS_OK) {
Serial.print(F(“Authentication failed: ”));
Serial.println(mfrc522.GetStatusCodeName(status));
digitalWrite(redPin, HIGH);
delay(1000);
digitalWrite(redPin, LOW);
return;
}
//read data from block
status = mfrc522.MIFARE_Read(block, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F(“Reading failed: ”));
Serial.println(mfrc522.GetStatusCodeName(status));
digitalWrite(redPin, HIGH);
delay(1000);
digitalWrite(redPin, LOW);
return;
}
else{
digitalWrite(greenPin, HIGH);
delay(1000);
digitalWrite(greenPin, LOW);
}
Serial.print(F(“ Data from block [”));
Serial.print(block);Serial.print(F(“]: ”));
//prints read data
for (uint8_t i = 0; i 《 MAX_SIZE_BLOCK; i++)
{
Serial.write(buffer[i]);
}
Serial.println(“ ”);
}
步驟12:記錄
要將數(shù)據(jù)寫(xiě)入卡/標(biāo)簽,我們必須遵循一些步驟。從選擇記錄選項(xiàng)的那一刻起,我們有30秒的時(shí)間通過(guò)串行進(jìn)行數(shù)據(jù)輸入。用“#”字符輸入要寫(xiě)入的數(shù)據(jù)并準(zhǔn)備密鑰。您將需要清除緩沖區(qū)并寫(xiě)入塊1,因?yàn)樵趬K0中,我們已經(jīng)保存了卡號(hào),該卡號(hào)已經(jīng)在工廠中了。因此,我們不會(huì)觸摸塊0。
我們處理數(shù)據(jù)的大小,并插入一個(gè)用于身份驗(yàn)證的命令并啟用安全通信。如果未認(rèn)證的數(shù)據(jù),我們還會(huì)將錯(cuò)誤消息與讀數(shù)的一部分相等,以進(jìn)行顯示。我們將數(shù)據(jù)記錄在適當(dāng)?shù)膲K中。
//prints thecnical details from of the card/tag
mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));
// waits 30 seconds dor data entry via Serial
Serial.setTimeout(30000L) ;
Serial.println(F(“Enter the data to be written with the ‘#’ character at the end [maximum of 16 characters]:”));
//prepare the key - all keys are set to FFFFFFFFFFFFh
for (byte i = 0; i 《 6; i++) key.keyByte[i] = 0xFF;
//buffer para armazenamento dos dados que iremos gravar
//buffer for storing data to write
byte buffer[MAX_SIZE_BLOCK] = “”;
byte block; //the block to operate
byte dataSize; //size of data (bytes)
//recover on buffer the data from Serial
//all characters before chacactere ‘#’
dataSize = Serial.readBytesUntil(‘#’, (char*)buffer, MAX_SIZE_BLOCK);
//void positions that are left in the buffer will be filled with whitespace
for(byte i=dataSize; i 《 MAX_SIZE_BLOCK; i++)
{
buffer[i] = ‘ ’;
}
block = 1; //the block to operate
String str = (char*)buffer; //transforms the buffer data in String
Serial.println(str);
//authenticates the block to operate
//Authenticate is a command to hability a secure communication
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A,
block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F(“PCD_Authenticate() failed: ”));
Serial.println(mfrc522.GetStatusCodeName(status));
digitalWrite(redPin, HIGH);
delay(1000);
digitalWrite(redPin, LOW);
return;
}
//else Serial.println(F(“PCD_Authenticate() success: ”));
//Writes in the block
status = mfrc522.MIFARE_Write(block, buffer, MAX_SIZE_BLOCK);
if (status != MFRC522::STATUS_OK) {
Serial.print(F(“MIFARE_Write() failed: ”));
Serial.println(mfrc522.GetStatusCodeName(status));
digitalWrite(redPin, HIGH);
delay(1000);
digitalWrite(redPin, LOW);
return;
}
else{
Serial.println(F(“MIFARE_Write() success: ”));
digitalWrite(greenPin, HIGH);
delay(1000);
digitalWrite(greenPin, LOW);
}
}
步驟13:菜單
在這里編寫(xiě)菜單。監(jiān)視器顯示所有選項(xiàng),并等待發(fā)送數(shù)據(jù)。選擇一個(gè)選項(xiàng)后,它將從讀取的值中刪除48,該值在Ascii表中為0。該表是舊的,不在PC上使用,但是在Arduino和微控制器上,您將不得不處理它。如果您不知道,請(qǐng)?jiān)诨ヂ?lián)網(wǎng)上搜索一下它是什么。
//menu to operation choice
int menu()
{
Serial.println(F(“ Choose an option:”));
Serial.println(F(“0 - Reading data”));
Serial.println(F(“1 - Writing data ”));
//waits while the user does not start data
while(!Serial.available()){};
//retrieves the chosen option
int op = (int)Serial.read();
//remove all characters after option (as per example)
while(Serial.available()) {
if(Serial.read() == ‘ ’) break;
Serial.read();
}
return (op-48);//subtract 48 from read value, 48 is the zero from ascii table
}
責(zé)任編輯:wv
-
RFID
+關(guān)注
關(guān)注
387文章
6111瀏覽量
237436 -
ESP32
+關(guān)注
關(guān)注
18文章
960瀏覽量
17114
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論