"Imbedded - 테이블탑 프로젝터"의 두 판 사이의 차이

MIE capstone
이동: 둘러보기, 검색
(undefined)
21번째 줄: 21번째 줄:
 
| style="background-color:white;" | 20194300** || style="background-color:white;" | 전*형
 
| style="background-color:white;" | 20194300** || style="background-color:white;" | 전*형
 
|-
 
|-
! style="background-color:#2196f3; color:white;" | 지도교수 || style="background-color:white" colspan="2" | 안현식 교수님
+
! style="background-color:#2196f3; color:white;" | 지도교수 || style="background-color:white" colspan="2" | 김*현 교수님
 
|-
 
|-
 
! style="background-color:#2196f3; color:white;" | 개발기간 || style="background-color:white" colspan="2" | 2025.03 ~ 2025.06
 
! style="background-color:#2196f3; color:white;" | 개발기간 || style="background-color:white" colspan="2" | 2025.03 ~ 2025.06
41번째 줄: 41번째 줄:
 
<div style="background-color:#f8f9fa; border-left:4px solid #1976d2; padding:20px; margin:10px 0;">
 
<div style="background-color:#f8f9fa; border-left:4px solid #1976d2; padding:20px; margin:10px 0;">
 
'''배경'''
 
'''배경'''
* '''기존 보드게임의 한계''':
+
* '''기존 보드게임의 한계''': 종이 카드, 고정된 규칙, 제한된 게임 도구로 인한 정적인 플레이 방식
 +
* '''온라인 게임의 한계''': 개인용 기기 중심으로 인한 대면 상호작용 부족, 사회적 단절 현상
 +
* '''기술적 공백''': 프로젝터 활용 프로젝트는 있으나 터치 기능과 카메라 기반 객체 인식을 결합한 사례 부족
 +
* '''시장 요구''': COVID-19 이후 소규모 모임 증가, 홈 엔터테인먼트 수요 증가
 +
 
 +
'''기대효과'''
 +
* '''보드게임 혁신''': 기존 카드와 기물 중심에서 벗어나 복잡하고 다양한 규칙 적용 가능
 +
* '''접근성 향상''': 플레이어가 복잡한 룰을 모두 숙지하지 않아도 시스템 보조로 원활한 게임 진행
 +
* '''사회적 가치''': 온라인 게임의 사회적 단절 문제 보완, 공동 참여형 콘텐츠 발전
 +
* '''콘텐츠 확장성''': 소프트웨어 업데이트를 통한 지속적인 새로운 룰 추가, 기존 IP 재활용
 +
* '''상업적 가능성''': 보드게임 개발사에게 새로운 개발 방향성 제시
 +
</div>
 +
 
 +
===프로젝트 목표===
 +
* '''확장 가능성''': 리눅스 플랫폼 특성상 개발 환경이 잘 갖추어져 있어 향후 추가 보드게임 개발 가능
 +
* '''직관적 조작''': 빠른 터치 속도 및 영상인식을 통한 자연스러운 사용자 상호작용
 +
* '''사회적 연결''': 대면 보드게임의 장점과 디지털 게임의 편의성 결합
 +
 
 +
==동작 시나리오==
 +
<ol>
 +
<li><strong>시스템 시작</strong>: 프로젝터 전원 ON, 라즈베리파이 부팅, 터치 캘리브레이션 자동 실행 대기</li>
 +
<li><strong>터치 캘리브레이션</strong>: 부팅 후 캘리브레이션 화면에서 제시하는 위치를 클릭해 터치점 보정</li>
 +
<li><strong>게임 런쳐 실행</strong>: 터치 캘리브레이션 완료 후 게임 런쳐 자동 실행 대기</li>
 +
<li><strong>게임 선택</strong>: 터치를 통해 게임 런쳐에서 원하는 게임 선택</li>
 +
<li><strong>게임 진행</strong>
 +
  <ul>
 +
  <li>1차 게임(체스): 터치로 기물 이동</li>
 +
  <li>2차 게임(카드게임): 실물 카드를 테이블에 배치, 카메라가 인식하여 게임 진행</li>
 +
  <li>3차 게임(TRPG): GPT API를 활용한 스토리 진행</li>
 +
  </ul>
 +
</li>
 +
<li><strong>게임 종료</strong>: 게임 런쳐로 복귀</li>
 +
</ol>
 +
 
 +
==구현 내용==
 +
===장치 선정===
 +
<div class="mw-collapsible" style="border:1px solid #ddd; margin:10px 0;">
 +
<h4 style="background-color:#2196f3; color:white; padding:10px; margin:0;">입력장치</h4>
 +
<div class="mw-collapsible-content" style="padding:20px;">
 +
 
 +
'''1. 압력 감지 소자 (Velostat)''' ✅ '''선정'''
 +
<gallery mode="packed" heights="200">
 +
파일:velostat.png|압력감지소자 velostat
 +
</gallery>
 +
 
 +
* '''특성''': 전기 전도성을 띄는 소재로 압력 혹은 비틀림에 의해 전기 저항이 낮아지는 성질을 보유
 +
* '''구조''': 구리선을 상부와 하부에 교차로 배치하여 압력에 의해 구리선 사이의 전류가 흐르는 양을 감지하고, 이를 통해 압력점을 추정
 +
