Arduino Uno R4와 SG90 서보 모터를 사용한 RFID 액세스 시스템(전체 튜토리얼)
이 블로그에서는 RC522 RFID 모듈을 사용하여 Arduino Uno R4 WiFi로 서보 모터의 각도를 제어하는 방법을 알아봅니다.

이 프로젝트에 사용된 모든 필수 구성 요소를 살펴보고 이를 Arduino Uno R4 WiFi 마이크로컨트롤러에 연결하는 방법을 보여드리겠습니다. 동영상 참고
시작하기 전에 컴퓨터에 Arduino IDE가 설치되어 있는지 확인하고, 보드 관리자에 Arduino Uno R4 보드 패키지가 설치되어 있는지 확인하세요.
사용된 구성 요소:
아두이노 우노 R4 와이파이
RC522 RFID 모듈
패시브 부저
SG90 서보 모터

사용된 구성 요소
RFID RC522 모듈
RFID RC522는 MFRC522 컨트롤러를 기반으로 제작된 인기 모듈입니다. RFID 카드 및 태그와 통신하는 데 사용되는 무선 주파수인 13.56MHz에서 작동합니다.
간단히 말해서, 이 모듈은 초당 1,356만 사이클의 속도로 전자기 신호를 송수신하여 RFID 카드를 효율적으로 감지하고 읽을 수 있습니다.
RC522 핀 구성

이 모듈에는 8개의 핀이 있지만, 간단한 프로젝트에서는 모든 핀을 사용할 필요가 없을 수도 있습니다. 일반적인 핀 배치는 다음과 같습니다.
- SDA / SS – Slave Select for SPI
- SCK – Clock
- MOSI – Master Out, Slave In
- MISO – Master In, Slave Out
- IRQ – Interrupt (optional)
- GND – Ground
- RST – Reset
- 3.3V – Power Supply
대부분의 Arduino 프로젝트에서는 SDA, SCK, MOSI, MISO, RST, GND, 3.3V 만 사용하면 됩니다 . RC522 RFID 모듈 사용에 대해 자세히 알아보려면 아래의 자세한 튜토리얼을 확인하세요.
SG90 서보 모터 핀아웃

이 프로젝트에 사용된 서보 모터는 작고 널리 사용되는 마이크로 서보 모터인 SG90입니다. 세 개의 핀이 있습니다.
- Signal/Data (yellow)
- VCC (red)
- GND (brown)
서보 모터는 Arduino Uno R4 WiFi의 5V 핀에서 전원을 공급받아야 하며, 신호 핀은 PWM 신호를 생성할 수 있는 Arduino의 디지털 핀에 연결되어야 합니다.
회로도

