윈도우 PC 간편 보안: RFID 잠금/해제 시스템 (아두이노 마이크로)
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 마이크로 (또는 레오나르도) |
1 |
필수: ATmega32U4 칩 탑재 보드만 가능 (우노, 메가, 나노, 프로 미니 불가) |
| RC-522 RFID 모듈 |
1 |
3.3V 전용, 5V 연결 시 손상 주의 |
| 저항 10k 옴 |
3 |
전압 분할기용 (5V → 3.3V) |
필요 도구
앱 및 온라인 서비스
프로젝트 소개
매번 윈도우 비밀번호를 입력해 잠금 해제하는 번거로움을 해결하기 위해 RFID 카드/태그로 PC를 잠그고 풀 수 있는 장치를 만들었습니다. 아두이노 마이크로/레오나르도의 Keyboard.h 라이브러리를 이용해 HID 키보드처럼 동작시킵니다.
핵심 원리
- ATmega32U4 칩은 내장 USB 컨트롤러를 통해 PC에 키보드/마우스로 인식됨
- RFID 카드 UID와 윈도우 비밀번호/PIN을 코드에 저장
- 등록된 카드 태깅 시
Win+L (잠금) → Enter → 비밀번호 → Enter 키스트로크 자동 전송
- 이미 잠긴 상태면 잠금 명령은 무시되고 비밀번호 입력으로 바로 해제됨
- 잠겨 있지 않으면 잠금 후 즉시 해제 시도하지만, 미세한 딜레이로 인해 잠금이 먼저 실행됨
하드웨어 연결 (SPI 버스 고정 핀 준수)
| RC-522 핀 |
아두이노 마이크로 핀 |
비고 |
| VCC |
3.3V (전압 분할기 또는 5V→3.3V 강압 모듈 사용) |
5V 직결 금지 |
| RST |
D5 |
코드에서 변경 가능 |
| GND |
GND |
|
| IRQ |
미연결 |
|
| MISO |
D14 (SCK 고정) |
SPI 하드웨어 핀 |
| MOSI |
D16 (MOSI 고정) |
SPI 하드웨어 핀 |
| SCK |
D15 (SCK 고정) |
SPI 하드웨어 핀 |
| SDA (SS) |
D10 |
코드에서 변경 가능 |

코드 설정 및 업로드 방법
- 아두이노 IDE에서 보드: 아두이노 레오나르도 선택 (마이크로도 동일)
- COM 포트 확인 후 업로드
- 시리얼 모니터 열기 (Ctrl+Shift+M, 9600 baud)
- RFID 카드/태그 태깅 → 첫 줄에 출력되는 UID 복사
- 코드 내
String card1 = "48b45a10"; 부분을 복사한 UID로 변경
- 코드 하단
Keyboard.print("PASSWORD"); 부분을 본인의 윈도우 비밀번호/PIN으로 변경
- 수정된 코드 다시 업로드 후 테스트

전체 소스 코드
#include
#include
#include
#define SS_PIN 10
#define RST_PIN 5
#define KEY_RETURN 0xB0 // 엔터 키 헥스 값
MFRC522 mfrc522(SS_PIN, RST_PIN);
char Enter = KEY_RETURN;
String readid;
String card1 = "48b45a10"; // 본인의 카드 UID로 변경
void setup() {
Serial.begin(9600);
Keyboard.begin();
SPI.begin();
mfrc522.PCD_Init();
}
void temp(byte *buffer, byte bufferSize) {
readid = "";
for (byte i = 0; i < bufferSize; i++) {
readid += String(buffer[i], HEX);
}
}
void loop() {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); // 상세 정보 시리얼 출력
temp(mfrc522.uid.uidByte, mfrc522.uid.size);
if (readid == card1) {
// Win+L (잠금)
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('l');
Keyboard.releaseAll();
delay(100);
// Enter (로그인 화면 진입)
Keyboard.press(Enter);
Keyboard.release(Enter);
delay(100);
// 비밀번호 입력
Keyboard.print("PASSWORD"); // 본인 비밀번호로 변경
Keyboard.releaseAll();
delay(100);
// Enter (로그인)
Keyboard.press(Enter);
Keyboard.releaseAll();
}
}
납땜 및 케이스 제작
- 프로토타입 검증 후 퍼프보드에 납땜 (헤더 핀 사용 권장, 보드 열 손상 방지)
- 종이박스, 탄소섬유 스티커 등으로 간단한 케이스 제작 가능
- USB 케이블 구멍, 상태 LED 구멍 마련

주의사항
이 프로젝트는 취미용이며 보안 취약점이 있을 수 있습니다. 중요한 시스템에는 사용하지 마세요. 다중 카드 지원, 애플리케이션별 비밀번호 차등 적용 등으로 확장 가능합니다.
회로도