* '''장점''':
 +
  * ✅ 저비용
 +
  * ✅ 넓은 면적 커버 가능
 +
  * ✅ 압력 세기 구분 가능
 +
* '''단점''':
 +
  * ❌ 정밀도가 전용 터치스크린 대비 낮음
 +
 
 +
'''2. 저항막 방식 터치스크린 패널'''
 +
<gallery mode="packed" heights="200">
 +
파일:touch_screen.jpg|압력식 터치 패널
 +
</gallery>
 +
 
 +
* '''특성''': ITO 처리된 필름 및 글라스의 2중 레이어로 구성되어 화면을 누르면 레이어가 서로 맞닿으며 발생한 전류와 저항의 변화를 감지
 +
* '''장점''':
 +
  * ✅ 높은 정밀도
 +
  * ✅ 상용화된 기술
 +
* '''단점''':
 +
  * ❌ 높은 비용
 +
  * ❌ 크기 제한
 +
  * ❌ 압력 세기 구분 어려움
 +
 
 +
'''3. 카메라 모듈 (IMX-219 → IMX-708로 업그레이드)'''
 +
<gallery mode="packed" heights="200">
 +
파일:Imx_219.png|IMX-219 카메라 모듈
 +
파일:imx_708.jpg|IMX-708 카메라 모듈
 +
</gallery>
 +
 
 +
* '''특성''': 3296 x 2480의 해상도를 지원하는 CMOS 카메라 센서 → 4608 x 2592의 해상도를 지원하는 광각 카메라
 +
* '''용도''': 프로젝터의 구조 특성상 객체인식 등에 활용하기 위해 가능한 넓은 화면을 수용할 수 있는 모델 사용
 +
* '''장점''': 고해상도로 확대 시 이미지 손실 최소화
 +
* '''단점''': 고정 초점으로 프로젝터 높이에 따라 초점 변동 → 자동 초점을 가진 Imx708 사용
 +
'''4. 카메라 모듈 (OV5647)'''
 +
<gallery mode="packed" heights="200">
 +
파일:ov5647.jpg|OV5647 카메라 모듈
 +
</gallery>
 +
 
 +
* '''특성''': 2592 x 1944의 해상도를 지원하는 CMOS 카메라 센서
 +
* '''장점''': IMX-219 모델에 비해 저렴한 가격
 +
* '''단점''': 카메라의 해상도가 낮아 성능 제한
 +
</div>
 +
</div>
 +
 
 +
<div class="mw-collapsible" style="border:1px solid #ddd; margin:10px 0;">
 +
<h4 style="background-color:#4caf50; color:white; padding:10px; margin:0;">제어장치</h4>
 +
<div class="mw-collapsible-content" style="padding:20px;">
 +
 
 +
'''1. Arduino uno''' ✅ '''선정'''
 +
<gallery mode="packed" heights="200">
 +
파일:arduino_uno.png|Arduino Uno
 +
</gallery>
 +
 
 +
* '''역할''': 터치모듈의 연산, Shift register와 Multiplexer 제어를 위한 MCU(Micro Controller Unit)
 +
* '''장점''': 터치 장치에 별개로 연결되어 배선 길이를 줄여 모듈성 향상, 연산 소모를 분할하여 라즈베리파이 리소스 부담 절약
 +
* '''적용성''': 높음
 +
 
 +
'''2. Arduino pro mini'''
 +
<gallery mode="packed" heights="200">
 +
파일:mini_pro.jpg|Arduino Mini Pro
 +
</gallery>
 +
 
 +
* '''특성''': 아두이노 우노와 유사한 MCU 장치로, 크기가 더 작다는 장점
 +
* '''장점''': 소형화에 유리, 아두이노 우노와 동일한 성능
 +
* '''단점''': USB 연결, 핀 체결이 우노에 비해 어려워 작동 테스트 단계에서 사용이 번거로움
 +
 
 +
'''3. Raspberry Pi 4B'''
 +
<gallery mode="packed" heights="200">
 +
파일:4b.jpg|Raspberry Pi 4B
 +
</gallery>
 +
 
 +
* '''특성''': HDMI와 USB 연결을 기본적으로 지원하며, 1.8GHz Arm CPU, 4GB의 SDRAM 메모리 보유
 +
* '''장점''': 이더넷 연결과 블루투스 모델을 자체지원하여 추후 기능 확장에 유용
 +
* '''적용성''': 중간
 +
 
 +
'''4. Raspberry Pi 5''' ✅ '''선정'''
 +
<gallery mode="packed" heights="200">
 +
파일:rpi_5.png|Raspberry Pi 5
 +
</gallery>
 +
 
 +
* '''특성''': 라즈베리파이 4B에서 향상된 2.4GHz Arm CPU, SDRAM 8GB의 메모리로 쾌적한 소프트웨어 실행환경 제공
 +
* '''장점''': 고성능으로 복잡한 게임 로직 처리 가능
 +
* '''단점''': 4B 모델에 비해 높은 비용
 +
* '''적용성''': 높음
 +
</div>
 +
</div>
 +
 
 +
<div class="mw-collapsible" style="border:1px solid #ddd; margin:10px 0;">
 +
