프로젝트 02: 피에조 부저 미니 피아노 🎹
5개의 버튼을 눌러 아름다운 멜로디를 연주하는 나만의 악기를 제작합니다.
1. 프로젝트 원리: 소리는 어떻게 나나요?
우리가 사용할 피에조 부저(Piezo Buzzer)는 전기를 주면 내부의 판이 미세하게 떨리면서 소리를 냅니다. 1초에 판이 몇 번 떨리느냐(주파수)에 따라 우리가 듣는 음계가 달라집니다.
- 도(Do): 1초에 262번 진동 (262Hz)
- 레(Re): 1초에 294번 진동 (294Hz)
- 미(Mi): 1초에 330번 진동 (330Hz)
💡 아두이노의 마법사: tone() 함수
아두이노에는 복잡한 진동 계산 없이 소리를 내주는 tone(핀번호, 주파수) 함수가 내장되어 있습니다. 이 함수를 사용하면 단 한 줄로 피아노 소리를 낼 수 있습니다!
2. 회로 구성 (Wiring)
5개의 버튼을 디지털 2번부터 6번 핀까지 차례대로 연결하고, 피에조 부저는 디지털 8번 핀에 연결합니다.
▲ 피아노 회로도: 버튼 5개와 피에조 부저 1개를 연결합니다.
📦 준비물
아두이노 우노 x 1
피에조 부저 x 1
푸시 버튼 x 5
점퍼 와이어 다수
3. 코드 작성하기: 멜로디 프로그래밍
버튼 5개에 각각 '도, 레, 미, 파, 솔'의 주파수를 매칭합니다. 버튼을 누르면 해당 소리가 나고, 떼면 소리가 멈추도록(noTone) 설계합니다.
// 1. 음계 주파수 정의 (도, 레, 미, 파, 솔)
int notes[] = {262, 294, 330, 349, 392};
int speakerPin = 8;
void setup() {
// 2. 2번~6번 핀을 버튼 입력으로 설정 (내부 풀업 사용)
for (int i = 2; i <= 6; i++) {
pinMode(i, INPUT_PULLUP);
}
}
void loop() {
bool isPlayed = false; // 현재 소리가 나는 중인지 체크
for (int i = 0; i < 5; i++) {
// 버튼은 눌리면 LOW(0) 상태가 됩니다.
if (digitalRead(i + 2) == LOW) {
tone(speakerPin, notes[i]); // 해당 음계 소리 내기
isPlayed = true;
}
}
// 아무 버튼도 눌리지 않았다면 소리 끄기
if (!isPlayed) {
noTone(speakerPin);
}
}
4. 코드 상세 설명
- notes[] 배열: C언어 7장에서 배운 배열을 사용해 주파수 값들을 묶어서 관리합니다. 덕분에
notes[0]은 도,notes[1]은 레... 식으로 쉽게 접근할 수 있습니다. - INPUT_PULLUP: 2장에서 배운 대로, 별도의 저항 부품 없이 버튼을 작동시키기 위해 아두이노 내부 저항을 켭니다.
- noTone(): 소리를 멈추는 함수입니다. 이 함수가 없으면 버튼을 떼어도 마지막 소리가 계속 울리게 됩니다.
5. 🎯 심화 챌린지: 나만의 작곡가 모드
단순한 피아노를 넘어, 아두이노가 스스로 노래를 부르게 해볼까요? '작은 별'이나 '비행기'의 멜로디 주파수를 배열에 담고, 특정 버튼을 누르면 노래가 자동으로 재생되도록 기능을 추가해 보세요!
힌트: tone(핀, 주파수, 지속시간)을 사용하면 소리의 길이를 조절할 수 있습니다.