아두이노 코드
이 프로젝트에서는 MFRC522.h 와 Servo.h라는 두 개의 라이브러리를 설치해야 합니다 .
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
Servo myservo;
#define SS_PIN 10
#define RST_PIN 9
#define Alarm 7
#define SERVO_PIN 5
MFRC522 mfrc522(SS_PIN, RST_PIN);
void setup() {
myservo.attach(SERVO_PIN);
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode(Alarm, OUTPUT);
}
void loop() {
// RFID section
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return; // No new card, exit RFID part
}
// Read UID
Serial.print("UID tag: ");
String content = "";
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.println();
content.toUpperCase();
// Authorized card
if (content.substring(1) == "0B 23 9B 15") {
Serial.println("Access Granted - Correct Card");
myservo.write(0);
delay(2000);
myservo.write(180);
}
// Unauthorized card
else if (content.substring(1) == "52 EF E9 1C") {
Serial.println("Access Denied - Wrong Card");
digitalWrite(Alarm, HIGH);
delay(2500);
digitalWrite(Alarm, LOW);
myservo.write(180);
}
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}
어떻게 동작하나요?
SPI 라이브러리가 포함되어 있으며, 직렬 주변 장치 인터페이스 버스를 처리합니다. 이는 RC522 RFID 모듈이 SPI를 통해 Arduino와 통신하기 때문에 필요합니다.
#include <SPI.h>
RC522 RFID 리더기를 제어하는 기능(카드 감지, UID 읽기 등)을 제공하는 MFRC522 라이브러리가 포함되어 있습니다.
#include <MFRC522.h>
취미용 서보를 제어할 수 있는 Servo 라이브러리가 포함되어 있습니다(각도 설정, 핀에 부착 등).
#include <Servo.h>
Servo라는 이름의 객체를 생성합니다 myservo. 이 객체를 사용하여 서보를 핀에 연결하고 각도를 명령합니다(예: myservo.write(90)).
Servo myservo;
두 개의 상수를 정의합니다: SS_PIN(RC522에 대한 SPI용 슬레이브/선택 핀)과 RST_PIN(RC522용 리셋 핀)를 사용하면 #define나중에 코드에서 사용할 수 있는 읽기 쉬운 이름이 지정됩니다.
#define SS_PIN 10
#define RST_PIN 9
프로젝트에 사용되는 Arduino 핀을 정의합니다.
Alarm수동 부저를 구동하는 디지털 핀입니다.
SERVO_PIN서보 신호(PWM)를 전달하는 디지털 핀입니다.
#define Alarm 7
#define SERVO_PIN 5
mfrc522라는 MFRC522 객체를 생성하고, SPI 슬레이브 선택 및 리셋에 사용되는 핀을 지정합니다. 이는 특정 배선에 맞게 라이브러리 인스턴스를 초기화합니다.
MFRC522 mfrc522(SS_PIN, RST_PIN);
setup()시작 시 한 번 실행됩니다. 객체를 서보 신호 핀에 myservo.attach(SERVO_PIN);연결하여 위치를 제어할 수 있습니다.myservo
void setup() {
myservo.attach(SERVO_PIN);
디버깅을 위해 Arduino가 직렬 모니터에 메시지(UID, 액세스 허용/거부 메시지 등)를 인쇄할 수 있도록 9600보드에서 직렬 통신을 시작합니다.
Serial.begin(9600);
SPI.begin(); // Arduino에서 SPI 하드웨어를 초기화합니다.
mfrc522.PCD_Init(); RC522 모듈(PCD = 근접 결합 장치)을 초기화합니다. 이 함수는 리더기를 깨우고 카드 감지 및 통신을 준비합니다.
SPI.begin();
mfrc522.PCD_Init();
버저 핀을 출력(OUTPUT)으로 설정하여 digitalWrite()로 알람을 켜고 끌 수 있도록 합니다. setup() 함수 끝에 넣습니다.
pinMode(Alarm, OUTPUT);
}
loop() 영원히 반복되는 시작 :
- mfrc522.PICC_IsNewCardPresent() 새로운 카드/태그가 리더기 근처에 있는지 확인합니다.
- mfrc522.PICC_ReadCardSerial() 카드의 일련번호(UID)를 읽으려고 시도합니다.
- 두 함수 중 하나라도 false를 반환하면(카드 없음 또는 읽기 실패), if 조건이 실행되어 return;이 호출됩니다. 이는 loop() 함수를 조기에 종료하여 다음 반복(다음 스캔)까지 나머지 코드를 건너뛰게 합니다.
void loop() {
// RFID section
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return; // No new card, exit RFID part
}
Serial: 에 라벨을 인쇄합니다 "UID tag: ".
UID 바이트의 텍스트 표현을 생성하는 데 사용될 빈 문자열 변수 content를 선언합니다.
// Read UID
Serial.print("UID tag: ");
String content = "";
이 루프는 UID의 각 바이트를 반복하며 바이트당 두 가지 작업을 수행합니다.
1. 연속 인쇄:
0x10바이트가 (16진수 한 자리) 보다 작으면 앞에 공백을 인쇄하여 0두 개의 16진수 자리( )를 만들고 " 0", 그렇지 않으면 공백만 인쇄합니다.
그런 다음 바이트를 HEX 형식(예: 0B)으로 출력합니다.
이렇게 하면 다음과 같이 사람이 읽을 수 있는 UID가 생성됩니다 0B 23 9B 15.
2. 빌드 content문자열:
동일한 두 부분이 콘텐츠 문자열에 추가되므로, 전체 UID 텍스트가 content에 저장됩니다.
concat()조건문을 사용하면 각 바이트가 형식을 지정하기 위한 선행 공백이 있는 두 개의 16진수 문자로 표시됩니다.
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
간격을 맞추기 위해 두 줄의 줄바꿈을 Serial에 출력합니다. 출력을 읽기 쉽게 만듭니다.
Serial.println();
Serial.println();
content를 대문자로 변환합니다. (예: 0b → 0B) 이를 통해 UID 비교가 대소문자를 구분하지 않고 일관되게 이루어집니다.
content.toUpperCase();
content.substring(1)은 인덱스 1부터 시작하는 content 문자열을 가져옵니다. 이는 content가 이전에 생성된 선행 공백으로 시작하기 때문에 사용됩니다. substring(1)은 그 첫 번째 선행 공백을 제거하고 0B 23 9B 15를 생성합니다.
UID가 일치하면 "0B 23 9B 15"스케치는 카드를 승인된 것으로 인식합니다 .
- "Access Granted - Correct Card"직렬로 인쇄합니다 .
- myservo.write(0);서보를 0°로 이동합니다(예: 잠금장치를 엽니다).
- delay(2000);서보를 0°로 두고 2초간 기다립니다.
- myservo.write(180);서보를 180°로 되돌립니다(예: 다시 닫기/잠금).
// Authorized card
if (content.substring(1) == "0B 23 9B 15") {
Serial.println("Access Granted - Correct Card");
myservo.write(0);
delay(2000);
myservo.write(180);
}
Else-if는 승인되지 않은 특정 카드에 대해 다른 UID를 확인합니다.
- 인쇄 "Access Denied - Wrong Card".
- digitalWrite(Alarm, HIGH);부저를 켭니다.
- delay(2500);부저를 2.5초간 켜 둡니다.
- digitalWrite(Alarm, LOW);부저를 끕니다.
- myservo.write(180);서보가 180°(잠김) 상태를 유지하도록 보장합니다.
// Unauthorized card
else if (content.substring(1) == "52 EF E9 1C") {
Serial.println("Access Denied - Wrong Card");
digitalWrite(Alarm, HIGH);
delay(2500);
digitalWrite(Alarm, LOW);
myservo.write(180);
}
mfrc522.PICC_HaltA(); PICC(카드)에 정지 명령을 내립니다. 이렇게 하면 카드가 유휴 상태가 되어 리더가 다음 카드로 원활하게 이동할 수 있습니다.
mfrc522.PCD_StopCrypto1(); 라이브러리가 특정 카드 유형으로 시작했을 수 있는 암호화 통신을 중지합니다. 이는 MFRC522 라이브러리에서 트랜잭션을 완료하기 위해 권장하는 정리 단계입니다.
loop() 함수 끝 — 코드가 맨 위로 돌아와 반복됩니다.
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}
프로젝트 작동 방식
모든 것이 연결되면 Arduino는 새 RFID 카드가 감지되는지 지속적으로 확인합니다. 카드를 스캔할 때:
- 아두이노는 카드의 UID(고유 식별자) 를 읽습니다.
- UID를 코드에 저장된 사전 정의된 값과 비교합니다.
- UID가 승인된 카드와 일치하면 서보는 0° 로 회전하고 2초간 기다린 후 180° 로 돌아갑니다 .
- 승인되지 않은 카드가 스캔되면 부저(알람)가 2.5초 동안 켜지고 서보는 잠금 상태를 유지합니다.
그러면 RFID 모듈이 재설정되어 다음 스캔을 위해 준비됩니다.
휴~ 힘들다. 남자는 아무리 힘들어도 말을 하지 않는 사람인데 이런 말을 할 정도면 무언가 일이 있나 싶다. 하지만 무엇이든 잘 하는 사람, 특히 자신이 원하는 것이 있다면 손을 쪽 뻗을 줄 아는 사람이라서 긴 말이 필요없다.
'아두이노우노 R4' 카테고리의 다른 글
| RFID RC522 모듈 Arduino Uno R4 WIFI 인터페이스 (0) | 2025.11.28 |
|---|---|
| Arduino Nano R4 강력한 개요 (4) | 2025.08.09 |
| Arduino Nano R4 소개 (2) | 2025.07.25 |
| 아두이노 메가 보드 설계시 주의 사항 (0) | 2025.07.15 |
| 아두이노 메가 센서보드 센서 목록 (1) | 2025.07.13 |
| 아두이노 센서 50가지 목록 친절한 가이드 (6) | 2025.07.12 |
| 아두이노 Due 공식 자료 소개, 튜토리얼까지 한 번에 배우기 (1) | 2025.07.10 |
| 아두이노 Due 최종 가이드, 이것만 보세요 (4) | 2025.07.10 |
취업, 창업의 막막함, 외주 관리, 제품 부재!
당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약,
아이디어는 있지만 구현할 기술이 없는 막막함.
우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.
이제 고민을 멈추고, 캐어랩을 만나세요!
코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.
제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!
귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.
캐어랩