<h4 style="background-color:#ff9800; color:white; padding:10px; margin:0;">통신모듈</h4>
 +
<div class="mw-collapsible-content" style="padding:20px;">
 +
 
 +
<gallery mode="packed" heights="120">
 +
파일:usb.png|USB 유선 (선정)
 +
파일:bluetooth.jpg|블루투스 무선
 +
파일:hdmi.png|HDMI 유선 (선정)
 +
</gallery>
 +
 
 +
'''1. USB 유선''' ✅ '''선정'''
 +
* '''특성''': 아두이노와 라즈베리파이 사이의 시리얼 통신용 연결단자
 +
* '''장점''': 확장성이 높고 범용성이 높아 다양한 시스템에 터치 모듈 사용 가능, 전원을 컴퓨터로부터 받을 수 있어 아두이노에 충분한 전력 공급
 +
* '''적용성''': 높음
 +
 
 +
'''2. 블루투스 무선'''
 +
* '''특성''': 아두이노와 라즈베리파이 사이의 시리얼 통신용 블루투스 모듈
 +
* '''장점''': 라즈베리파이의 내장 블루투스 모듈 활용 가능, 유선에 비해 통신선의 제약이 없고 미관상 유리
 +
* '''단점''': 통신 딜레이 및 배터리의 필요성 요구
 +
* '''적용성''': 중간
 +
 
 +
'''3. HDMI 유선''' ✅ '''선정'''
 +
* '''특성''': 라즈베리파이와 프로젝터를 연결해주는 단자로 범용적인 영상 데이터 전송 규격
 +
* '''장점''': 고화질 영상 지원, 범용적 사용으로 손쉬운 교체 가능
 +
* '''적용성''': 높음
 +
</div>
 +
</div>
 +
 
 +
 
 +
<div class="mw-collapsible" style="border:1px solid #ddd; margin:10px 0;">
 +
<h4 style="background-color:#9c27b0; color:white; padding:10px; margin:0;">출력장치</h4>
 +
<div class="mw-collapsible-content" style="padding:20px;">
 +
 
 +
<gallery mode="packed" heights="200">
 +
파일:projector.png|ViewSonic PJD86533WS (선정)
 +
파일:Hy450.png|MAGCUBIC HY450
 +
</gallery>
 +
 
 +
'''1. ViewSonic PJD86533WS''' ✅ '''선정'''
 +
* '''특성''': 1280*800의 해상도를 지원하며 1m에서 100인치의 투사거리를 갖는 3000ANSI 루멘 밝기의 프로젝터
 +
* '''장점''': 초단초점 지원으로 Tabletop Projector 프로젝트 목적에 부합, 밝은 밝기로 낮에도 충분히 사용 가능, 조금만 거리를 벌려도 투사 영상 크기가 넓어져 다양한 책상에 적용 가능
 +
* '''적용성''': 높음
 +
 
 +
'''2. MAGCUBIC HY450'''
 +
* '''특성''': 1920*1080의 해상도를 지원하며 1.2m에서 100인치의 투사거리를 갖는 900ANSI 루멘 밝기의 프로젝터
 +
* '''장점''': ViewSonic 제품보다 높은 화질, 작은 사이즈로 소형화 가능
 +
* '''단점''': 낮은 밝기 성능으로 주변 조명에 민감
 +
* '''적용성''': 높음
 +
 
 +
'''최종 선택: ViewSonic PJD86533WS'''
 +
* '''특성''': 적절한 초단초점 거리(30cm), 높은 밝기 성능
 +
* '''선정 이유''': 개발 단계에서 발생가능한 변수에 대응하기 위해 밝기, 거리 및 소프트웨어 기능의 성능이 탁월한 모델 선정
 +
</div>
 +
</div>
 +
 
 +
===커버 설계===
 +
<gallery mode="packed" heights="300">
 +
파일:프로젝터_cad.png|CAD 외장 모델링
 +
파일:하드웨어_커버.png|구현된 외장재
 +
</gallery>
 +
 
 +
<div style="background-color:#fff3e0; padding:15px; margin:10px 0; border-radius:5px;">
 +
* '''재질''': 5mm 두께 무광 아크릴 (검정색)
 +
* '''크기''': 프로젝터 크기에 맞춘 맞춤 제작
 +
* '''특징''':
 +
  * 미니 리프트 1개를 사용한 높이 조절 기능 (커버 후면 손잡이)
 +
  * 측면 방열구멍 설계
 +
  * 카메라 모듈 장착부
 +
  * 프로젝터 하부면적보다 큰 견고한 아크릴판을 리프트 상단에 부착하여 안정성 확보
 +
</div>
 +
 
 +
===터치패드 설계===
 +
'''터치 패드 구조'''
 +
<div style="background-color:#e8f5e9; padding:15px; margin:10px 0; border-radius:5px;">
 +
* '''크기''': 1200mm × 900mm
 +
* '''층 구조''': 마감천(인조가죽) - PVC 필름 - Velostat - 구리 테이프 - Velostat - PVC 필름 - 마감천(논슬립 고무 패드)
 +
* '''구리선 배치''': 5mm 폭, 20mm 간격
 +
