아두이노 나노로 만드는 빛과 소리 디스플레이: 미국 국가 연주
부품 및 소모품
| 아두이노 나노 R3 (ATmega328P 구형 부트로더 버전 권장) |
1개 |
| 부저 (16Ω 일반형) |
1개 |
| 푸시 버튼 6x6x6mm |
2개 |
| 로커 스위치 (전원용) |
1개 |
| 330Ω 저항 |
3개 |
| LED (빨강 2개, 흰색 2개, 파랑 2개) |
6개 |
| 납땜용 미니 브레드보드 |
1개 |
| 9V 배터리 (또는 USB/AA 배터리 팩) |
1개 |
필요한 도구
프로젝트 개요
크리스마스 조명·음악 프로젝트 연습 중 만든 부작입니다. 아두이노 나노로 두 곡(차지 사운드, 미국 국가)을 버튼으로 선택 재생하며, LED가 음표에 맞춰 점멸합니다. 버튼을 누르지 않을 때는 랜덤한 '반짝임' 효과로 대기합니다.
데모 영상 보기
설계 포인트
- 함수 중심으로 코드를 모듈화해 음표·박자·LED 매핑을 쉽게 수정 가능
- 스타카토(스타카토) 표현을 위해 음 길이와 쉼 비율(x=0.92, y=0.08) 조절
- 곡이 진행될수록 음정이 조금씩 올라가도록 구현 (매 연주마다 1.06^3 배 상승)
- 인터럽트 핀(D3)을 차지 버튼에 연결해 즉시 반응
회로 구성
브레드보드 테스트
브레드보드에서 회로와 코드를 검증한 후 납땜했습니다.
전원 회로
9V 배터리 케이스에 스위치를 내장했으나, 별도 로커 스위치를 추가로 장착했습니다.
최종 납땜
상단 커버만 먼저 납땜하고 나중에 측면 패널을 조립하는 방식을 추천합니다.
전체 코드 (USA_ANTHEM_Updated.ino)
/* Star Spangled Banner with LEDs
Created by Ryan Aebi, June 2018 */
// 핀 정의
const int ChargeButton = 3; // 인터럽트 핀
const int StartButton = 5;
const int BuzzerPin = 9;
const int RedLED = 6;
const int WhiteLED = 7;
const int BlueLED = 8;
// 타이밍 변수
int n = 1000;
int DurationOn = n;
int DurationRest = n;
float x = 0.66, y = 0.34; // 스타카토 비율 (x+y=1)
int Twinkle_Rate = 250; // 대기 중 반짝임 주기
// 버튼 상태
int StartButtonState, ChargeButtonState;
// 음계 주파수 (Hz)
int Note1 = 233; // Bb3
int Note2 = 294; // D4
int Note3 = 330; // E4
int Note4 = 349; // F4
int Note5 = 392; // G4
int Note6 = 440; // A4
int Note7 = 466; // Bb4
int Note8 = 523; // C5
int Note9 = 587; // D5
int Note10 = 622; // Eb5
int Note11 = 698; // F5
void Charge() { ... } // 차지 사운드 연주 함수
void SingleDWwithNote(...) { ... } // 단일 음표+LED 재생 함수
void USNationalAnthem() { ... } // 미국 국가 전체 연주 함수
void Twinkle(int time) { ... } // 대기 중 랜덤 LED 반짝임
void setup() {
pinMode(ChargeButton, INPUT_PULLUP);
pinMode(StartButton, INPUT_PULLUP);
pinMode(RedLED, OUTPUT);
pinMode(WhiteLED, OUTPUT);
pinMode(BlueLED, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
digitalWrite(RedLED, LOW);
digitalWrite(WhiteLED, LOW);
digitalWrite(BlueLED, LOW);
}
void loop() {
StartButtonState = digitalRead(StartButton);
ChargeButtonState = digitalRead(ChargeButton);
if (StartButtonState == LOW) {
USNationalAnthem();
} else if (ChargeButtonState == LOW) {
Charge();
} else {
Twinkle(Twinkle_Rate);
}
}
배선도 및 비용 내역
프리칭(Fritzing) 회로도, 브레드보드 배선 사진, 실물 배선 사진, 부품별 구매처·가격표가 포함되어 있습니다.