风筝
发表于: 2019-8-17 21:15:28 | 显示全部楼层

在本篇文章中,您将了解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厘米

rc522-rfid-pinout.jpg


所需的材料

●    Arduino Uno R3开发板

●    RC522 Mifare RFID IC卡

●    10cm 40P公对公跳线

●    Arduino IDE


读取RFID卡

在本文中,您将学习使用Arduino通过SPI协议读取标签信息。检测到的数据将被缓冲并显示在串口监视器窗口中。

figure3_circuit_1.jpg


以下是读取RDIF卡的代码:

  1. /*
  2. *  RFID , read tags
  3. *  by Hanie kiani
  4. *  https://electropeak.com/learn/   
  5. */
  6. #include <SPI.h>
  7. #include <MFRC522.h>

  8. #define RST_PIN 9           
  9. #define SS_PIN 10         

  10. MFRC522 mfrc522(SS_PIN, RST_PIN);   
  11. void setup() {
  12.   Serial.begin(9600);                                          
  13.   SPI.begin();                                                
  14.   mfrc522.PCD_Init();                                             
  15.   Serial.println(F("Read Data on Card:"));   
  16. }

  17. void loop() {

  18.   MFRC522::MIFARE_Key key;
  19.   for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
  20.   
  21.   MFRC522::StatusCode status;


  22.   if ( ! mfrc522.PICC_IsNewCardPresent()) {
  23.     return;
  24.   }

  25.   // Select one of the cards
  26.   if ( ! mfrc522.PICC_ReadCardSerial()) {
  27.     return;
  28.   }

  29.   Serial.println(F("**Card Detected:**"));


  30.   mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid));

  31.   Serial.print(F("Data: "));
  32.   byte buffer[18];
  33.   byte block = 1;
  34.   byte data;

  35.   status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
  36.   if (status != MFRC522::STATUS_OK) {
  37.     Serial.print(F("Authentication failed: "));
  38.     Serial.println(mfrc522.GetStatusCodeName(status));
  39.     return;
  40.   }

  41.   status = mfrc522.MIFARE_Read(block, buffer, &data);
  42.   if (status != MFRC522::STATUS_OK) {
  43.     Serial.print(F("Reading failed: "));
  44.     Serial.println(mfrc522.GetStatusCodeName(status));
  45.     return;
  46.   }

  47.   //PRINT data
  48.   for (uint8_t i = 0; i < 16; i++) {
  49.     Serial.write(buffer[i] );
  50.   }

  51.   delay(1000);
  52.   
  53.   mfrc522.PICC_HaltA();
  54.   mfrc522.PCD_StopCrypto1();
  55. }
复制代码

检测标签

figure4_circuit_2.jpg

通过将以下代码添加到dump_byte_array函数,您可以定义特定条形码并将其作为标准数据引入Arduino。


将红色LED和绿色LED连接到引脚8和7,然后将代码上传到电路板上。 当具有特定条形码的标签暴露于模块时,绿色LED亮起表示标签条形码被批准。 如果红色LED亮起,则表示条形码未知。 通过扩展这段代码,您可以在更复杂的项目中使用它,例如门电子锁。

  1. if(data == (" ...identified tag... "){
  2.   digitalWrite(8, HIGH);
  3.   delay(3000);
  4.   digitalWrite(8, LOW);
  5. }
  6. else{
  7.   digitalWrite(7, HIGH);
  8.   delay(3000);
  9.   digitalWrite(7, LOW);
  10. }
复制代码

在标签上写数据

要在卡上写信息,您必须首先确保您的卡是可写的。 UHF卡是一种高频工作的RFID卡,具有存储信息的能力,因此,您可以这些RFID卡在卡上写下您想要的信息。

使用与前面相同的电路,并在开发板上传以下代码。代码需要使用MFRC522库,请在此链接下载。

  1. /*
  2. *  RFID , write on tags
  3. *  by Hanie kiani
  4. *  https://electropeak.com/learn/   
  5. */
  6. #include <SPI.h>
  7. #include <MFRC522.h>

  8. #define RST_PIN 9           
  9. #define SS_PIN 10         

  10. MFRC522 mfrc522(SS_PIN, RST_PIN);   

  11. void setup() {
  12.   Serial.begin(9600);
  13.   SPI.begin();
  14.   mfrc522.PCD_Init();
  15.   
  16. }
  17. void loop() {

  18.   
  19.   MFRC522::MIFARE_Key key;
  20. for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  21.   
  22.   if ( ! mfrc522.PICC_IsNewCardPresent()) {
  23.     return;
  24. }

  25.   // Select one of the cards
  26.   if ( ! mfrc522.PICC_ReadCardSerial()) {
  27.     return;
  28. }

  29.   Serial.print(F("Card UID:"));    //Dump UID
  30.   for (byte i = 0; i < mfrc522.uid.size; i++){
  31.     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
  32.     Serial.print(mfrc522.uid.uidByte[i], HEX);
  33.   {
  34.   Serial.print(F(" PICC type: "));   // Dump PICC type
  35.   MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  36.   Serial.println(mfrc522.PICC_GetTypeName(piccType));
  37.   
  38.   MFRC522::StatusCode status;

  39.   byte buffer[34];
  40.   byte block;
  41.   byte data ;
  42.   
  43.   Serial.setTimeout(30000L) ;     // wait until 20 seconds for input from serial
  44.   
  45.   Serial.println(F("Type your desired data, ending with #"));
  46.   data = Serial.readBytesUntil('#', (char *) buffer, 30) ;
  47.   for (byte i = data; i < 30; i++) buffer[i] = ' ';   

  48.   block = 1;
  49.   
  50.   status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  51.   if (status != MFRC522::STATUS_OK) {
  52.     Serial.print(F("PCD_Authenticate() failed: "));
  53.     Serial.println(mfrc522.GetStatusCodeName(status));
  54.     return;
  55. }
  56.   else Serial.println(F("PCD_Authenticate() success: "));

  57.   // Write block
  58.   status = mfrc522.MIFARE_Write(block, buffer, 16);
  59.   if (status != MFRC522::STATUS_OK) {
  60.     Serial.print(F("MIFARE_Write() failed: "));
  61.     Serial.println(mfrc522.GetStatusCodeName(status));
  62.     return;
  63. {
  64.   else Serial.println(F("MIFARE_Write() success: "));

  65.   block = 2;
  66.   //Serial.println(F("Authenticating using key A..."));
  67.   status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  68.   if (status != MFRC522::STATUS_OK) {
  69.     Serial.print(F("PCD_Authenticate() failed: "));
  70.     Serial.println(mfrc522.GetStatusCodeName(status));
  71.     return;
  72.   {

  73.   // Write block
  74.   status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  75.   if (status != MFRC522::STATUS_OK) }
  76.     Serial.print(F("MIFARE_Write() failed: "));
  77.     Serial.println(mfrc522.GetStatusCodeName(status));
  78.     return;
  79.   {
  80.   else Serial.println(F("MIFARE_Write() success: "));

  81.   mfrc522.PICC_HaltA();
  82.   mfrc522.PCD_StopCrypto1();  

  83. }
复制代码

在检测到卡并显示卡UDI后,此代码会询问您要保存在卡上的信息。 此信息可以包含字母、数字或其他字符串。然后将该信息存储在卡的块1中。 您可以通过更改代码中的块变量来每次编写不同的块。


以上就是本文的全部内容。您可以通过添加超声波模块(如SRF05),创建一个安全系统,在周围检测到物体时发出警报,并且只有在检测到正确的RFID标签时才会关闭警报。如有问题,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-17 21:36 , Processed in 0.045098 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表