* '''상단 마감 소재''': 인조가죽 (적절한 반사 특성과 부드러운 사용자 경험 제공)
 +
* '''하단 마감 소재''': 논슬립 고무 패드(미끄러지지 않고 신축성과 내습성이 좋음)
 +
</div>
 +
 
 +
====터치 모듈 제작 및 구현====
 +
'''실제 터치 모듈의 제작 과정과 동작 원리'''
 +
 
 +
=====터치 모듈 하드웨어 구성=====
 +
<gallery mode="packed" heights="300">
 +
파일:터치개념도.png|구리선 배치 작업 (5mm 폭, 20mm 간격)
 +
파일:터치패드_내부.jpeg|구리선 배치 작업 (5mm 폭, 20mm 간격)
 +
파일:전체회로도.png|완성된 PCB 기판
 +
파일:cad_회로.png|PCB 케이스
 +
</gallery>
 +
 
 +
<div style="background-color:#f0f8ff; padding:15px; margin:10px 0; border-radius:5px;">
 +
'''터치 모듈 사양'''
 +
* 전체 크기: 1200mm × 900mm (40×30 매트릭스)
 +
* Velostat 시트: 12개 (3×4 배열)
 +
* 터치 포인트: 1,200개 (40행 × 30열)
 +
* 구리선 폭: 7mm (사용자 손가락 크기 고려)
 +
* 구리선 간격: 23mm (3W 규칙 적용으로 크로스토크 방지)
 +
* 응답 시간: 50ms 이하
 +
* 압력 감지 범위: 30kPa ~ 50kPa
 +
</div>
 +
 
 +
=====아두이노 제어 코드=====
 +
'''터치 센서 어레이 제어를 위한 최적화된 아두이노 코드'''
 +
 
 +
<syntaxhighlight lang="cpp">
 +
// Velostat 센서 어레이 제어용 Arduino 코드 (40×30)
 +
// 5×8-bit Shift Register → 40개 행(Row) 제어
 +
// 4×8-ch MUX(CD4051) → 32개 열 중 앞 30개 열(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};
 +
</syntaxhighlight>
 +
 
 +
'''코드 동작 원리'''
 +
# '''행 선택 (Shift Register)'''
 +
  * 5개의 8비트 Shift Register를 직렬 연결하여 40개 행 제어
 +
  * 한 번에 하나의 행만 활성화 (Zero Potential Method)
 +
  * LSBFIRST 방식으로 데이터 전송
 +
 
 +
# '''열 읽기 (Multiplexer)'''
 +
  * 4개의 8채널 MUX를 사용하여 32개 열 중 30개 읽기
 +
  * 3개의 선택 핀으로 8개 채널 선택
 +
  * 각 MUX의 출력은 개별 아날로그 핀으로 연결
 +
 
 +
# '''ADC 최적화'''
 +
  <syntaxhighlight lang="cpp">
 +
  // ADC Prescaler 변경 (기본값 128 -> 16)
 +
  ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
 +
  ADCSRA |= (1 << ADPS2);
 +
  </syntaxhighlight>
 +
  * ADC 속도를 8배 향상시켜 빠른 스캔 속도 확보
 +
  * 10비트 ADC 값을 8비트로 변환하여 전송 (>> 2)
 +
 
 +
=====라즈베리파이 캘리브레이션 시스템=====
 +
'''PyQt5 기반 GUI 캘리브레이션 및 마우스 제어 시스템'''
 +
 
 +
<div style="background-color:#e8f5e9; padding:15px; margin:10px 0; border-radius:5px;">
 +
'''캘리브레이션 프로세스'''<br>
 +
1. **자동 시작 방지**: 10초 대기 기간 동안 터치 감지 시 리셋<br>
 +
2. **4점 캘리브레이션**: 화면 모서리 4점을 터치하여 좌표 매핑<br>
 +
3. **5초 타임아웃**: 각 포인트마다 5초 내 터치 완료<br>
 +
4. **변환 행렬 계산**: numpy polyfit을 사용한 1차 변환<br>
 +
5. **마우스 제어**: pyautogui를 사용한 실시간 마우스 이동<br>
 +
</div>
 +
 
 +
'''주요 클래스 구조'''
 +
<syntaxhighlight lang="python">
 +
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
 +
</syntaxhighlight>
 +
 
 +
=====터치 감지 알고리즘=====
 +
'''행-열 최대값 교차점 필터링 알고리즘'''
 +
 
 +
<syntaxhighlight lang="python">
 +
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
 +
</syntaxhighlight>
 +
 
 +
=====시스템 통합 및 성능=====
 +
<div style="background-color:#fff3e0; padding:15px; margin:10px 0; border-radius:5px;">
 +
'''성능 특성'''
 +
* **스캔 속도**: 초당 20프레임 (50ms/frame)
 +
* **터치 응답 시간**: 평균 50ms 이하
 +
* **정확도**: ±15mm (캘리브레이션 후)
 +
* **압력 감지**: 30kPa 이상에서 안정적 감지
 +
* **크로스토크 억제**: Zero Potential Method + 3W 규칙
 +
* **전력 소비**: 5V 1A (터치 모듈 + 아두이노)
 +
</div>
 +
 
 +
===소프트웨어 설계===
 +
====1차 게임 - 4인 체스====
 +
<gallery mode="packed" heights="400">
 +
파일:체스.png|체스 플레이 화면
 +
</gallery>
 +
 
 +
'''터치 패드를 활용하기 위한 목적의 1차 게임 요소'''
 +
* '''기반''': 오픈소스 체스 게임을 라즈베리파이 OS에 포팅
 +
* '''UI 개선''':
 +
  * 기보나, 수 돌리기 등 불필요한 UI 삭제
 +
  * 배경화면을 밝게 설정하여 빔프로젝터 저밝기 환경 대응
 +
  * 체스판 크기 확대로 터치 부정확성 보완
 +
* '''특징''': 4명이 동시에 즐길 수 있는 변형 체스
 +
 
 +
====2차 게임 - Texas Hold'em Poker====
 +
<gallery mode="packed" heights="400">
 +
파일:포커.png|텍사스 홀덤 포커 플레이샷
 +
</gallery>
 +
 
 +
'''카메라와 객체 인식 모델을 활용하기 위한 목적의 2차 게임 요소'''
 +
 
 +
'''게임 UI 설계 필요조건'''
 +
<div style="background-color:#f5f5f5; padding:15px; margin:10px 0; border-radius:5px;">
 +
1. ✅ 모든 UI 상호작용은 터치로만 구현<br/>
 +
2. ✅ 프로젝터 위치에 따른 카메라 비추는 반경 변화 고려하여 인식 기물을 화면 중앙 배치<br/>
 +
3. ✅ 다중 플레이어를 위한 각 플레이어별 개인 보드 배치<br/>
 +
4. ✅ 라즈베리파이 부하 고려하여 캡처 방식으로 카메라 인식 구현<br/>
 +
5. ✅ 초보자 돌발행동 방지를 위한 변수 요소 사전 비활성화<br/>
 +
6. ✅ 게임 진행을 위한 사회자 역할 메시지 창 구현
 +
</div>
 +
 
 +
'''Texas Hold'em Poker (프로토타입)''' ✅
 +
<div style="background-color:#e8f5e9; padding:15px; margin:10px 0; border-radius:5px;">
 +
<h5 style="color:#2e7d32;">개발 목적</h5>
 +
* 라즈베리파이 카메라 성능과 객체 인식 성능 검증
 +
* 카드 인식: YOLO 모델 활용 (테스트 이미지 90% 이상 인식률)
 +
 
 +
<h5 style="color:#2e7d32;">게임 로직</h5>
 +
* 플레이어 인원 선택 (2-5명)
 +
* SB, BB 자동 배팅
 +
* 콜, 체크, 폴드, 레이즈, 올인 배팅 옵션
 +
* 프리플랍-플랍-턴-리버 단계별 진행
 +
* 자동 승자 판별 및 배팅액 분배
 +
* 파산 방지를 위한 3000칩 자동 지급
 +
 
 +
<h5 style="color:#2e7d32;">UI 특징</h5>
 +
* 각 플레이어별 개인 보드 (테이블 외각 배치)
 +
* 중앙 커뮤니티 카드 배치 (카메라 인식 범위 고려)
 +
* 배팅액에 따른 애니메이션 효과
 +
* 쇼다운 상황 특수 효과
 +
 
 +
<h5 style="color:#2e7d32;">변수 처리</h5>
 +
* 비순차 배팅 방지
 +
* 턴 종료 전 카드 공개 방지
 +
* 배팅액에 따른 선택지 제한
 +
</div>
 +
 
 +
'''카드 인식 프로세스'''
 +
<div style="background-color:#fff3e0; padding:15px; margin:10px 0; border-radius:5px;">
 +
<h5 style="color:#e65100;">📸 카메라 설정</h5>
 +
* '''해상도''': 4608×2592 (ScalerCrop: (0, 0, 4608, 2592)) 
 +
* '''노출 모드 (AeExposureMode)''': 1 
 +
* '''노출 보정값 (ExposureValue)''': -2.5 
 +
 
 +
<h5 style="color:#e65100;">🔍 이미지 처리 파이프라인</h5>
 +
<ol>
 +
<li><strong>이미지 전처리</strong>
 +
  * 카메라 캡처 → 'image' 변수 저장
 +
  * 이진화 처리 (프로젝터 밝은 환경 고려한 임계값 설정)
 +
  * 카드 최소 영역, 가로세로 비율 제한 (실제 카드 63mm×88mm 기준)</li>
 +
<li><strong>카드 검출</strong>
 +
  * detect_card_edges() 함수로 카드 윤곽 검출
 +
  * 4개 끝점 좌표 확보
 +
  * 여백 포함한 crop으로 문양/숫자 손상 방지</li>
 +
<li><strong>이미지 보정</strong>
 +
  * 샤프닝 커널 적용으로 확대 시 화질 저하 보완
 +
  * 인식 모델 최적화를 위한 이미지 품질 향상</li>
 +
<li><strong>모델 인식</strong>
 +
  * YOLO 모델 적용
 +
  * 인식률 30% 이상 결과 중 최고 신뢰도 선택
 +
  * 좌표 정보 활용한 카드 순서 정렬 (Y좌표 오차 허용)</li>
 +
