PLATiNA‑LED

제주대학교 컴퓨터공학전공 — 임베디드 소프트웨어
김무훈

리듬게임 PLATiNA :: LAB의 4키 입력을 BPM 싱크에 맞추어
실시간 시각 피드백을 주는 임베디드 프로젝트입니다.

  1. 본래 "빛과 움직임으로 제어되는 디지털 악기"
    • 외부 조명 간섭으로 인해 입력이 불안정해짐
    • 빛에 대한 안정적인 입력은 암실에서만 가능함
    • 이 문제로 인해 주제 수정을 고민하게 됨
  2. 입력의 안정성과 함께 실시간성을 보장할 수 있는 주제 조건을 찾아 수정했습니다.
    • 입력의 안정성: 0과 1의 이산적인 디지털 입력
    • 실시간성: 피드백이 빨라야 함
    • 리듬게임의 입력 = 움직임으로 표현하자!

주제 수정

🎮 데모 영상

여러 곡 시연 영상: https://youtu.be/8-O16FoaT68

🎮 입력

PC 리듬게임(플라티나 랩)에서 발생하는 키 입력을 Python 프로그램이 인식하여 시리얼 통신을 통해 Arduino로 즉시 전송합니다.

지원 키

  • A → D 레인
  • S → F 레인
  • ; → K 레인
  • ' → L 레인
  • Enter → "Dual Rainbow" 효과 트리거
  • ESC → 클라이언트 종료

LED 하드웨어

  • 이름: NS-LED-02 (레인보우 스틱)
  • LED 개수: 8개
  • 특징: LED 컨트롤러 내장, 단일 핀 입력
  • 라이브러리: NS_Rainbow

레인 구조 (4키)

각 레인은 2개의 LED로 구성됩니다.

레인 입력 LED 인덱스
0 D 0, 1
1 F 2, 3
2 K 4, 5
3 L 6, 7

LED 스틱 제어

BPM 기반 애니메이팅

Arduino는 BPM 입력을 받아 아래 값을 자동 재계산합니다:

항목 계산식
beatMs 60000 / BPM
flashDurationMs beatMs / 3
breathingPeriodBaseMs beatMs * 2
dualRainbowDurationMs beatMs * 2

이를 통해 음악 BPM에 맞춘 LED 연출을 의도 했습니다.

LED 효과 시스템

단타 효과 — Hit Flash

  • 해당 레인의 Hue로 밝게 점등 → 빠르게 감쇠
  • 길이는 BPM 기반으로 자동 계산
    • flashDurationMs = beatMs / 3

키 반복 입력 또는 누름 유지 — Hue Gradient

  • 같은 키의 반복 횟수에 따라 밝기 펄스 속도 증가
  • 반복 입력의 시간 경과에 따라 Hue 기준 색상이 서서히 변함

Defining hue in terms of RGB - Hue - Wikipedia

Enter — Dual Rainbow

  • 8개의 LED, 양쪽에서 중심으로 모이는 이중 레인보우
  • 길이는 BPM에 따라 결정됩니다.
    • dualRainbowDurationMs = beatMs * 2

LED 효과 시스템

⚡ 하드웨어 배선도

   Arduino UNO                      NS-Rainbow Stick
┌─────────────────┐               ┌──────────────────┐
│                 │               │  [●●●●●●●●]  (8 LEDs)
│           5V ───────────────▶   │   VCC
│          GND ───────────────▶   │   GND
│           D9 ───────────────▶   │   DATA (Signal In)
│                 │               │
└─────────────────┘               └──────────────────┘
  • DATA 핀: D9 (PWM 가능 핀)
  • VCC: 5V
  • GND: 공통 접지

시리얼 프로토콜

PC → Arduino 통신은 라인 단위 명령으로 이루어집니다.

설정 명령

BPM <number>
OFFSET <ms>

예:

BPM 180
OFFSET 0

실행 예:

python3 main.py \
  --port /dev/cu.usbserial-2120 \
  --baud 115200 \
  --bpm 180 \
  --offset 0

전체 흐름도

유한 상태(Finite-state) 흐름의
안정된 LED 제어를 갖추었습니다.

LED Offset (ms)

리듬게임 특성상 LED 반응 타이밍을 미세 조정할 필요가 있으므로
IP → LED 사이 지연을 조절하기 위한 오프셋 기능이 있습니다.

OFFSET 30   → 30ms 늦게 점등
OFFSET 0    → 즉시 반응

FPS(frame-per-second) 동기화

실행 루프의 빈도를 게임 설정의 초당 프레임과 맞추어서

const int targetFPS = 60;
unsigned long frameDelayMs = 1000 / targetFPS;

LED 업데이트 주기를 일정하게 유지합니다.

요약

  • BPM 기반 LED 시각화 동작
  • 키 입력 → 시리얼 전송 → LED 출력 피드백
  • 반복 입력 또는 키 누름 유지 감지(Breathing)

정리

본 프로젝트의 모든 구성을 오픈소스로 기록해 두었습니다.

구동하기 위해 만든 제어 프로그램은 두 부분으로 구성했습니다:

  1. 4키 후킹 & 시리얼 송신 Python 클라이언트
  2. Arduino UNO로 시리얼 수신 및 NS‑LED‑02 모듈 제어