아두이노로 RGB 매트릭스 오디오 비주얼라이저 만들기 – 단계별 가이드
부품 및 소모품
| 부품 |
수량 |
비고 |
| 아두이노 우노 (Arduino UNO) |
1 |
|
| Adafruit 네오픽셀 쉴드 (NeoPixel Shield for Arduino) |
1 |
40개 RGB 네오픽셀(WS2812) 내장 |
| 스파크펀 스펙트럼 쉴드 (SparkFun Spectrum Shield) |
1 |
MSGEQ7 7밴드 그래픽 이퀄라이저 필터 2개 탑재 |
| ProtoStax 아두이노용 인클로저 |
1 |
스택형 모듈러 인클로저 (우노/메가 호환) |
| SPST OFF-(ON) 블루 푸시버튼 스위치 |
1 |
|
| 3.5mm 아이솔레이티드 스테레오 잭 패널 마운트 |
2 |
|
| 90도 앵글 3.5mm 오디오 케이블 |
2 |
|
| 3.5mm 스테레오 오디오 패치 케이블 (수-수, 6피트) |
1 |
|
필요 도구
프로젝트 소개
이 글에서는 아두이노, RGB LED 매트릭스 쉴드, 오디오 스펙트럼 분석기 쉴드를 사용해 RGB LED 매트릭스 오디오 비주얼라이저를 만들고, 인클로저에 넣어 완성된 프로젝트로 음악 시스템 옆에 두고 멋진 라이트 쇼를 즐기는 방법을 설명합니다.
오디오 스펙트럼 분석
SparkFun의 Spectrum Shield를 사용합니다. 두 개의 MSGEQ7 칩이 스테레오 오디오 입력을 7개 주파수 대역(채널당)으로 분할하고, 아두이노의 ADC로 각 대역의 진폭을 읽습니다. 아두이노 샘플 스케치가 제공됩니다.
RGB LED 매트릭스
Adafruit의 NeoPixel Shield를 사용합니다. 40개의 RGB 네오픽셀(WS2812)이 체인 형태로 연결되어 있으며, 단일 와이어로 제어됩니다. Adafruit_NeoMatrix 라이브러리로 매트릭스 접근과 LED 제어가 간편합니다.
인클로저
ProtoStax는 스택형 모듈러 인클로저 시스템으로, 프로토타입 단계별로 보호와 개방성을 모두 제공합니다. 측면 벽과 상판을 나중에 추가할 수 있고, 여러 유닛을 나란히 또는 위아래로 쌓을 수 있어 확장성이 뛰어납니다. 투명 아크릴로 제작되어 라이트 쇼를 감상하기 좋고, 고무 발이 있어 표면을 보호합니다.
1단계: 아두이노를 인클로저 베이스 플레이트에 장착
아두이노 우노를 베이스 플레이트에 장착하고 피트와 하드웨어를 추가해 '플랫폼 구성'으로 준비합니다. 단계별 이미지와 애니메이션 GIF로 과정을 확인하세요.
2단계: SparkFun Spectrum Shield 준비
Spectrum Shield에는 헤더가 없습니다. 다행히 NeoPixel Shield에 스태킹 헤더와 일반 헤더가 모두 포함되어 있습니다. NeoPixel Shield를 맨 위에 올리고 싶으므로 일반 헤더를 사용해 플러시 마운트하고, 스태킹 헤더는 Spectrum Shield에 사용합니다.
하지만 스태킹 헤더를 꽂으면 아두이노 우노의 USB 및 전원 포트가 간섭되어 딱 맞지 않습니다. 이를 해결하기 위해 두 가지 수정을 했습니다:
- Spectrum Shield의 USB/전원 포트 쪽 끝 부분(프로토타이핑 영역)을 잘라냄
- 스태킹 헤더 다리 길이를 약간 다듬어 딱 맞게 조절
이제 완벽하게 장착됩니다.
3단계: Adafruit NeoPixel Shield를 Spectrum Shield의 스태킹 헤더에 장착
NeoPixel Shield를 Spectrum Shield 위에 올립니다. 동봉된 일반 헤더를 납땜하고, 터미널 커넥터도 납땜했습니다(이 예제에서는 모든 LED가 동시에 켜지지 않으므로 아두이노 전원으로도 충분합니다).
4단계: 데모 코드 분석
데모 코드는 두 부분으로 나뉩니다:
- 스펙트럼 분석 및 결과 저장
- 분석 결과를 8x5 네오픽셀 매트릭스의 표시/색상 구성으로 변환
전체 코드는 GitHub에서 확인 가능합니다.
스펙트럼 분석
STROBE와 RESET 핀에 디지털 시퀀스를 써서 MSGEQ7 칩을 초기화한 후, 7개 주파수 대역의 크기를 순차적으로 읽습니다. STROBE 핀을 펄스해 다음 대역 읽기를 시작합니다. 값은 Frequencies_One[7]과 Frequencies_Two[7]에 저장되며, 10비트 ADC로 읽으므로 0~1023 범위입니다.
7개 대역: 63Hz, 160Hz, 400Hz, 1kHz, 2.5kHz, 6.25kHz, 16kHz.
이를 BASS(63, 160Hz), MID_RANGE(400Hz, 1kHz, 2.5kHz), TREBLE(6.25kHz, 16kHz) 세 범주로 그룹화했습니다.
RGB 매트릭스
네오픽셀 쉴드의 좌표계와 LED 번호 체계를 이해하는 것이 중요합니다. [0,0]은 항상 좌상단입니다. 쉴드는 5x8(또는 8x5) 매트릭스이며, 물리적 LED #0은 우상단에 있습니다(귀여운 Adafruit 로고로 표시). 진행 방향은 행 방향(수평) 또는 열 방향(수직)일 수 있습니다.
이 예제에서는 7개 주파수 대역을 8개 차원(한 칸 비움)에, 진폭을 5개 차원에 매핑했습니다. 원점을 좌하단(최저 주파수, 최저 진폭)으로 두고 위로 올라가도록 설정했습니다. 이를 위해 네오매트릭스 초기화 시 WIDTH=5, HEIGHT=8, TOP-RIGHT, COLUMNS PROGRESSIVE 옵션을 사용했습니다.
각 행(주파수 대역)마다 좌/우 채널 중 큰 값을 취해 0~1023 범위를 5개 열로 매핑합니다(나눔 계수 204). matrix.drawPixel()로 픽셀을 그립니다.
HSV 색상 휠을 사용해 부드러운 색상 전환을 구현했습니다. matrix.ColorHSV()는 32비트 색상을 반환하지만 drawPixel()은 16비트 색상을 기대하므로, matrix.setPassThruColor()로 우회하여 32비트 색상을 적용합니다.
색상 구성
3가지 색상 구성 제공:
- MAGNITUDE_HUE: 녹색~빨강/핑크 범위 (낮은 진폭~높은 진폭)
- MAGNITUDE_HUE_2: 핑크/블루 시프트 범위
- HSV_COLOR_WHEEL: 전체 색상 휠을 순환하며 단일 색상 사용
주파수 범위별(BASS, MID, TREBLE) 기본 색조(hue)를 다르게 설정할 수 있도록 했습니다.
5단계: 테스트
작동 테스트 영상 참조 (원문 링크).
6단계: 인클로저 마무리
상판 브레이싱, 측면 벽, 오디오 케이블, 상판을 순서대로 조립합니다. 단계별 이미지와 애니메이션 GIF로 과정을 확인하세요.
7단계: 완성품 전시
이제 음악 시스템 옆에 두고 직접 만든 오디오 비주얼라이저로 멋진 라이트 쇼를 즐길 수 있습니다!
8단계: 더 나아가기
- 패널 마운트 스테레오 잭을 측면 벽에 추가해 배선을 내부로 정리
- 더 다양한 라이트 패턴과 색상 구성 추가
- 시리얼 입력으로 주파수 범위(BASS, MID, TREBLE, ALL) 선택 기능 추가
- 순간 푸시버튼 스위치로 색상 구성 전환, 인클로저에 구멍 뚫어 장착
- 두 번째 스위치로 표시 주파수 범위 전환 추가
- 아크릴 표면에 페인터 테이프 붙이고 드릴로 구멍 뚫기 (스테레오 잭 5/16", 스위치 0.47")
- 상판 표면을 가볍게 샌딩해 빛 확산 효과 내기
관심 있으시면 오디오 잭, 스위치, 불투명 확산판이 적용된 업데이트 버전을 제작해 공유하겠습니다. 댓글로 알려주세요!
코드
GitHub 저장소: ProtoStax Audio Visualizer Demo