개발자/Arduino

아두이노 RC522 RFID Module 사용하기

지구빵집 2022. 11. 11. 10:45
반응형

 

 

RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID 리더 간 데이터를 교환하는 장치입니다. 교통카드, 학생 신분증 겸용 카드, 연구실 및 회사 출입문 카드, 구내식당 카드, 마트 등의 상품 진열 및 관리, 마라톤 대회 선수 배번호 등 다방면에서 이용되고 있습니다. 대부분의 경우 RFID 기반 Arduino 프로젝트가 사용되며 이는 탁월한 선택입니다. 간단한 이유는 다른 유사한 유형의 제품보다 저렴하고 저전력으로 작동할 수 있기 때문입니다. 인터페이스도 간편하여 애호가들 사이에서 매년 인기가 높아지고 있습니다. 

 

 

이미지 https://electronicsmith.com/rc522-rfid-module-work-interface-with-arduino/

 

센서의 작동 

 

RFID 기술은 크게 두 부분으로 나눌 수 있으며 두 개의 태그입니다. 하나의 태그는 식별 목적으로 개체에 부착되고 다른 하나는 태그를 읽을 독자를 위한 것입니다. 리더는 아무것도 아닌 안테나와 결합된 무선 주파수 모델입니다. 안테나는 고주파 전자파를 생성하는 역할을 합니다.  

 

 

RFID 동작 개념

 

부착된 태그는 배터리를 포함하지 않으므로 수동 장치로 작동합니다. 라벨과 연결되는 마이크로칩은 이중 용도로 사용됩니다. 하나는 저장이고 다른 하나는 처리입니다. 안테나의 주요 작업은 신호를 수신하고 전송하는 것입니다.

 

태그가 가까워지면 판독기가 전자기장을 생성합니다. 이로 인해 전자는 안테나를 통해 빠른 속도로 이동할 것입니다. 이러한 전자기파는 결국 칩에 전력을 공급할 것입니다.  

 

칩은 저장된 정보를 무선 신호로 판독기에 보냅니다. 이 프로세스를 후방 산란이라고 합니다. 그런 다음 판독기는 후방 산란을 감지하고 이를 해석한 후 데이터를 컴퓨터 또는 컴퓨터에 연결된 마이크로컨트롤러로 보냅니다. 

 

RC522 RFID 핀 출력 

 

 

 

RFID 모듈과 외부 세계를 연결하는 핀은 총 8개입니다. 모든 연결은 다음과 같습니다.

  • VCC:VCC는 모듈의 전원 공급 장치로 작동합니다. 전력 범위는 2.5V ~ 3.3V입니다. Arduino에서 최대 3.3볼트의 출력을 얻을 수 있습니다. 모듈이 파손될 가능성이 높으므로 모듈을 5볼트 핀에 연결하지 마십시오. 
  • RST:RST 입력을 사용하여 모듈을 재설정하고 전원을 끌 수 있습니다. 모듈은 자동으로 전원 차단 모드로 들어갑니다. 모든 입력 핀이 분리되어 오실레이터가 꺼집니다. 그동안 모듈을 재설정합니다.
  • 접지:GND 핀은 접지 핀으로 작동하므로 Arduino 모듈과 연결해야 합니다.
  • IRQ: 모듈 근처에 RFID 태그가 있을 때마다 마이크로컨트롤러는 이 중단 태그의 존재로 인해 경고를 받습니다.
  • 미소/SCL/송신:SPI 인터페이스가 활성화되면 핀은 I2C 인터페이스를 활성화한 후 마스터-인-슬레이브 아웃으로 작동하거나 직렬 클록으로 작동합니다. 또한 UART 인터페이스가 활성화되면 직렬 데이터 출력에서도 작동합니다.
  • 모시(마스터 아웃 슬레이브 인):이것은 RC522 모듈용 SPI 입력입니다.
  • SCK(직렬 시계):여기에서 Arduino는 SPI 버스 마스터로 작동하며 직렬 클럭은 SPI에서 제공하는 펄스를 받아들입니다.
  • SS/SDA/수신:이 핀은 여러 용도로 사용할 수 있습니다. SPI 인터페이스를 활성화하면 핀이 신호 출력으로 작동하기 시작합니다. 12C 인터페이스가 활성화되면 직렬 데이터로 작동합니다. 이 핀은 마커로 사용됩니다.  

 

필요한 재료

 

RC522 리더 키트에는 RC522 RFID 리더 모듈, RFID 카드, RFID 키 포브 및 납땜할 수 있는 헤더 한 쌍이 함께 제공됩니다. 

 

한편, RFID 리더 모듈에는 27.12MHz 수정 발진기인 MFRC522 IC가 탑재되어 있습니다. 안테나는 PCB에 내장된 상태로 유지되며 지원하는 수동 부품에서 최대 13.56MHz 전자기장이 생성됩니다.  

 

참고 : 회로 연결에 사용하는 동안 MFRC522 IC가 2.5V ~ 3V의 공급 전압에서 작동한다는 것을 기억해야 합니다. 모든 통신 핀이 최대 5볼트를 견딜 수 있는 반면 전원 공급 장치 전압이 3볼트 제한을 초과하지 않는지 확인합니다.  

 