<li><strong>게임 로직 반영</strong>
 +
  * 인식 결과를 게임 상태에 반영
 +
  * 승자 판별 로직 실행</li>
 +
</ol>
 +
</div>
 +
 
 +
====3차 게임 - TRPG====
 +
<gallery mode="packed" heights="300">
 +
파일:3차게임.png|3차게임 개발 플레이샷
 +
</gallery>
 +
'''터치, 카메라 기반 객체인식, AI API를 활용하는 최종 목적 구현을 위한 3차 게임 요소'''
 +
* '''맵 생성''': Polytopia Map Generator 오픈소스 활용 (GNU GPL 라이선스)
 +
* '''캐릭터 시스템''':
 +
  * D&D 기반 12개 직업 선택
 +
  * 스펠 사용 가능 직업: Bard, Cleric, Druid, Paladin, Sorcerer, Warlock, Wizard
 +
  * 직업별 차별화된 스펠 목록
 +
* '''맵 구현''': QWebEngineView를 사용하여 HTML 기반 맵을 PyQt5 UI에 통합
 +
* '''스토리 진행''': GPT API를 활용한 동적 시나리오 생성 (예정)
 +
 
 +
==프로젝트 결과==
 +
===포스터===
 +
[[파일:임베디드 포스터2.pdf|1000px|테이블탑 프로젝터 포스터|왼쪽|테이블탑 프로젝터 포스터]]
 +
===최종 평가===
 +
{| class="wikitable" style="text-align:center;"
 +
|-
 +
! style="background-color:#2196f3; color:white;" | 평가 항목
 +
! style="background-color:#2196f3; color:white;" | 목표치
 +
! style="background-color:#2196f3; color:white;" | 현재 상태
 +
! style="background-color:#2196f3; color:white;" | 달성 여부
 +
|-
 +
| 터치 정확도
 +
| < 20mm
 +
| 최대 14mm
 +
| style="background-color:#4caf50; color:white;" | '''충족'''
 +
|-
 +
| 터치 응답시간
 +
| < 100ms
 +
| 25회 평균 53.3ms (최대 66.7ms)
 +
| style="background-color:#4caf50; color:white;" | '''충족'''
 +
|-
 +
| 지원 게임 가짓수
 +
| 2+ 개
 +
| 2개 구현 + 2개 개발중
 +
| style="background-color:#4caf50; color:white;" | '''충족'''
 +
|}
 +
터치 응답시간 계산을 위해 https://whythetrick.io/fbf-player/ tool 사용
 +
 
 +
===최종 시연 영상===
 +
[[파일:캘리브레이션.mp4|500px|캘리브레이션 과정|왼쪽|캘리브레이션 과정]]
 +
[[파일:체스_1.mp4|500px|체스 플레이 과정|왼쪽|체스 플레이 과정]]
 +
[[파일:포커_1.mp4|500px|포커 플레이 과정|왼쪽|포커 플레이 과정]]
 +
[[파일:포커2.mp4|500px|승자 판독 과정|왼쪽|포커 승자 판독 과정]]
 +
 
 +
==프로젝트 리뷰==
 +
===팀 구성 및 역할 분담===
 +
<div style="overflow-x:auto;">
 +
{| class="wikitable" style="text-align:center; width:100%;"
 +
|-
 +
! style="background-color:#2196f3; color:white; width:15%;" | 팀원명
 +
! style="background-color:#2196f3; color:white; width:20%;" | 주요 역할
 +
! style="background-color:#2196f3; color:white; width:65%;" | 세부 담당 업무
 +
|-
 +
| style="background-color:#e3f2fd;" | '''구*본''' (팀장)
 +
| 프로젝트 관리, 터치 시스템
 +
|
 +
* 전체 일정 관리 및 진행사항 모니터링
 +
* 터치 하드웨어 설계 및 구현
 +
* 팀원 간 업무 조율 및 의사결정
 +
|-
 +
| style="background-color:#e8f5e9;" | '''김*호'''
 +
| 터치 시스템, 통합
 +
|
 +
* 가변저항 소재를 활용한 터치패드 설계/제작
 +
* 터치 시스템 PCB 설계 및 터치 모듈 커버 제작
 +
* 아두이노-라즈베리파이 통신 구현
 +
* Input 시스템 통합 및 디버깅
 +
* 3차 게임요소 <Civilized Kingdom> 개발
 +
|-
 +
| style="background-color:#fff3e0;" | '''류*현'''
 +
| 터치 시스템
 +
|
 +
* 터치 시스템 회로 설계 및 프로토타입 구현
 +
* 터치 프로그램 및 캘리브레이션 프로그램 구현
 +
* 1차 게임 요소 <4인 체스> 개발
 +
* 3차 게임요소 <Civilized Kingdom> 개발
 +
|-
 +
| style="background-color:#ffebee;" | '''조*민'''
 +
| 기구 설계, 통합
 +
|
 +
* 하드웨어 외장 디자인 설계 (아크릴 커버) 및 구현
 +
* 3D 모델링 및 기구부 제작
 +
* 하드웨어 통합 및 조립
 +
* 문서 및 발표자료 디자인
 +
|-
 +
| style="background-color:#f3e5f5;" | '''전*형'''
 +
| 파이카메라 기반 객체인식
 +
|
 +
* YOLO 기반 카드 인식 시스템 구현
 +
* OpenCV 이미지 처리 파이프라인 개발
 +
* 2차 게임요소 <텍사스 홀덤> 및 <포켓몬 TCG> 개발
 +
|}
 +
