제주대학교 컴퓨터공학전공 — 임베디드 소프트웨어
김무훈
리듬게임 PLATiNA :: LAB의 4키 입력을 BPM 싱크에 맞추어
실시간 시각 피드백을 주는 임베디드 프로젝트입니다.
여러 곡 시연 영상: https://youtu.be/8-O16FoaT68
PC 리듬게임(플라티나 랩)에서 발생하는 키 입력을 Python 프로그램이 인식하여 시리얼 통신을 통해 Arduino로 즉시 전송합니다.
NS_Rainbow
각 레인은 2개의 LED로 구성됩니다.
| 레인 | 입력 | LED 인덱스 |
|---|---|---|
| 0 | D | 0, 1 |
| 1 | F | 2, 3 |
| 2 | K | 4, 5 |
| 3 | L | 6, 7 |
Arduino는 BPM 입력을 받아 아래 값을 자동 재계산합니다:
| 항목 | 계산식 |
|---|---|
beatMs |
60000 / BPM |
flashDurationMs |
beatMs / 3 |
breathingPeriodBaseMs |
beatMs * 2 |
dualRainbowDurationMs |
beatMs * 2 |
이를 통해 음악 BPM에 맞춘 LED 연출을 의도 했습니다.
flashDurationMs = beatMs / 3Defining hue in terms of RGB - Hue - Wikipedia
dualRainbowDurationMs = beatMs * 2 Arduino UNO NS-Rainbow Stick
┌─────────────────┐ ┌──────────────────┐
│ │ │ [●●●●●●●●] (8 LEDs)
│ 5V ───────────────▶ │ VCC
│ GND ───────────────▶ │ GND
│ D9 ───────────────▶ │ DATA (Signal In)
│ │ │
└─────────────────┘ └──────────────────┘
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 반응 타이밍을 미세 조정할 필요가 있으므로
IP → LED 사이 지연을 조절하기 위한 오프셋 기능이 있습니다.
OFFSET 30 → 30ms 늦게 점등
OFFSET 0 → 즉시 반응
실행 루프의 빈도를 게임 설정의 초당 프레임과 맞추어서
const int targetFPS = 60;
unsigned long frameDelayMs = 1000 / targetFPS;
LED 업데이트 주기를 일정하게 유지합니다.
본 프로젝트의 모든 구성을 오픈소스로 기록해 두었습니다.
구동하기 위해 만든 제어 프로그램은 두 부분으로 구성했습니다: