|
在本篇文章中,您将了解RFID技术,以及如何使用Arduino连接RFID模块RC522。本文还提供了实用示例,以帮助您学习使用RFID模块。
RC522模块特性和引脚分布 射频识别RFID(Radio Frequency Identification)是一种无线数据传输系统,用于在标签和读取器设备之间传输数据。您已经在商店中看到了这些系统的应用!该系统中,每个物体都被包含电路的RFID标签标记。当该标签暴露于由条形码读取器设备引起的磁场时,它使用无线电脉冲激活和发送数据。然后根据发射的脉冲检测并从系统中移除它。
RFID模块用于读取和写入RFID卡或标签,如RC522。
该模块工作频率为13.56 MHz,除了读取数据外,还可以在标签上写入数据。以下是这些模块的一些功能: ● 使用串口、SPI和I2C协议与微控制器通信 ● 高达10 Mbit / sec的数据传输速率 ● 3V工作电压 ● 小尺寸4 * 6厘米
所需的材料 ● Arduino Uno R3开发板 ● RC522 Mifare RFID IC卡 ● 10cm 40P公对公跳线 ● Arduino IDE
读取RFID卡 在本文中,您将学习使用Arduino通过SPI协议读取标签信息。检测到的数据将被缓冲并显示在串口监视器窗口中。
以下是读取RDIF卡的代码: - /*
- * RFID , read tags
- * by Hanie kiani
- * https://electropeak.com/learn/
- */
- #include <SPI.h>
- #include <MFRC522.h>
- #define RST_PIN 9
- #define SS_PIN 10
- MFRC522 mfrc522(SS_PIN, RST_PIN);
- void setup() {
- Serial.begin(9600);
- SPI.begin();
- mfrc522.PCD_Init();
- Serial.println(F("Read Data on Card:"));
- }
- void loop() {
- MFRC522::MIFARE_Key key;
- for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
-
- MFRC522::StatusCode status;
-
-
- if ( ! mfrc522.PICC_IsNewCardPresent()) {
- return;
- }
- // Select one of the cards
- if ( ! mfrc522.PICC_ReadCardSerial()) {
- return;
- }
- Serial.println(F("**Card Detected:**"));
- mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));
- Serial.print(F("Data: "));
- byte buffer[18];
- byte block = 1;
- byte data;
- status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
- if (status != MFRC522::STATUS_OK) {
- Serial.print(F("Authentication failed: "));
- Serial.println(mfrc522.GetStatusCodeName(status));
- return;
- }
- status = mfrc522.MIFARE_Read(block, buffer, &data);
- if (status != MFRC522::STATUS_OK) {
- Serial.print(F("Reading failed: "));
- Serial.println(mfrc522.GetStatusCodeName(status));
- return;
- }
- //PRINT data
- for (uint8_t i = 0; i < 16; i++) {
- Serial.write(buffer[i] );
- }
- delay(1000);
-
- mfrc522.PICC_HaltA();
- mfrc522.PCD_StopCrypto1();
- }
复制代码
检测标签
通过将以下代码添加到dump_byte_array函数,您可以定义特定条形码并将其作为标准数据引入Arduino。
将红色LED和绿色LED连接到引脚8和7,然后将代码上传到电路板上。 当具有特定条形码的标签暴露于模块时,绿色LED亮起表示标签条形码被批准。 如果红色LED亮起,则表示条形码未知。 通过扩展这段代码,您可以在更复杂的项目中使用它,例如门电子锁。 - if(data == (" ...identified tag... "){
- digitalWrite(8, HIGH);
- delay(3000);
- digitalWrite(8, LOW);
- }
- else{
- digitalWrite(7, HIGH);
- delay(3000);
- digitalWrite(7, LOW);
- }
复制代码
在标签上写数据 要在卡上写信息,您必须首先确保您的卡是可写的。 UHF卡是一种高频工作的RFID卡,具有存储信息的能力,因此,您可以这些RFID卡在卡上写下您想要的信息。 使用与前面相同的电路,并在开发板上传以下代码。代码需要使用MFRC522库,请在此链接下载。 - /*
- * RFID , write on tags
- * by Hanie kiani
- * https://electropeak.com/learn/
- */
- #include <SPI.h>
- #include <MFRC522.h>
- #define RST_PIN 9
- #define SS_PIN 10
- MFRC522 mfrc522(SS_PIN, RST_PIN);
- void setup() {
- Serial.begin(9600);
- SPI.begin();
- mfrc522.PCD_Init();
-
- }
- void loop() {
-
- MFRC522::MIFARE_Key key;
- for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
-
- if ( ! mfrc522.PICC_IsNewCardPresent()) {
- return;
- }
- // Select one of the cards
- if ( ! mfrc522.PICC_ReadCardSerial()) {
- return;
- }
- Serial.print(F("Card UID:")); //Dump UID
- for (byte i = 0; i < mfrc522.uid.size; i++){
- Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
- Serial.print(mfrc522.uid.uidByte[i], HEX);
- {
- Serial.print(F(" PICC type: ")); // Dump PICC type
- MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
- Serial.println(mfrc522.PICC_GetTypeName(piccType));
-
- MFRC522::StatusCode status;
- byte buffer[34];
- byte block;
- byte data ;
-
- Serial.setTimeout(30000L) ; // wait until 20 seconds for input from serial
-
- Serial.println(F("Type your desired data, ending with #"));
- data = Serial.readBytesUntil('#', (char *) buffer, 30) ;
- for (byte i = data; i < 30; i++) buffer[i] = ' ';
- block = 1;
-
- 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));
- return;
- }
- else Serial.println(F("PCD_Authenticate() success: "));
- // Write block
- status = mfrc522.MIFARE_Write(block, buffer, 16);
- if (status != MFRC522::STATUS_OK) {
- Serial.print(F("MIFARE_Write() failed: "));
- Serial.println(mfrc522.GetStatusCodeName(status));
- return;
- {
- else Serial.println(F("MIFARE_Write() success: "));
- block = 2;
- //Serial.println(F("Authenticating using key A..."));
- 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));
- return;
- {
- // Write block
- status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
- if (status != MFRC522::STATUS_OK) }
- Serial.print(F("MIFARE_Write() failed: "));
- Serial.println(mfrc522.GetStatusCodeName(status));
- return;
- {
- else Serial.println(F("MIFARE_Write() success: "));
- mfrc522.PICC_HaltA();
- mfrc522.PCD_StopCrypto1();
- }
复制代码在检测到卡并显示卡UDI后,此代码会询问您要保存在卡上的信息。 此信息可以包含字母、数字或其他字符串。然后将该信息存储在卡的块1中。 您可以通过更改代码中的块变量来每次编写不同的块。
以上就是本文的全部内容。您可以通过添加超声波模块(如SRF05),创建一个安全系统,在周围检测到物体时发出警报,并且只有在检测到正确的RFID标签时才会关闭警报。如有问题,请随时在本帖下面进行回复。 |