</div>
 +
 
 +
===향후 확장 가능성===
 +
* 추가 게임 장르 지원
 +
* 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>
 +
 
 +
<div style="text-align:center; margin:40px 0;">
 +
<div style="display:inline-block; background-color:#2196f3; color:white; padding:20px 40px; border-radius:10px; font-size:24px; font-weight:bold;">
 +
Imbedded - 테이블탑 프로젝터
 +
</div>
 +
<div style="margin-top:20px; font-style:italic; color:#666;">
 +
"디지털과 아날로그가 만나는 새로운 게임 플랫폼"
 +
</div>
 +
</div>
 +
 
 +
 
 +
[[Category:임베디드시스템]]
 +
[[Category:2025년프로젝트]]
 +
[[Category:게임플랫폼]]

2025년 6월 22일 (일) 15:22 판

테이블탑 프로젝터
Tabletop Projector
Team Imbedded
하드웨어 커버.png
프로젝트 완성품
학교 서울시립대학교
학과 기계정보공학과
학번 및 성명 20194300** 구*본(팀장)
20204300** 김*호
20214300** 류*현
20194300** 조*민
20194300** 전*형
지도교수 김*현 교수님
개발기간 2025.03 ~ 2025.06

프로젝트 개요

프로젝트 소개

프로젝트 명

테이블탑 프로젝터 (Tabletop Projector)

프로젝트 요약

'테이블탑 프로젝터'는 프로젝터를 이용하여 테이블 위에 게임 화면을 투사하고, 터치 센서를 통해 사용자와 상호작용할 수 있는 인터랙티브 게임 플랫폼입니다. 다양한 보드게임과 카드게임을 디지털화하여 여러 사용자가 함께 즐길 수 있는 새로운 형태의 게임 환경을 제공합니다.

프로젝트 개발 컨셉

본 프로젝트는 테이블 위에 보드게임 화면을 투사하고, 사용자의 터치 입력으로 직접 상호작용할 수 있는 플랫폼을 구현하는 것입니다. 이를 통해 여러 사람이 각자 휴대기기에 국한되지 않고 하나의 공용 공간에서 함께 게임을 즐길 수 있으며, 전통 보드게임의 정적인 특성을 넘어 화면 위의 영상과 동적으로 교감하며 플레이할 수 있어 온라인 게임이 가지는 '대면 상호작용의 부재' 문제를 해소합니다.

프로젝트 배경 및 기대효과

배경

  • 기존 보드게임의 한계: 종이 카드, 고정된 규칙, 제한된 게임 도구로 인한 정적인 플레이 방식
  • 온라인 게임의 한계: 개인용 기기 중심으로 인한 대면 상호작용 부족, 사회적 단절 현상
  • 기술적 공백: 프로젝터 활용 프로젝트는 있으나 터치 기능과 카메라 기반 객체 인식을 결합한 사례 부족
  • 시장 요구: COVID-19 이후 소규모 모임 증가, 홈 엔터테인먼트 수요 증가

기대효과

  • 보드게임 혁신: 기존 카드와 기물 중심에서 벗어나 복잡하고 다양한 규칙 적용 가능
  • 접근성 향상: 플레이어가 복잡한 룰을 모두 숙지하지 않아도 시스템 보조로 원활한 게임 진행
  • 사회적 가치: 온라인 게임의 사회적 단절 문제 보완, 공동 참여형 콘텐츠 발전
  • 콘텐츠 확장성: 소프트웨어 업데이트를 통한 지속적인 새로운 룰 추가, 기존 IP 재활용
  • 상업적 가능성: 보드게임 개발사에게 새로운 개발 방향성 제시

프로젝트 목표

  • 확장 가능성: 리눅스 플랫폼 특성상 개발 환경이 잘 갖추어져 있어 향후 추가 보드게임 개발 가능
  • 직관적 조작: 빠른 터치 속도 및 영상인식을 통한 자연스러운 사용자 상호작용
  • 사회적 연결: 대면 보드게임의 장점과 디지털 게임의 편의성 결합

동작 시나리오

  1. 시스템 시작: 프로젝터 전원 ON, 라즈베리파이 부팅, 터치 캘리브레이션 자동 실행 대기
  2. 터치 캘리브레이션: 부팅 후 캘리브레이션 화면에서 제시하는 위치를 클릭해 터치점 보정
  3. 게임 런쳐 실행: 터치 캘리브레이션 완료 후 게임 런쳐 자동 실행 대기
  4. 게임 선택: 터치를 통해 게임 런쳐에서 원하는 게임 선택
  5. 게임 진행
    • 1차 게임(체스): 터치로 기물 이동
    • 2차 게임(카드게임): 실물 카드를 테이블에 배치, 카메라가 인식하여 게임 진행
    • 3차 게임(TRPG): GPT API를 활용한 스토리 진행
  6. 게임 종료: 게임 런쳐로 복귀

