|

RFID RC522 13.56 MHZ z Arduino

Rc522 to moduł do odczytu / zapisu danych kart i chipów (tag) RFID.

Każda karta posiada swój indywidualny nr UID  (4 bajtowy przedstawiony w postaci szesnastkowej, np: EE 34 A2 2C dla MIFARE 1K). Bardziej zaawansowane tagi składają się z 7 bajtowego UID.

Karta przechowuje dane w 16 sektorach, sektor podzielony jest na 4 bloki, blok przechowuje 16 bajtów informacji. W każdym sektorze można użyć 3 bloków do zapisu informacji, ponieważ ostatni blok zawiera dane dostępowe, tzw. Sector trailer.

 Blok 0 w Sektor 0 zawiera informacje o karcie.

Blok 0 info o karcie RFID RC522 13.56 MHZ Arduino
Blok 0 info o karcie RFID RC522 13.56 MHZ Arduino

Połączenie pinów z Arduino

RFIDSDA/SSSCKMOSIMISOIRQGNDRST3.3V
ARDUINOD10D13D11D12 GNDD93.3V

Do obsługi modułu należy zainstalować bibliotekę MFRC522

Odczytywanie zawartości karty / chipu:

#include <SPI.h>
#include <MFRC522.h>
constexpr uint8_t RST_PIN = 9;      
constexpr uint8_t SS_PIN = 10;    
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  while (!Serial);  
  SPI.begin();      
  mfrc522.PCD_Init(); 
  mfrc522.PCD_DumpVersionToSerial();
  Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent()) return;
  if (!mfrc522.PICC_ReadCardSerial()) return;
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Odczytywanie UID i zapisanie w zmiennej

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;          

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println("Scan a MIFARE 1K Tag to write data...");
  pinMode(4, OUTPUT);
}

void loop(){
    if (!mfrc522.PICC_IsNewCardPresent()) return;
    if (!mfrc522.PICC_ReadCardSerial()) return;
    PrintCardData();
  } 
  
void PrintCardData(){
  Serial.print("\n");
  Serial.print(F("Card UID:"));
  String userId;
  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(" ");
    userId += mfrc522.uid.uidByte[i] < 0x10 ? "0" : "";
    userId += String(mfrc522.uid.uidByte[i], HEX);
  }
  userId.toUpperCase();
  if(userId == "EE46A460"){
    digitalWrite(4, HIGH);
    delay(500);
  } 
  digitalWrite(4, LOW);
  Serial.println(userId);
  userId = "";
  delay(1000);
}

Zapisywanie danych do danego bloku

#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance
MFRC522::MIFARE_Key key;
MFRC522::StatusCode status;
  
void setup() {
  Serial.begin(9600);        // Initialize serial communications with the PC
  SPI.begin();               // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  Serial.println(F("Write personal data on a MIFARE PICC "));
}
 
void loop() {
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;
  if (!mfrc522.PICC_IsNewCardPresent()) return;
  if (!mfrc522.PICC_ReadCardSerial()) return;
  Serial.setTimeout(20000L);

  byte block = 4;
  byte len = 18;
  // byte buffr[] = {0x44,0x65,0x76,0x63,
  //                 0x72,0x61,0x7a,0x65,
  //                 0x2e,0x63,0x6f,0x6d,
  //                 0x20,0x20,0x20,0x20};
  byte buffr[] = {"Astraja123456789"}; 
  if(!authenticate(block)) return;
  writeBytesToBlock(block, buffr);  
  readBytesFromBlock(block, len);
  delay(1000);
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

bool authenticate(byte block){
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return false;
  }else{
    Serial.println("Authentication OK");
    return true;
  } 
}

void writeBytesToBlock(byte block, byte buff[]) {
  status = mfrc522.MIFARE_Write(block, buff, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("Write success: "));
}

void readBytesFromBlock(byte block, byte len){
  byte buffer1[18];
  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.print(F("Read success: "));
  String value = "";
  for (uint8_t i = 0; i < 16; i++){
      value += (char)buffer1[i];
  }
  value.trim();
  Serial.println(value);
  Serial.println("***");
}

Zobacz: Komunikacja SPI w Arduino

Podobne wpisy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *