아두이노로 만드는 빛과 소리의 생일 축하 DIY 프로젝트
프로젝트 개요
아두이노 우노(Arduino UNO)와 몇 가지 기본 부품만으로 생일 축하 노래를 연주하며 LED가 반짝이는 즐거운 장치를 직접 만들어 보세요. 초보자도 쉽게 따라 할 수 있는 난이도로, 전자공학 입문용 프로젝트로 안성맞춤입니다.
필요한 부품 및 재료
- 아두이노 우노(Arduino UNO) × 1
- 브레드보드(Breadboard) × 1
- 점퍼 와이어(Jumper wires) × 1묶음
- 스피커(0.25W, 8Ω) × 1 ※ 납땜이 필요할 수 있으며, 0.5W 스피커도 사용 가능
- LED(빨강, 파랑, 흰색) × 각 1개씩 (원하는 색상으로 변경 가능)
- 220Ω 저항 × 3개 (LED 전류 제한용)
필요한 도구
소프트웨어
회로 구성 방법
1단계: 부품 준비 및 스피커 납땜
모든 부품을 준비합니다. 스피커에 리드선이 없으면 점퍼 와이어를 납땜해 연결합니다.
2단계: LED 브레드보드에 장착
빨강, 파랑, 흰색 LED 3개를 브레드보드에 서로 가깝게 꽂습니다. 긴 다리(애노드, +)와 짧은 다리(캐소드, -) 방향을 확인하세요.
3단계: LED 애노드(긴 다리) 아두이노 핀 연결
점퍼 와이어를 사용해 각 LED의 애노드를 다음 아두이노 디지털 핀에 연결합니다.
- 빨강 LED → 디지털 핀 9
- 파랑 LED → 디지털 핀 10
- 흰색 LED → 디지털 핀 11
4단계: LED 캐소드(짧은 다리) 접지 연결
각 LED의 캐소드에 220Ω 저항을 하나씩 연결한 뒤, 저항의 다른 쪽을 브레드보드의 그라운드(-) 레일에 연결합니다. 브레드보드 그라운드 레일을 아두이노 GND 핀에 연결하세요.
5단계: 스피커 연결
스피커의 음극(-) 선을 브레드보드 그라운드 레일에, 양극(+) 선을 아두이노 디지털 핀 3번에 연결합니다.
소스 코드
아래 두 파일을 아두이노 IDE에 복사해 업로드하세요. pitches.h는 음계 주파수 정의 헤더 파일로, 메인 코드와 같은 폴더에 저장해야 합니다.
메인 코드: Happy Birthday Lights + Sounds
// RED 9; BLUE 10; WHITE 11;
#include "pitches.h"
// 멜로디 음표 배열 (생일 축하 노래)
int melody[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4,
NOTE_D4, NOTE_AS4, NOTE_AS4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};
// 음표 길이: 4=4분음표, 8=8분음표 등
int noteDurations[] = {
8, 8, 4, 4, 4, 2,
8, 8, 4, 4, 4, 2,
8, 8, 4, 4, 4, 4,
4, 8, 8, 4, 4, 4, 2
};
void setup() {
pinMode(9, OUTPUT); // 빨강 LED
pinMode(10, OUTPUT); // 파랑 LED
pinMode(11, OUTPUT); // 흰색 LED
for (int thisNote = 0; thisNote < 25; thisNote++) {
// 9~11번 핀 중 랜덤하게 2개 켜고 1개 끔
int randomLight1 = random(9, 12);
int randomLight2 = random(9, 12);
int randomLight3 = random(9, 12);
digitalWrite(randomLight1, HIGH);
digitalWrite(randomLight2, HIGH);
digitalWrite(randomLight3, LOW);
// 음표 길이 계산 (ms)
int noteDuration = 1130 / noteDurations[thisNote];
tone(3, melody[thisNote], noteDuration); // 핀 3번 스피커로 재생
int pause = noteDuration * 1.275; // 음표 간 간격
delay(pause);
noTone(3);
}
delay(3000); // 곡 종료 후 3초 대기
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
void loop() {
// 반복 재생 불필요 (한 번만 연주)
}
pitches.h (음계 주파수 정의 헤더)
/*************************************************
* Public Constants - 표준 음계 주파수 (Hz)
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
회로도
프로젝트 페이지에서 happy_birthday_lights__sounds_I16bf0SBDq.fzz (Fritzing 파일)를 다운로드해 회로도를 확인할 수 있습니다.
작동 원리 및 팁
- 랜덤 LED 점멸: 각 음표마다 3개 LED 중 2개를 랜덤하게 켜서 시각적 재미를 더했습니다.
- tone() 함수: 아두이노 내장
tone(pin, frequency, duration) 함수로 스피커에서 음을 냅니다.
- 저항 값: 220Ω 저항은 5V 공급 시 LED에 약 10~15mA 전류가 흐르게 해 안전하게 보호합니다.
- 확장 아이디어: 버튼을 추가해 버튼 누를 때만 연주되게 하거나, 더 많은 LED와 시프트 레지스터(74HC595)를 써서 화려한 라이트 쇼를 만들 수 있습니다.
마치며
간단한 부품만으로도 생일 파티 분위기를 띄울 수 있는 멋진 장치를 만들 수 있습니다. 아두이노 입문자에게 회로 구성, tone() 함수 활용, 배열 다루기 등을 연습하기에 좋은 프로젝트입니다. 직접 만들어 소중한 사람에게 선물해 보세요!