Imbedded - 테이블탑 프로젝터
| 테이블탑 프로젝터 Tabletop Projector | ||
|---|---|---|
| Team Imbedded | ||
| 프로젝트 완성품 | ||
| 학교 | 서울시립대학교 | |
| 학과 | 기계정보공학과 | |
| 학번 및 성명 | 20194300** | 구*본(팀장) |
| 20224300** | 김*호 | |
| 20204300** | 류*현 | |
| 20214300** | 조*민 | |
| 20204300** | 전*형 | |
| 지도교수 | 김*현 교수님 | |
| 개발기간 | 2025.03 ~ 2025.06 | |
목차
프로젝트 개요
프로젝트 소개
프로젝트 명
테이블탑 프로젝터 (Tabletop Projector)
프로젝트 요약
'테이블탑 프로젝터'는 프로젝터를 이용하여 테이블 위에 게임 화면을 투사하고, 터치 센서를 통해 사용자와 상호작용할 수 있는 인터랙티브 게임 플랫폼입니다. 다양한 보드게임과 카드게임을 디지털화하여 여러 사용자가 함께 즐길 수 있는 새로운 형태의 게임 환경을 제공합니다.
프로젝트 개발 컨셉
본 프로젝트는 테이블 위에 보드게임 화면을 투사하고, 사용자의 터치 입력으로 직접 상호작용할 수 있는 플랫폼을 구현하는 것입니다. 이를 통해 여러 사람이 각자 휴대기기에 국한되지 않고 하나의 공용 공간에서 함께 게임을 즐길 수 있으며, 전통 보드게임의 정적인 특성을 넘어 화면 위의 영상과 동적으로 교감하며 플레이할 수 있어 온라인 게임이 가지는 '대면 상호작용의 부재' 문제를 해소합니다.
프로젝트 배경 및 기대효과
배경
- 기존 보드게임의 한계: 종이 카드, 고정된 규칙, 제한된 게임 도구로 인한 정적인 플레이 방식
- 온라인 게임의 한계: 개인용 기기 중심으로 인한 대면 상호작용 부족, 사회적 단절 현상
- 기술적 공백: 프로젝터 활용 프로젝트는 있으나 터치 기능과 카메라 기반 객체 인식을 결합한 사례 부족
- 시장 요구: COVID-19 이후 소규모 모임 증가, 홈 엔터테인먼트 수요 증가
기대효과
- 보드게임 혁신: 기존 카드와 기물 중심에서 벗어나 복잡하고 다양한 규칙 적용 가능
- 접근성 향상: 플레이어가 복잡한 룰을 모두 숙지하지 않아도 시스템 보조로 원활한 게임 진행
- 사회적 가치: 온라인 게임의 사회적 단절 문제 보완, 공동 참여형 콘텐츠 발전
- 콘텐츠 확장성: 소프트웨어 업데이트를 통한 지속적인 새로운 룰 추가, 기존 IP 재활용
- 상업적 가능성: 보드게임 개발사에게 새로운 개발 방향성 제시
프로젝트 목표
- 확장 가능성: 리눅스 플랫폼 특성상 개발 환경이 잘 갖추어져 있어 향후 추가 보드게임 개발 가능
- 직관적 조작: 빠른 터치 속도 및 영상인식을 통한 자연스러운 사용자 상호작용
- 사회적 연결: 대면 보드게임의 장점과 디지털 게임의 편의성 결합
GitHub Link
https://github.com/hyobon99/25Embedded.git
동작 시나리오
- 시스템 시작: 프로젝터 전원 ON, 라즈베리파이 부팅, 터치 캘리브레이션 자동 실행 대기
- 터치 캘리브레이션: 부팅 후 캘리브레이션 화면에서 제시하는 위치를 클릭해 터치점 보정
- 게임 런쳐 실행: 터치 캘리브레이션 완료 후 게임 런쳐 자동 실행 대기
- 게임 선택: 터치를 통해 게임 런쳐에서 원하는 게임 선택
- 게임 진행
- 1차 게임(체스): 터치로 기물 이동
- 2차 게임(카드게임): 실물 카드를 테이블에 배치, 카메라가 인식하여 게임 진행
- 3차 게임(TRPG): GPT API를 활용한 스토리 진행
- 게임 종료: 게임 런쳐로 복귀
구현 내용
장치 선정
입력장치
1. 압력 감지 소자 (Velostat) ✅ 선정
- 특성: 전기 전도성을 띄는 소재로 압력 혹은 비틀림에 의해 전기 저항이 낮아지는 성질을 보유
- 구조: 구리선을 상부와 하부에 교차로 배치하여 압력에 의해 구리선 사이의 전류가 흐르는 양을 감지하고, 이를 통해 압력점을 추정
- 장점:
* ✅ 저비용 * ✅ 넓은 면적 커버 가능 * ✅ 압력 세기 구분 가능
- 단점:
* ❌ 정밀도가 전용 터치스크린 대비 낮음
2. 저항막 방식 터치스크린 패널
- 특성: ITO 처리된 필름 및 글라스의 2중 레이어로 구성되어 화면을 누르면 레이어가 서로 맞닿으며 발생한 전류와 저항의 변화를 감지
- 장점:
* ✅ 높은 정밀도 * ✅ 상용화된 기술
- 단점:
* ❌ 높은 비용 * ❌ 크기 제한 * ❌ 압력 세기 구분 어려움
3. 카메라 모듈 (IMX-219 → IMX-708로 업그레이드)
- 특성: 3296 x 2480의 해상도를 지원하는 CMOS 카메라 센서 → 4608 x 2592의 해상도를 지원하는 광각 카메라
- 용도: 프로젝터의 구조 특성상 객체인식 등에 활용하기 위해 가능한 넓은 화면을 수용할 수 있는 모델 사용
- 장점: 고해상도로 확대 시 이미지 손실 최소화
- 단점: 고정 초점으로 프로젝터 높이에 따라 초점 변동 → 자동 초점을 가진 Imx708 사용
4. 카메라 모듈 (OV5647)
- 특성: 2592 x 1944의 해상도를 지원하는 CMOS 카메라 센서
- 장점: IMX-219 모델에 비해 저렴한 가격
- 단점: 카메라의 해상도가 낮아 성능 제한
제어장치
1. Arduino Uno ✅ 선정
- 역할: 터치모듈의 연산, Shift register와 Multiplexer 제어를 위한 MCU(Micro Controller Unit)
- 장점: 터치 장치에 별개로 연결되어 배선 길이를 줄여 모듈성 향상, 연산 소모를 분할하여 라즈베리파이 리소스 부담 절약
- 적용성: 높음
2. Arduino Pro Mini
- 특성: 아두이노 우노와 유사한 MCU 장치로, 크기가 더 작다는 장점
- 장점: 소형화에 유리, 아두이노 우노와 동일한 성능
- 단점: USB 연결, 핀 체결이 우노에 비해 어려워 작동 테스트 단계에서 사용이 번거로움
3. Raspberry Pi 4B
- 특성: HDMI와 USB 연결을 기본적으로 지원하며, 1.8GHz Arm CPU, 4GB의 SDRAM 메모리 보유
- 장점: 이더넷 연결과 블루투스 모델을 자체지원하여 추후 기능 확장에 유용
- 적용성: 중간
4. Raspberry Pi 5 ✅ 선정
- 특성: 라즈베리파이 4B에서 향상된 2.4GHz Arm CPU, SDRAM 8GB의 메모리로 쾌적한 소프트웨어 실행환경 제공
- 장점: 고성능으로 복잡한 게임 로직 처리 가능
- 단점: 4B 모델에 비해 높은 비용
- 적용성: 높음
통신모듈
1. USB 유선 ✅ 선정
- 특성: 아두이노와 라즈베리파이 사이의 시리얼 통신용 연결단자
- 장점: 확장성이 높고 범용성이 높아 다양한 시스템에 터치 모듈 사용 가능, 전원을 컴퓨터로부터 받을 수 있어 아두이노에 충분한 전력 공급
- 적용성: 높음
2. 블루투스 무선
- 특성: 아두이노와 라즈베리파이 사이의 시리얼 통신용 블루투스 모듈
- 장점: 라즈베리파이의 내장 블루투스 모듈 활용 가능, 유선에 비해 통신선의 제약이 없고 미관상 유리
- 단점: 통신 딜레이 및 배터리의 필요성 요구
- 적용성: 중간
3. HDMI 유선 ✅ 선정
- 특성: 라즈베리파이와 프로젝터를 연결해주는 단자로 범용적인 영상 데이터 전송 규격
- 장점: 고화질 영상 지원, 범용적 사용으로 손쉬운 교체 가능
- 적용성: 높음
출력장치
1. ViewSonic PJD86533WS ✅ 선정
- 특성: 1280*800의 해상도를 지원하며 1m에서 100인치의 투사거리를 갖는 3000ANSI 루멘 밝기의 프로젝터
- 장점: 초단초점 지원으로 Tabletop Projector 프로젝트 목적에 부합, 밝은 밝기로 낮에도 충분히 사용 가능, 조금만 거리를 벌려도 투사 영상 크기가 넓어져 다양한 책상에 적용 가능
- 적용성: 높음
2. MAGCUBIC HY450
- 특성: 1920*1080의 해상도를 지원하며 1.2m에서 100인치의 투사거리를 갖는 900ANSI 루멘 밝기의 프로젝터
- 장점: ViewSonic 제품보다 높은 화질, 작은 사이즈로 소형화 가능
- 단점: 낮은 밝기 성능으로 주변 조명에 민감
- 적용성: 높음
최종 선택: ViewSonic PJD86533WS
- 특성: 적절한 초단초점 거리(30cm), 높은 밝기 성능
- 선정 이유: 개발 단계에서 발생가능한 변수에 대응하기 위해 밝기, 거리 및 소프트웨어 기능의 성능이 탁월한 모델 선정
커버 설계
- 재질: 5mm 두께 무광 아크릴 (검정색)
- 크기: 프로젝터 크기에 맞춤 제작
- 특징:
* 미니 리프트 1개를 사용한 높이 조절 기능 (커버 후면 손잡이) * 측면 방열구멍 설계 * 카메라 모듈 장착부 * 프로젝터 하부면적보다 큰 견고한 아크릴판을 리프트 상단에 부착하여 안정성 확보
터치패드 설계
터치 패드 구조
- 크기: 1200mm × 900mm
- 층 구조: 마감천(인조가죽) - PVC 필름 - Velostat - 구리 테이프 - Velostat - PVC 필름 - 마감천(논슬립 고무 패드)
- 구리선 배치: 5mm 폭, 20mm 간격
- 상단 마감 소재: 인조가죽 (적절한 반사 특성과 부드러운 사용자 경험 제공)
- 하단 마감 소재: 논슬립 고무 패드(미끄러지지 않고 신축성과 내습성이 좋음)
터치 모듈 제작 및 구현
실제 터치 모듈의 제작 과정과 동작 원리
터치 모듈 하드웨어 구성
터치 모듈 사양
- 전체 크기: 1200mm × 900mm (40×30 매트릭스)
- Velostat 시트: 12개 (3×4 배열)
- 터치 포인트: 1,200개 (40행 × 30열)
- 구리선 폭: 5mm (사용자 손가락 크기 고려)
- 구리선 간격: 20mm (3W 규칙 적용으로 크로스토크 방지)
- 응답 시간: 66ms 이하
- 압력 감지 범위: 30kPa ~ 50kPa
아두이노 제어 코드
터치 센서 어레이 제어를 위한 최적화된 아두이노 코드
// Velostat 센서 어레이 제어용 Arduino 코드 (40×32)
// 5×8-bit Shift Register → 40개 행(Row) 제어
// 4×8-ch MUX(CD4051) → 32개 열(Column) 선택
const int shiftDataPin = 2; // DS (시리얼 데이터 입력)
const int shiftClockPin = 3; // SH_CP (클럭, 모든 SR에 병렬)
const int shiftLatchPin = 4; // ST_CP (래치)
const int numShiftRegs = 5; // 5 × 8 = 40개 행
// MUX 선택 핀 (S0, S1, S2) – 공통으로 연결
const int muxSelectPins[3] = {5, 6, 7};
// MUX 공통 출력(COM) – 각각 A0~A3에 연결
const int muxAnalogPins[] = {A0, A1, A2, A3};
코드 동작 원리
- 행 선택 (Shift Register)
* 5개의 8비트 Shift Register를 직렬 연결하여 40개 행 제어 * 한 번에 하나의 행만 활성화 (Zero Potential Method) * LSBFIRST 방식으로 데이터 전송
- 열 읽기 (Multiplexer)
* 4개의 8채널 MUX를 사용하여 열 읽기 * 3개의 선택 핀으로 8개 채널 선택 * 각 MUX의 출력은 개별 아날로그 핀으로 연결
- 먹스 안정화
* 먹스 신호 안정성을 8배 향상시켜 빠른 스캔 속도 * 여러 먹스에 동일 핀 선택 신호를 주도록 알고리즘 개선
라즈베리파이 캘리브레이션 시스템
PyQt5 기반 GUI 캘리브레이션 및 마우스 제어 시스템
캘리브레이션 프로세스
1. 자동 시작 방지: 10초 대기 기간 동안 터치 감지 시 리셋
2. 4점 캘리브레이션: 화면 모서리 4점을 터치하여 좌표 매핑
3. 5초 타임아웃: 각 포인트마다 5초 내 터치 완료
4. 변환 행렬 계산: numpy polyfit을 사용한 1차 변환
5. 마우스 제어: pyautogui를 사용한 실시간 마우스 이동
주요 클래스 구조
class CalibrationThread(QThread):
"""터치 감지를 위한 별도 스레드"""
touch_detected = pyqtSignal(tuple) # (row, col) 좌표
def __init__(self, ser, offset):
self.NUM_ROWS = 40
self.NUM_COLS = 30
self.FRAME_SIZE = self.NUM_ROWS * self.NUM_COLS
self.TOUCH_THRESHOLD = 30
self.cool_down_time = 3.0 # 3초 쿨다운
class MouseControlThread(QThread):
"""마우스 제어를 위한 별도 스레드"""
def map_touch_to_screen(self, r, c):
"""터치 좌표를 화면 좌표로 변환"""
x_matrix, y_matrix = self.calibration_matrix
screen_x = int(np.polyval(x_matrix, r))
screen_y = int(np.polyval(y_matrix, c))
return screen_x, screen_y
터치 감지 알고리즘
행-열 최대값 교차점 필터링 알고리즘
def keep_row_col_max_intersection(self, arr):
"""행과 열의 최대값이 교차하는 지점만 유지"""
row_max = arr.max(axis=1, keepdims=True)
col_max = arr.max(axis=0, keepdims=True)
mask = (arr == row_max) & (arr == col_max)
return arr * mask
def find_peak(self, arr):
"""가장 강한 터치 포인트 찾기"""
candidates = sorted(
((v, r, c) for (r, c), v in np.ndenumerate(arr)),
key=lambda x: x[0], reverse=True
)
for value, r, c in candidates:
if value < self.TOUCH_THRESHOLD:
continue
if np.max(arr[r, :]) > value or np.max(arr[:, c]) > value:
continue
return r, c, value
return None
시스템 통합 및 성능
성능 특성
- 터치 응답 시간: 평균 66ms 이하
- 정확도: ±20mm (캘리브레이션 후)
- 압력 감지: 일반적인 손가락 압력으로 정상 작동
- 크로스토크 억제: 3W 규칙을 적용한 PCB 설계
- 전력 소비: 5V 1A (터치 모듈 + 아두이노)
소프트웨어 설계
1차 게임 - 4인 체스
터치 패드를 활용하기 위한 목적의 1차 게임 요소
- 기반: 오픈소스 체스 게임을 라즈베리파이 OS에 포팅
- UI 개선:
* 기보, 수 돌리기 등 불필요한 UI 삭제 * 배경화면을 밝게 설정하여 빔프로젝터 저밝기 환경 대응 * 체스판 크기 확대로 터치 부정확성 보완
- 특징: 4명이 동시에 즐길 수 있는 변형 체스
2차 게임 - Texas Hold'em Poker
카메라와 객체 인식 모델을 활용하기 위한 목적의 2차 게임 요소
게임 UI 설계 필요조건
1. ✅ 모든 UI 상호작용은 터치로만 구현
2. ✅ 프로젝터 위치에 따른 카메라 비추는 반경 변화 고려하여 인식 기물을 화면 중앙 배치
3. ✅ 다중 플레이어를 위한 각 플레이어별 개인 보드 배치
4. ✅ 라즈베리파이 부하 고려하여 캡처 방식으로 카메라 인식 구현
5. ✅ 초보자 돌발행동 방지를 위한 변수 요소 사전 비활성화
6. ✅ 게임 진행을 위한 사회자 역할 메시지 창 구현
Texas Hold'em Poker (프로토타입) ✅
개발 목적
- 라즈베리파이 카메라 성능과 객체 인식 성능 검증
- 카드 인식: YOLO 모델 활용 (테스트 이미지 90% 이상 인식률)
게임 로직
- 플레이어 인원 선택 (2-5명)
- SB, BB 자동 배팅
- 콜, 체크, 폴드, 레이즈, 올인 배팅 옵션
- 프리플랍-플랍-턴-리버 단계별 진행
- 자동 승자 판별 및 배팅액 분배
- 파산 방지를 위한 3000칩 자동 지급
UI 특징
- 각 플레이어별 개인 보드 (테이블 외각 배치)
- 중앙 커뮤니티 카드 배치 (카메라 인식 범위 고려)
- 배팅액에 따른 애니메이션 효과
- 쇼다운 상황 특수 효과
변수 처리
- 비순차 배팅 방지
- 턴 종료 전 카드 공개 방지
- 배팅액에 따른 선택지 제한
카드 인식 프로세스
📸 카메라 설정
- 해상도: 4608×2592 (ScalerCrop: (0, 0, 4608, 2592))
- 노출 모드 (AeExposureMode): 1
- 노출 보정값 (ExposureValue): -2.5
🔍 이미지 처리 파이프라인
- 이미지 전처리 * 카메라 캡처 → 'image' 변수 저장 * 이진화 처리 (프로젝터 밝은 환경 고려한 임계값 설정) * 카드 최소 영역, 가로세로 비율 제한 (실제 카드 63mm×88mm 기준)
- 카드 검출 * detect_card_edges() 함수로 카드 윤곽 검출 * 4개 끝점 좌표 확보 * 여백 포함한 crop으로 문양/숫자 손상 방지
- 이미지 보정 * 샤프닝 커널 적용으로 확대 시 화질 저하 보완 * 인식 모델 최적화를 위한 이미지 품질 향상
- 모델 인식 * YOLO 모델 적용 * 인식률 30% 이상 결과 중 최고 신뢰도 선택 * 좌표 정보 활용한 카드 순서 정렬 (Y좌표 오차 허용)
- 게임 로직 반영 * 인식 결과를 게임 상태에 반영 * 승자 판별 로직 실행
3차 게임 - TRPG
터치, 카메라 기반 객체인식, AI API를 활용하는 최종 목적 구현을 위한 3차 게임 요소
- 맵 생성: Polytopia Map Generator 오픈소스 활용 (GNU GPL 라이선스)
- 캐릭터 시스템:
* D&D 기반 12개 직업 선택 * 스펠 사용 가능 직업: Bard, Cleric, Druid, Paladin, Sorcerer, Warlock, Wizard * 직업별 차별화된 스펠 목록
- 맵 구현: QWebEngineView를 사용하여 HTML 기반 맵을 PyQt5 UI에 통합
- 스토리 진행: GPT API를 활용한 동적 시나리오 생성 (예정)
프로젝트 결과
포스터
최종 평가
| 평가 항목 | 목표치 | 현재 상태 | 달성 여부 |
|---|---|---|---|
| 터치 정확도 | < 20mm | 최대 14mm, 평균 20mm | 조건부 충족 |
| 터치 응답시간 | < 100ms | 25회 평균 53.3ms (최대 66.7ms) | 충족 |
| 지원 게임 가짓수 | 2+ 개 | 2개 구현 + 2개 개발중 | 충족 |
최종 시연 영상
프로젝트 리뷰
팀 구성 및 역할 분담
| 팀원명 | 주요 역할 | 세부 담당 업무 |
|---|---|---|
| 구*본 (팀장) | 프로젝트 관리, 터치 시스템 |
|
| 김*호 | 터치 시스템, 통합 |
|
| 류*현 | 터치 시스템 |
|
| 조*민 | 기구 설계, 통합 |
|
| 전*형 | 파이카메라 기반 객체인식 |
|
향후 확장 가능성
- 추가 게임 장르 지원
- AI 대전 상대 구현
- 온라인 멀티플레이어 지원
- 모바일 앱 연동
프로젝트를 진행하며 느낀 점
- 하드웨어 제약사항을 고려한 현실적 목표 설정의 중요성
- 프로토타입을 통한 조기 검증의 필요성
- 팀 내 소통과 역할 분담의 중요성
- 조*민:
- 이번 테이블탑 프로젝터 프로젝트에서 저는 하드웨어 제작 전반을 담당했습니다. 리프트를 하나로 할지 두 개로 할지 구조적인 고민부터 시작해서, 전체적인 디자인과 내부 부품 배치까지 고려할 요소들이 많았습니다. 특히 라즈베리 파이의 위치는 발열, 배선, 접근성 등을 모두 감안해야 해서 여러 번 위치를 바꿔가며 조정했습니다.
- 외형 커버의 경우, 소재 선정부터 직접 발품을 팔아 재단해오고, 레이저 커팅을 위해 외부 작업장까지 찾아가며 제작을 진행했습니다. 실제로 손이 많이 가는 작업이 많았지만, 그만큼 완성도 있는 결과물을 만들기 위해 노력했던 과정이라 기억에 많이 남습니다.
- 팀원들과의 협업도 중요한 부분이었습니다. 하드웨어 혼자만의 판단으로는 어려운 결정들이 많았기 때문에, 소프트웨어와 기획 파트 팀원들과 자주 의견을 나누고 조율하면서 하나의 시스템으로 잘 엮어낼 수 있었습니다. 각자의 역할이 달랐지만, 소통을 통해 완성도를 높일 수 있었던 점이 인상 깊었습니다.
- 또한 이번 프로젝트에서는 처음으로 포스터 제작도 직접 맡아보았습니다. 한 학기 동안의 과정과 결과를 하나의 이미지로 압축해 정리한다는 것이 생각보다 쉽지 않았지만, 되돌아보며 핵심 내용을 정리해내는 과정 자체가 의미 있었습니다. 팀 전체의 흐름과 성과를 시각적으로 정리하면서 프로젝트의 전체 맥락을 다시 한번 되짚을 수 있는 좋은 경험이었습니다.
- 결과적으로 하드웨어 설계부터 제작, 협업, 그리고 포스터 제작까지 처음부터 끝까지 다양한 경험을 할 수 있었고, 프로젝트의 완성도뿐만 아니라 제 개인적인 성장 면에서도 의미 있는 시간이었다고 생각합니다.
참고 자료 및 오픈소스
활용 오픈소스
- 체스 게임: GNU GPL 라이선스
- YOLO 카드 인식: GitHub 공개 모델
- Polytopia Map Generator: GNU GPL 라이선스
- 포켓몬 카드 API: 16,000장 데이터베이스
기술 참고 문헌
[1] M. Kciuk, Z. Kowalik, G. Lo Sciuto, S. Sławski, and S. Mastrostefano, "Intelligent medical Velostat pressure sensor mat based on artificial neural network and Arduino embedded system," Applied System Innovation, vol. 6, no. 5, p. 84, Sep. 2023, doi: 10.3390/asi6050084.
[2] L. Yuan, H. Qu, and J. Li, "Velostat sensor array for object recognition," IEEE Sensors Journal, vol. 22, no. 2, pp. 1692–1701, Jan. 15, 2022 </div>
Imbedded - 테이블탑 프로젝터
"디지털과 아날로그가 만나는 새로운 게임 플랫폼"



