아두이노로 음악 톤 만들기: 88키 피아노 음계 구현 가이드
부품 및 소모품
| 부품 | 수량 | 비고 |
| Arduino UNO | 1 | 메인 컨트롤러 |
| 스피커 0.25W, 8Ω | 1 | 소리 출력용 |
| 저항 150~220Ω (220Ω 권장) | 1 | 스피커 직렬 연결로 전류 제한 |
소프트웨어
프로젝트 소개
아두이노와 스피커, 저항만으로 피아노 88건반 전 음역대의 음을 생성하는 방법입니다. 일반적인 `tone()` 함수는 31Hz 미만 주파수를 낼 수 없지만, 피아노 최저음(A0)은 27.5Hz입니다. 이 프로젝트는 룩업 테이블 없이 수식으로 주파수 계산하고, `delayMicroseconds()`로 구형파를 직접 생성해 88키 전 음역을 커버합니다.
핵심 기술 포인트
- 수식 기반 주파수 계산: 1~88번 키 번호를 받아 `freq = 440 * 2^((n-49)/12)` 공식으로 주파수 산출
- 마이크로초 단위 제어: `delayMicroseconds()`로 반주기 지연 생성 → 구형파 출력
- 긴 지연 처리: `delayMicroseconds()`는 수천 마이크로초 이상 불안정하므로, 루프로 분할해 긴 주파수도 정확하게 생성
- 컴팩트한 코드: 주석 제외하면 한 화면에 들어갈 정도로 간결
회로 연결
스피커 한 쪽 → GND, 다른 쪽 → 220Ω 저항 → 디지털 핀 12
소스 코드
전체 코드(주석 포함)는 GitHub Gist에서 확인 가능합니다.
핵심 로직 요약
// 키 번호(1~88)로 주파수 계산
float freq = 440.0 * pow(2.0, (key - 49) / 12.0);
unsigned long halfPeriod = 1000000.0 / freq / 2; // 반주기(마이크로초)
// 구형파 생성 (긴 지연은 루프로 분할)
void playTone(int key, int durationMs) {
float freq = 440.0 * pow(2.0, (key - 49) / 12.0);
unsigned long halfPeriod = 1000000.0 / freq / 2;
unsigned long cycles = freq * durationMs / 1000;
for (unsigned long i = 0; i < cycles; i++) {
digitalWrite(12, HIGH);
delayMicroseconds(halfPeriod);
digitalWrite(12, LOW);
delayMicroseconds(halfPeriod);
}
}
회로도
스피커를 GND와 핀 12 사이에 저항을 거쳐 연결합니다. (프로젝트 페이지 'Schematics' 섹션 참조)
응용 아이디어
- 버튼 매트릭스로 미니 피아노 제작
- 멜로디 시퀀서로 확장
- 초음파 센서와 연동해 거리에 따른 음높이 변화 (테레민 스타일)