아두이노 우노 기반 DIY 얼굴 추적 카메라: 파이썬 OpenCV 연동
프로젝트 개요
3D 프린팅한 머리 모형에 얼굴 추적 기능을 부여하여, 방 안을 움직이는 사람을 카메라가 계속 응시하도록 만든 인터랙티브 아트 프로젝트입니다. 아두이노 우노가 2축 서보(팬/틸트)를 제어하고, PC에서 실행되는 파이썬 스크립트(OpenCV)가 웹캠 영상에서 얼굴을 검출하여 아두이노로 시리얼 명령을 전송하는 분산 아키텍처입니다.
시스템 아키텍처
┌─────────────┐ USB/Serial ┌──────────────┐
│ Python PC │ ◄─────────────────► │ Arduino UNO │
│ (OpenCV) │ │ (Servo x2) │
└─────────────┘ └──────────────┘
│ │
▼ ▼
웹캠 영상 팬/틸트 서보
얼굴 검출 │
좌표 계산 ▼
시리얼 전송 3색 상태 LED
하드웨어 구성
| 부품 |
수량 |
비고 |
| Arduino UNO |
1 |
서보 제어, LED 표시 |
| 웹캠 (USB) |
1 |
PC 연결, 720p 이상 권장 |
| MG-90S 서보 모터 |
2 |
팬(좌우), 틸트(상하) |
| 9V 1A 어댑터 + 7805 레귤레이터 |
1세트 |
서보 전원용 (아두이노 5V 핀 직결 금지) |
| 3색 LED (적/녹/황) |
각 1 |
220Ω 저항 직렬, 상태 표시용 |
| 3D 프린트 파트 |
1세트 |
Thingiverse/작가 사이트에서 다운로드 |
| 고무줄, 종이클립, 나사 등 |
- |
기계적 조립용 |
필수 도구
- 3D 프린터 (PLA/PETG 필라멘트)
- 납땜 인두, 와이어 스트리퍼, 롱노즈 플라이어
- 드라이버, 멀티미터
- 열수축 튜브
아두이노 펌웨어
통신 프로토콜
시리얼 115200 bps, 패킷 포맷: <pan각도,tilt각도,LED상태>
- 시작 마커:
<, 종료 마커: >
- 예:
<90.0,45.5,1> → 팬 90°, 틸트 45.5°, 녹색 LED ON
- 아두이노 → PC 응답:
<현재팬각도,현재틸트각도>
LED 상태 코드
| 코드 |
색상 |
의미 |
| 0 |
빨강 |
얼굴 미검출 |
| 1 |
녹색 |
얼굴 검출됨 + 중앙 정렬 |
| 2 |
노랑 |
얼굴 검출됨 + 중앙 벗어남 |
| 3 |
흰색(전체 ON) |
시작 시퀀스/테스트 |
핵심 코드 구조
#include <Servo.h>
Servo panServo, tiltServo;
const byte buffSize = 40;
char inputBuffer[buffSize];
// ... 파싱 로직 (strtok + atof/atoi)
void loop() {
getDataFromPC(); // 시리얼 수신 및 파싱
replyToPC(); // 현재 서보 각도 에코백
moveServo(); // 서보 구동
setLED(); // LED 상태 업데이트
}
파이썬 얼굴 검출 소프트웨어
요구 사항
- Python 3.x
- OpenCV (
pip install opencv-python)
- pyserial (
pip install pyserial)
- numpy
주요 기능
- Haar Cascade 또는 DNN 기반 얼굴 검출
- 검출된 얼굴 중심 좌표 → 프레임 중심 오차 계산
- 비례 제어(P 제어)로 서보 목표 각도 계산
- 서보 범위 제한, 회전 방향 반전 옵션 제공
- 수동 제어 모드 (키보드/슬라이더) 지원
- 실행 파일(.exe) 빌드 제공 (Python 미설치 환경용)
소스 코드 저장소
GitHub: LittleFrenchKev/face_tracking_camera
작가 웹사이트: littlefrenchkev.com
조립 가이드 요약
- 3D 프린트 파트 출력 (팬/틸트 브래킷, 카메라 마운트, 베이스)
- 서보 혼(horn) 장착 및 기어박스 윤활
- 웹캠 분해 후 PCB만 추출하여 마운트에 고정 (고무줄 활용)
- 서보 배선: 팬→핀 8, 틸트→핀 9, 전원 별도 5V 레귤레이터로부터
- LED 배선: 적색→핀 2, 황색→핀 3, 녹색→핀 4 (220Ω 저항 필수)
- 아두이노 펌웨어 업로드 → 파이썬 스크립트 실행 → COM 포트 선택 → Connect
응용 확장 아이디어
- 객체 추적(특정 색상, QR 코드, ArUco 마커)로 전환
- 다중 카메라/서보로 광역 감시 시스템 구성
- 로봇 팔 제어 인터페이스로 응용
- 표정 인식 연동으로 인터랙티브 아트 고도화
- ESP32-CAM으로 무선화 및 엣지 컴퓨팅 (PC 불필요)
문제 해결 팁
- 서보 떨림: 전원 부족 → 별도 5V 2A 이상 어댑터 + 7805 또는 UBEC 사용
- 얼굴 검출 실패: 조명 확보, Haar Cascade XML 경로 확인, DNN 모델로 교체
- 시리얼 통신 끊김: 보드레이트 일치 확인, 시리얼 모니터 동시 열림 여부 체크
- 역방향 동작: 파이썬 설정에서
invert_pan, invert_tilt 토글