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.
Połączenie pinów z Arduino
RFID | SDA/SS | SCK | MOSI | MISO | IRQ | GND | RST | 3.3V |
ARDUINO | D10 | D13 | D11 | D12 | GND | D9 | 3.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