이 튜토리얼에서는 RFID가 무엇인지, 어떻게 작동하는지, 그리고 아두이노 기반 RFID 도어락을 만드는 방법을 배웁니다. 아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.
개요
RFID는 Radio Frequency IDentification(무선 주파수 식별)의 약자로, 비접촉식 기술이며 인원 추적, 출입 통제, 공급망 관리, 도서관 도서 추적, 톨게이트 시스템 등 다양한 산업에서 널리 사용됩니다.
RFID 작동 원리
RFID 시스템은 두 가지 주요 구성 요소로 이루어집니다: 식별하려는 객체에 부착되는 트랜스폰더(태그)와 트랜시버(리더기)입니다.
RFID 리더기는 무선 주파수 모듈, 제어 장치, 고주파 전자기장을 생성하는 안테나 코일로 구성됩니다. 반면 태그는 보통 안테나와 전자 마이크로칩만으로 이루어진 수동 소자입니다. 태그가 트랜시버의 전자기장 근처에 오면 유도 작용으로 안테나 코일에 전압이 발생해 마이크로칩에 전력을 공급합니다.
태그가 전원을 공급받으면 리더기에서 전송된 메시지를 추출할 수 있고, 태그 안테나의 부하를 켜고 끄는 부하 변조(load manipulation) 방식으로 리더기에 데이터를 다시 전송합니다. 이는 리더기 안테나의 전력 소모에 영향을 주어 전압 강하로 측정되며, 이 변화를 0과 1로 인식해 데이터를 전송합니다.
리더기와 태그 간 데이터 전송의 또 다른 방식은 백스캐터 커플링(backscattered coupling)입니다. 이 경우 태그는 수신한 전력의 일부로 또 다른 전자기장을 생성해 리더기 안테나에서 수신되게 합니다.
RFID와 아두이노
기본 원리를 알았으니 이제 아두이노와 RFID를 이용해 직접 RFID 도어락을 만들어 보겠습니다. MIFARE 프로토콜 기반 태그와 MFRC522 RFID 리더기를 사용하며, 가격은 몇 달러에 불과합니다.
이 태그들은 1KB 메모리를 가지며 연산이 가능한 마이크로칩을 탑재합니다. 작동 주파수는 13.56MHz, 통신 거리는 안테나 형상에 따라 최대 10cm입니다. 태그를 빛에 비추면 앞서 설명한 안테나와 마이크로칩을 육안으로 확인할 수 있습니다.
RFID 리더기 모듈은 SPI 프로토콜로 아두이노와 통신하며, 연결 방법은 다음과 같습니다. 모듈의 VCC는 반드시 3.3V에 연결해야 하며, 나머지 핀들은 5V 톨러런트이므로 걱정할 필요 없습니다.
모듈을 연결한 후 GitHub에서 MFRC522 라이브러리를 다운로드합니다. 라이브러리에는 모듈 사용법을 익힐 수 있는 여러 좋은 예제가 포함되어 있습니다.
먼저 "DumpInfo" 예제를 업로드해 시스템이 정상 작동하는지 테스트합니다. 시리얼 모니터를 실행하고 태그를 모듈 근처에 가져가면 리더기가 태그를 읽어 모든 정보를 시리얼 모니터에 표시합니다.
여기서 태그의 UID 번호와 1KB 메모리(16섹터, 각 섹터당 4블록, 블록당 2바이트 저장 가능)를 확인할 수 있습니다. 이 튜토리얼에서는 태그 메모리는 사용하지 않고 UID 번호만 활용합니다.
아두이노 RFID 도어락 출입 통제 프로젝트
코드를 보기 전에 이 프로젝트의 구성 요소와 회로도를 살펴보겠습니다.
RFID 모듈 외에 문 개폐 감지용 근접 센서, 잠금 장치용 서보 모터, 문자 표시용 LCD 디스플레이를 사용합니다.
필요한 부품은 아래 링크에서 구할 수 있습니다:
MFRC522 RFID 모듈 …………………….
서보 모터 ……………………………………..
LCD 디스플레이 ………………………………………
아두이노 보드 ………………………………….
브레드보드와 점퍼 와이어 ……………..
근접 센서 CNY70 ……………………
프로젝트 워크플로는 다음과 같습니다: 먼저 마스터 태그를 등록하면 시스템이 일반 모드로 진입합니다. 미등록 태그를 스캔하면 접근이 거부되지만, 마스터 태그를 스캔하면 프로그래밍 모드로 들어가 미등록 태그를 추가/승인할 수 있습니다. 이후 해당 태그를 다시 스캔하면 접근이 허용되어 문을 열 수 있습니다.
문이 닫히면 자동으로 잠깁니다. 시스템에서 태그를 삭제하려면 다시 프로그래밍 모드로 들어가 해당 태그를 스캔하면 됩니다.
소스 코드
이제 코드를 살펴보겠습니다. 먼저 RFID 모듈, 디스플레이, 서보 모터용 라이브러리를 포함하고, 프로그램에 필요한 변수들을 정의하며 라이브러리 인스턴스를 생성합니다.
setup 섹션에서는 모듈들을 초기화하고 서보 모터의 초기값을 잠금 위치로 설정합니다. 디스플레이에 초기 메시지를 출력하고, 마스터 태그가 스캔될 때까지 대기하는 while 루프를 실행합니다. getID() 사용자 정의 함수로 태그 UID를 읽어 myTags[0] 배열 첫 번째 위치에 저장합니다.
getID() 사용자 정의 함수를 살펴보겠습니다. 먼저 리더기 근처에 새 태그가 있는지 확인하고, 있다면 for 루프로 태그의 UID를 읽습니다. 사용 중인 태그는 4바이트 UID를 가지므로 4회 반복하며, concat() 함수로 4바이트를 하나의 문자열 변수에 합칩니다. 모든 문자를 대문자로 변환한 후 읽기를 중단합니다.
uint8_t getID() {
if (!mfrc522.PICC_IsNewCardPresent()) return 0;
if (!mfrc522.PICC_ReadCardSerial()) return 0;
tagID = "";
for (uint8_t i = 0; i < 4; i++) {
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
tagID.toUpperCase();
mfrc522.PICC_HaltA();
return 1;
}코드 언어: Arduino (arduino)
setup 섹션 끝에서 printNormalModeMessage() 함수를 호출해 디스플레이에 "Access Control" 메시지를 출력합니다.