实验6——RFID单模块实验

实验六:RFID单模块实验

一、实验目的

通过ML-RC522读取S50IC卡的用户身份证明信息使用SPI通信协议传送给ESP32,ESP32接受到信息后与自身设定的可用的用户身份证明信息进行对比,并显示是否验证通过。

二、实验内容

1.连接ESP32和ML-RC522的引脚
2.将程序上传到ESP32
3.使用ML-RC522读取S50的用户身份证明并打印验证信息

三、实验设备

ML-RC522 RFID模块
S50 异性IC卡
ESP32开发板
杜邦线

四、实验步骤

1)连接引脚
RC522:

RC522的引脚:
在这里插入图片描述
引脚依次为:SDA SCK MOSI MISO SCL GND RST 3.3V

ESP32:

ESP32的引脚图:
ESP32

连接:

将RC522与ESP32上对应的引脚连接:
在这里插入图片描述

2)上传程序

程序中需要MFRC522的库,在arduino上方工具->管理库中搜索MFRC522下载库

#include <SPI.h>
#include <MFRC522.h> 
#define SS_PIN 21  //定义RC522的SDA引脚的接线位置。
#define RST_PIN 22  //定义RC522的RST引脚的接线位置。

struct RFIDTag {  //Tag标签结构体
  uint8_t uid[4];
  char *name;
};
MFRC522 rfid(SS_PIN, RST_PIN); //实例化类 

struct RFIDTag tags[20] = {  // 初始化结构资料,请自行修改RFID识别码
  {{233, 232, 210, 126}, "Mini_Tag"},
  {{0, 0, 0, 0}, "Mini_Tag1"}, 
  {{1, 1, 1, 1}, "Mini_Tag2"}, 
};
byte totalTags = sizeof(tags) / sizeof(RFIDTag);  //计算结构资料的数量
bool foundTag; //匹配标签
void setup() { 
  Serial.begin(115200);
  SPI.begin(); // 初始化SPI总线
  rfid.PCD_Init(); // 初始化 MFRC522 
}
void loop() {
  // 找卡
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
  // 验证NUID是否可读
  if ( ! rfid.PICC_ReadCardSerial())
    return;
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  // 检查是否MIFARE卡类型
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("不支持读取此卡类型");
    return;
  }   
  Serial.print("十进制UID:");
  printDec(rfid.uid.uidByte, rfid.uid.size);
  Serial.println();
  byte *id = rfid.uid.uidByte;   // 取得卡片的UID
  byte idSize = rfid.uid.size;   // 取得UID的長度
  //对读取的卡号进行比较,注意数据类型。
  for (byte i = 0; i < totalTags; i++) {
    if (memcmp(tags[i].uid, id, idSize) == 0) {  // 比对阵列资料值
          Serial.println(tags[i].name);  //显示标签名字
          foundTag = true;
          break;
      }
     if(i==totalTags-1){
        Serial.println("验证失败");  
     }
   }
  
    // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡
    rfid.PICC_HaltA();
    // 停止读卡模块编码
    rfid.PCD_StopCrypto1();
}
 
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++){
    //Serial.print(buffer[i] < 0x10 ? " 0" : "");
    Serial.print(buffer[i]);
    Serial.print(" ");
  }
}

3)读取S50信息并验证

将注册过的标签接近ML-RC522串口监视器打印验证结果,显示卡片名字。
若为其他卡片,则显示"验证失败"。
在这里插入图片描述

五、其他问题

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
///////////////////////////////////////////////////////////////////// //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdRequest(unsigned char req_code,unsigned char *pTagType) { signed char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07); SetBitMask(TxControlReg,0x03); ucComMF522Buf[0] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen;); if ((status == MI_OK) && (unLen == 0x10)) { *pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1]; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:防冲撞 //参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdAnticoll(unsigned char *pSnr) { signed char status; unsigned char i,snr_check=0; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80); ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen;); if (status == MI_OK) { for (i=0; i<4; i++) { *(pSnr+i) = ucComMF522Buf[i]; snr_check ^= ucComMF522Buf[i]; } if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } } SetBitMask(CollReg,0x80); return status; } ///////////////////////////////////////////////////////////////////// //功 能:选定卡片 //参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdSelect(unsigned char *pSnr) { signed char status; unsigned char i; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); } CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf;[7]); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen;); if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码 // pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// signed char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) { signed char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode; ucComMF522Buf[1] = addr; for (i=0; i<6; i++) { ucComMF522Buf[i+2] = *(pKey+i); } for (i=0; i<6; i++) { ucComMF522Buf[i+8] = *(pSnr+i); } // memcpy(&ucComMF522Buf;[2], pKey, 6); // memcpy(&ucComMF522Buf;[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen;); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值