회로 연결

 

이제 모듈 사양을 알았으므로 모듈을 Arduino에 연결하는 방법에 대해 논의할 차례입니다.

 

먼저 모듈에서 3.3볼트 출력을 생성하기 위해 VCC 핀을 연결해야 하고 GND 핀도 Arduino의 접지에 연결해야 합니다. 모든 디지털 핀은 RST 핀을 Arduino에 연결할 수 있습니다. 디지털 핀을 핀 #5에 연결하는 것이 좋습니다. 대부분의 경우 IRQ 핀은 Arduino 라이브러리가 지원하지 않기 때문에 연결되지 않은 상태로 유지됩니다. 

 

 

 

 

Arduino Uno에 배선
SDA 디지털 10
SCK 디지털 13
MOSI 디지털 11
MISO 디지털 12
IRQ 연결되지 않은
GND GND
RST 디지털 9
3.3V 3.3V

 

태그를 읽는 코드 

 

스케치> 라이브러리> 라이브러리 관리로 이동하십시오. 검색창에 MFRC522를 입력하고 GithubCommunity의 RFID MFRC522 v2를 설치합니다.(아두이노 라이브러리 설치하는 방법 3가지 참고

 

 

 

Arduino 코드는 이해하기 어렵지 않습니다. RFID 태그에 맞춤형 데이터를 작성할 수 있습니다. 샘플 코드는 아래에 나타냅니다.  

/*
 * 
 * All the resources for this project: https://electronicsmith.com/
 * 
 * 
 */
#include <MFRC522v2.h>
#include <MFRC522DriverSPI.h>
//#include <MFRC522DriverI2C.h>
#include <MFRC522DriverPinSimple.h>
#include <MFRC522Debug.h>
 
MFRC522DriverPinSimple ss_pin(10); // Configurable, see typical pin layout above.
 
MFRC522DriverSPI driver{ss_pin}; // Create SPI driver.
//MFRC522DriverI2C driver{}; // Create I2C driver.
MFRC522 mfrc522{driver};  // Create MFRC522 instance.
 
void setup() {
  Serial.begin(115200);  // Initialize serial communications with the PC for debugging.
  while (!Serial);     // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4).
  mfrc522.PCD_Init();  // Init MFRC522 board.
  MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial);   // Show details of PCD - MFRC522 Card Reader details.
    Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}
 
void loop() {
    // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
    if ( !mfrc522.PICC_IsNewCardPresent()) {
        return;
    }
 
    // Select one of the cards.
    if ( !mfrc522.PICC_ReadCardSerial()) {
        return;
    }
 
    // Dump debug info about the card; PICC_HaltA() is automatically called.
  MFRC522Debug::PICC_DumpToSerial(mfrc522, Serial, &(mfrc522.uid));
}

 

위의 코드는 다음 이미지에 표시된 대로 카드 UID를 제공합니다. 이 고유한 텍스트가 카드의 열쇠입니다. 아래 사항을 확인하였다면 다음으로 RFID 카드를 LCD에 출력하는 작업을 진행할 예정입니다. 수고하셨습니다. 

 

 

 

 

다음은 Arduino 및 LCD와 RC522 RFID 연결하고 테스트를 진행합니다. 

 

/*
 * 
 * All the resources for this project: https://electronicsmith.com/
 * 
 * 
 */
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
 
#define RST_PIN 9
#define SS_PIN 10
 
byte readCard[4];
String MasterTag = "BD31152B";  // REPLACE this Tag ID with your Tag ID!!!
String tagID = "";
 
// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Parameters: (rs, enable, d4, d5, d6, d7) 
 
void setup() 
{
  // Initiating
  SPI.begin(); // SPI bus
  mfrc522.PCD_Init(); // MFRC522
  lcd.begin(16, 2); // LCD screen
 
  lcd.clear();
  lcd.print(" Access Control ");
  lcd.setCursor(0, 1);
  lcd.print("Scan Your Card>>");
}
 
void loop() 
{
   
  //Wait until new tag is available
  while (getID()) 
  {
    lcd.clear();
    lcd.setCursor(0, 0);
     
    if (tagID == MasterTag) 
    {
       
      lcd.print(" Access Granted!");
      // You can write any code here like opening doors, switching on a relay, lighting up an LED, or anything else you can think of.
    }
    else
    {
      lcd.print(" Access Denied!");
    }
     
      lcd.setCursor(0, 1);
      lcd.print(" ID : ");
      lcd.print(tagID);
       
    delay(2000);
 
    lcd.clear();
    lcd.print(" Access Control ");
    lcd.setCursor(0, 1);
    lcd.print("Scan Your Card>>");
  }
}
 
//Read new tag if available
boolean getID() 
{
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
  return false;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
  return false;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) { // The MIFARE PICCs that we use have 4 byte UID
  //readCard[i] = mfrc522.uid.uidByte[i];
  tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return true;
}

 

 

참고

아두이노와 RFID RC522 모듈 동작

아두이노 LCD Display I2C 모듈

 

 

 

반응형