아두이노·ENC28J60·MFRC522로 네트워크 연동 RFID 리더기 만들기
부품 및 소모품
| 부품 |
수량 |
비고 |
| MFRC522 RFID 리더 모듈 (MIFARE 호환) |
1 |
SPI 방식이면 어떤 타입이든 무관 |
| 아두이노 우노 (또는 나노/메가 등) |
1 |
보드에 맞게 핀 번호 수정 필요 |
| ENC28J60 이더넷 모듈/실드 |
1 |
타 이더넷 칩셋 사용 시 코드 수정 필요 |
| 점퍼 와이어 (수-수, 수-암) |
1세트 |
|
| 브레드보드 |
1 |
|
| 컴퓨터 (TCP 서버 구동용) |
1 |
동일 네트워크 접속 필요 |
필요 도구
앱 및 온라인 서비스
- 아두이노 IDE
- PyCharm (파이썬 서버 개발용, 기타 TCP/텔넷 서버로 대체 가능)
프로젝트 배경
RFID 출입통제/모니터링 시스템은 상용 제품이 200~2000달러로 고가입니다. 필자와 친구는 100달러 미만으로 더 많은 기능을 구현하고자 했습니다. 그 결과물인 인터넷 연동 아두이노 RFID 태그 리더기는 단 20달러 추가로 도어락 연동도 가능합니다. 고등학교 학생 출석 관리 시스템으로 기획되었으며, 학교 승인을 기다리고 있습니다.
하드웨어 연결 (아두이노 나노 기준)
- 아두이노를 브레드보드에 장착
- 보드별 SPI 핀아웃 확인 후 아래 연결:
- 아두이노 10번(SS) → 이더넷 모듈 SS/CS
- 아두이노 12번(MISO) → RFID MISO, 이더넷 SO
- 아두이노 11번(MOSI) → RFID MOSI, 이더넷 SI
- 아두이노 13번(SCK) → RFID SCK, 이더넷 SCK
- 아두이노 9번 → RFID RST
- 아두이노 8번 → RFID SSN (이더넷이 10번 사용하므로 별도 할당)
- 아두이노 5,4,3번 → RGB LED (G, B, R)
- AC-DC 어댑터(3.3V/5V, 700mA 이상) → 브레드보드 전원 레일
- 아두이노 GND ↔ 어댑터 GND 공통 접지
- 주의: RFID와 이더넷 모듈은 3.3V 전용입니다. 5V 직결 시 손상! 저항 분할 또는 3.3V 레귤레이터 필수
- 이더넷 케이블 연결 → 컴퓨터와 동일 공유기/네트워크에 물릴 것
- USB로 아두이노-PC 연결
사전 준비: 필수 라이브러리 설치
- UIPEthernet: GitHub에서 다운로드 →
Arduino/libraries/에 압축 해제
- MFRC522: GitHub에서 다운로드 → 동일 경로에 설치
- 아두이노 IDE 재시작
코드 수정 포인트 (네트워크 설정)
// MAC 주소 (여러 대 만들 때만 변경)
uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
// 아두이노 고정 IP (자사 네트워크 대역에 맞게)
IPAddress mip(192,168,1,160);
IPAddress mdns(8,8,8,8); // DNS (구글 DNS 또는 공유기 IP)
IPAddress mgate(192,168,1,5); // 게이트웨이 (공유기 IP, ipconfig로 확인)
IPAddress msubnet(255,255,255,0);
Ethernet.begin(mac, mip, mdns, mgate, msubnet);
// 서버 전송 대상 IP/포트 (PC에서 ipconfig로 확인)
client.connect(IPAddress(192,168,1,100), 23); // 포트 23(텔넷)
PC 측 TCP 서버 예제 (파이썬)
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
print self.data
# 여기에 SQL 조회 등 로직 추가
# if (self.data == 허용된_카드_ID): self.request.sendall("g")
# else: self.request.sendall("bb")
self.request.sendall("g") // 테스트용: 무조건 허용
if __name__ == "__main__":
HOST, PORT = "", 23
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
server.serve_forever()
실행 및 테스트 절차
- AC-DC 어댑터 전원 연결
- 아두이노 USB 연결, 네트워크 동일 확인
- 수정된 아두이노 코드 업로드
- PC에서 파이썬 서버 실행 (
python server.py)
- 아두이노 리셋 → 파란 LED 대기 상태 확인
- RFID 카드 태깅 → 서버 콘솔에 카드 ID 출력 및 녹색 LED(성공) 또는 빨간 LED(실패) 확인
LED 상태 표시 의미
| 색상/패턴 |
의미 |
| 보라/빨강 페이드 |
부팅 중 |
| 파랑 |
대기 중 (카드 또는 서버 응답 기다림) |
| 초록 |
인증 성공 (서버 응답 'g' 수신) |
| 빨강 |
에러 (카드 각도 불량, 서버 타임아웃, 인증 실패 등) |
| 30초 이상 지연 후 빨강 |
서버 연결 실패 (전원 부족, 방화벽, 네트워크 불일치 등) |
문제 해결 팁
- 윈도우 방화벽 끄기 또는 인바운드/아웃바운드 23번 포트 허용
- 공유기 포트 포워딩: 23번 → PC 내부 IP
- 무선 대신 유선으로 공유기 직결 테스트
- 더 용량 큰 AC-DC 어댑터 사용 (이더넷 모듈 전력 소모 큼)
- IP/게이트웨이/서버 IP 오타 재확인
소스 코드 저장소
최신 버전: GitHub - InternetRFIDTags
회로도

케이블 색상 규칙: 빨강=전원(+), 검정=그라운드(-), 노랑=IR 센서 신호, 주황/초록=바이컬러 LED, 보라=모터 방향, 파랑=모터 속도(PWM)