구현 내용

장치 선정

입력장치

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열)
  • 구리선 폭: 7mm (사용자 손가락 크기 고려)
  • 구리선 간격: 23mm (3W 규칙 적용으로 크로스토크 방지)
  • 응답 시간: 50ms 이하
  • 압력 감지 범위: 30kPa ~ 50kPa
아두이노 제어 코드

터치 센서 어레이 제어를 위한 최적화된 아두이노 코드

// Velostat 센서 어레이 제어용 Arduino 코드 (40×30)
// 5×8-bit Shift Register → 40개 행(Row) 제어
// 4×8-ch MUX(CD4051) → 32개 열 중 앞 30개 열(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};

코드 동작 원리

  1. 행 선택 (Shift Register)
  * 5개의 8비트 Shift Register를 직렬 연결하여 40개 행 제어
  * 한 번에 하나의 행만 활성화 (Zero Potential Method)
  * LSBFIRST 방식으로 데이터 전송
  1. 열 읽기 (Multiplexer)
  * 4개의 8채널 MUX를 사용하여 32개 열 중 30개 읽기
  * 3개의 선택 핀으로 8개 채널 선택
  * 각 MUX의 출력은 개별 아날로그 핀으로 연결
  1. ADC 최적화
   // ADC Prescaler 변경 (기본값 128 -> 16)
   ADCSRA &= ~((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0));
   ADCSRA |= (1 << ADPS2);
  * ADC 속도를 8배 향상시켜 빠른 스캔 속도 확보
  * 10비트 ADC 값을 8비트로 변환하여 전송 (>> 2)
라즈베리파이 캘리브레이션 시스템

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
시스템 통합 및 성능

성능 특성

  • **스캔 속도**: 초당 20프레임 (50ms/frame)
  • **터치 응답 시간**: 평균 50ms 이하
  • **정확도**: ±15mm (캘리브레이션 후)
  • **압력 감지**: 30kPa 이상에서 안정적 감지
  • **크로스토크 억제**: Zero Potential Method + 3W 규칙
  • **전력 소비**: 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
🔍 이미지 처리 파이프라인
  1. 이미지 전처리 * 카메라 캡처 → 'image' 변수 저장 * 이진화 처리 (프로젝터 밝은 환경 고려한 임계값 설정) * 카드 최소 영역, 가로세로 비율 제한 (실제 카드 63mm×88mm 기준)
  2. 카드 검출 * detect_card_edges() 함수로 카드 윤곽 검출 * 4개 끝점 좌표 확보 * 여백 포함한 crop으로 문양/숫자 손상 방지
  3. 이미지 보정 * 샤프닝 커널 적용으로 확대 시 화질 저하 보완 * 인식 모델 최적화를 위한 이미지 품질 향상
  4. 모델 인식 * YOLO 모델 적용 * 인식률 30% 이상 결과 중 최고 신뢰도 선택 * 좌표 정보 활용한 카드 순서 정렬 (Y좌표 오차 허용)
  5. 게임 로직 반영 * 인식 결과를 게임 상태에 반영 * 승자 판별 로직 실행

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 충족
터치 응답시간 < 100ms 25회 평균 53.3ms (최대 66.7ms) 충족
지원 게임 가짓수 2+ 개 2개 구현 + 2개 개발중 충족

터치 응답시간 계산을 위해 https://whythetrick.io/fbf-player/ tool 사용

최종 시연 영상

파일:캘리브레이션.mp4 파일:체스 1.mp4 파일:포커 1.mp4 파일:포커2.mp4

프로젝트 리뷰

팀 구성 및 역할 분담

팀원명 주요 역할 세부 담당 업무
구*본 (팀장) 프로젝트 관리, 터치 시스템
  • 전체 일정 관리 및 진행사항 모니터링
  • 터치 하드웨어 설계 및 구현
  • 팀원 간 업무 조율 및 의사결정
김*호 터치 시스템, 통합
  • 가변저항 소재를 활용한 터치패드 설계/제작
  • 터치 시스템 PCB 설계 및 터치 모듈 커버 제작
  • 아두이노-라즈베리파이 통신 구현
  • Input 시스템 통합 및 디버깅
  • 3차 게임요소 <Civilized Kingdom> 개발
류*현 터치 시스템
  • 터치 시스템 회로 설계 및 프로토타입 구현
  • 터치 프로그램 및 캘리브레이션 프로그램 구현
  • 1차 게임 요소 <4인 체스> 개발
  • 3차 게임요소 <Civilized Kingdom> 개발
조*민 기구 설계, 통합
  • 하드웨어 외장 디자인 설계 (아크릴 커버) 및 구현
  • 3D 모델링 및 기구부 제작
  • 하드웨어 통합 및 조립
  • 문서 및 발표자료 디자인
전*형 파이카메라 기반 객체인식
  • YOLO 기반 카드 인식 시스템 구현
  • OpenCV 이미지 처리 파이프라인 개발
  • 2차 게임요소 <텍사스 홀덤> 및 <포켓몬 TCG> 개발

향후 확장 가능성

  • 추가 게임 장르 지원
  • 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 - 테이블탑 프로젝터

"디지털과 아날로그가 만나는 새로운 게임 플랫폼"