부저로 음악 연주하기
전자제품을 동작시키면 신호음이 나오는 경우가 있다. 예를 들어 전자레인지의 버튼을 누르면 버튼이 눌려질 때마다 '삐'소리가 난다. 사용자는 자신이 버튼을 정상적으로 잘 눌렀다는 것을 '삐'소리를 통하여 확인할 수 있다. 아두이노는 부저를 이용하여 소리를 낼 수 있다. 우리가 자주 사용하는 부저는 작고 동그란 모양이며 구조가 간단하다. 아두이노에서 자주 사용하는 부저에는 능동 부저와 수동부저가 있다.
능동 부저는 내장된 회로가 있어 외부에서 전원을 연결하면 소리가 난다. 능동 부저는 HIGH/LOW만 제어할 수 있기 때문에 미리 설정되어 있는 '삐' 소리만 낼 수 있다. 수동 부저는 내장된 회로가 없어서 떨림판으로 소리를 낸다.
회로 만들기

스케치 3-2 주파수 이용해서 부저 소리내기
void setup(){
tone(3,523,500);
delay(100);
}
void loop(){
}
스케치 3-2 설명
tone(3,523,500);
- tone(핀번호, 주파수, 지속시간);
- 핀 번호는 아두이노에 연결하는 핀 번호이다.
- 주파수(frequency)는 소리의 주파수이며 단위는 헤르츠이다. 주파수로 '도','레','미'같은 음을 표현할 수 있다. 유형은 unsigned int를 사용한다.
- 지속시간은 밀리초(ms) 단위로 소리의 지속시간이다. 데이터는 unsigned long을 사용한다.
- tone(핀 번호, 주파수)로 사용할 수도 있다. 이때 음의 길이는 delay()로 지정할 수 있다. tone()은 한 번에 하나 tone()만 실행된다. 다른 tone()이 연주되고 있으면 새로운 tone()을 불러도 실행되지 않는다.
void loop(){}
- 소리를 계속 내지 않고 한 번만 내므로 반복문 구간에는 코드를 넣지 않는다. 반복문 구간에 코드가 없더라도 void loop()함수는 적어야 한다. 이 함수가 에러가 발생한다.
스케치 3-3 toneDoReMi 스케치
void setup(){
tone(3,523,1000); delay(1000);
tone(3,587,1000); delay(1000);
tone(3,659,1000); delay(1000);
tone(3,698,1000); delay(1000);
}
void loop(){
}
스케치 3-3 설명
tone(3,523,1000);
- tone(핀번호, 주파수, 지속시간);
- 주파수로 음을 표현할 수 있다. 523은 'C5'음이고 일반적으로 '도'음이다.
delay(1000);
- delay(지속시간);은 다음 코드가 진행되기 전까지 코드를 지속시간만큼 지연시킨다. 이 예제에서는 소리가 나는 1초 동안 다음 코드를 지연시키는 것이다. 이 지속시간이 tone()함수의 지속시간 보다 짧으면 소리가 제대로 나지 않는 경우가 있다. 그리고 이 스케치에서 delay() 지속시간이 1000보다 길면 음과 음 사이에 소리가 잠시 끊기는 현상이 발생한다.
스케치 3-4 봄나들이 연주하기 스케치
int myNote[]={784,659,784,659,784,880,784};
int myDu[]={250,250,250,250,250,250,500};
void setup(){
for (int i =0; i<7; i++){
tone(3,myNote[i], myDu[i]);
delay(myDu[i]*1.3);
noTone(3);
}
}
void loop(){
}
스케치 3-4 설명
int myNote[]={784,659,784,659,784,880,784};
- 소리 음계를 데이터로 가진 배열을 정의한다.
- 음의 데이터는 정수형으로 지정하였다.
- 배열은 인덱스로 접근되는 변수들의 모임이므로 배열의 첫 번째 데이터의 인덱스는 '0'이 된다. 즉 myNote[0]=784이고 myNote[5]=880 이다.
- 배열의 데이터를 읽기 위해서 for 루프를 사용하여 차례로 읽는 경우가 많다.
int myDu[]={250,250,250,250,250,250,500};
- 음의 길이를 데이터로 가진 배열을 정의한다.
- 음을 만들 때 4분음표의 길이는 500으로 지정하고 8분음표의 길이는 250으로 지정하였다. 숫자는 변경할 수 있다.
tone(3,myNote[i], myDu[i]);
- tone(핀번호, 주파수, 음길이);
- 소리를 내려고 하는 음의 주파수를 입력하고 음의 길이를 '음길이'에 입력한다.
delay(myDu[i]*1.3);
- delay(지연시간*1.3);
- 음의 지연시간은 tone()에서의 음의 길이만큼 delay()에서 지연 시간을 동일하게 입력해 주는데 이 스케치에서는 지연시간을 1.3만큼 곱해 주었다. 그 이유는 이 스케치로 소리를 내면 연결 부분에 조금 간격을 주어 음이 또렷하게 들리기 때문이다. 1.3을 곱하는 것은 생략해도 된다.
for (int i =0; i<7; i++){}
- for문은 중괄호로 싸인 블록을 반복하여 실행하고 배열의 요소를 인덱스로 읽는다.