초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

피에조 부저-소리내기

2015-01-16 13:24:21

피에조 부저란?


 

피에조 부저 (piezo buzzer)는 피에조 효과를 이용하여 소리를 내는 작은 스피커입니다.

피에조 효과란 수정이나 세라믹 같은 결정체의 성질을 이용하는 것으로 압력을 주게되면 변형이 일어나면서 표면에 전압이 발생하고, 반대로 전압을 걸어주면 응축,신장을 하는 현상을 말하며 압전효과라고도 합니다.

여기에 얇은 판을 붙여주면 미세한 떨림으로 인해 소리가 나게 됩니다.

피에조 부저는 코드 상에서 소리의 음량을 제어할 수 없고 자칫 잘못하면 소음을 일으킬 수 있지만, 값이 싸고 사용이 단순하기 때문에 장난감이나 휴대용 게임기, 버스부저 등에서 사용됩니다.



 

 

 

 

피에조 부저 사용방법


 

피에조 부저는 2개의 전극단자로 구성되어 있으며, 각 단자는 극성을 가지고 있습니다.

커버 윗면을 확인하면, (+)라고 써져 있거나, 옆에 조그만 홈이 파져있는 의 단자에 +전극을 연결하면 됩니다.

 

피에조 부저는 능동부저 수동부저가 있으며 가장 쉽게 구분하는 법은 피에조부저에 전원을 공급했을 때 소리가 난다면 능동부저이고, 소리가 나지 않는다면 수동부저입니다.

그리고 다리 길이로도 구분할 수 있는데 서로의 다리길이가 다르면 능동부저이고 다리길이가 서로 같다면 수동부저입니다.

 

능동부저는 단일음으로 단순하게 경보음을 출력할 때 적합하고, 수동부저는 음계를 사용하여 멜로디를 출력하는데 적합합니다.

 

피에조부저는 주파수를 활용하여 음계를 출력합니다.

아래의 사진은 옥타브 및 음계별 표준 주파수를 나타내는 표입니다.

피에조 부저에 주파수에 맞는 신호를 줌으로써 원하는 음계의 소리를 낼 수 있습니다.

우리에게 익숙한 음계는 4옥타브에 해당됩니다. 즉, ‘도’라는 음은 4옥타브의 C 261.6256Hz의 주파수를 가지는 소리입니다.
 

 

 

 

 

 

부품 목록

NO 부품명 수량 상세설명
 1 오렌지 보드  
피에조 부저  KPX 1203S 
스위치   
브레드 보드   
점퍼 케이블   

 

 

부품명 오렌지 보드 피에조 부저 스위치 브레드 보드 점퍼 케이블
파트

 

 

 

 

 

하드웨어 making


 

브레드 보드

1. 오렌지보드의 GND을 브레드보드의 -버스에 연결합니다.

2. 피에조 부저를 그림과 같이 +단자가 위로 향하게하여 세로로 꽂습니다.

3. 스위치를 그림과 같이 양쪽 IC영역에 걸치게 꽂습니다.

4. 피에조 부저의 +단자가 연결된 행을 오렌지보드 3번핀에 연결합니다.

5. 피에조 부저의 -단자를 -버스에 연결합니다.

6. 스위치의 왼쪽 하단 단자를 오렌지보드 5번핀에 연결합니다.

7. 스위치의 오른쪽 상단 단자를 -버스에 연결합니다.


 

 

 

 

소프트웨어 coding


 

  1. /*
  2.  제목    : 피에조 부저 (Piezo Buzzer) 소리내기
  3.  내용   : 스위치를 누를 때마다, '도레미파솔라시' 음계를 소리내도록 만들어 봅니다.
  4.  */
  5.  
  6. // 피에조 부저를 3번 핀, 버튼을 5번 핀에 연결합니다.
  7. int piezo = 3;
  8. int sw = 5;
  9.  
  10. // 음계의 배열을 만들고 배열에 들어가는 인자의 갯수를 8개로 지정합니다.
  11. // 음계는 4옥타브를 기준으로 도, 레, 미, 파, 솔, 라, 시, 도를 출력합니다.
  12. int numTones = 8;
  13. int tones[] = {261, 294, 330, 349, 392, 440, 494, 523};
  14.  
  15. // 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
  16. // 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
  17. void setup() {
  18.   // 피에조 부저가 연결된 핀을 OUTPUT으로 설정합니다.
  19.   pinMode(piezo, OUTPUT);
  20.   // 스위치가 연결된 핀의 모드를 INPUT_PULLUP 상태(초기 로직레벨을 HIGH로 설정)로 설정합니다.
  21.   pinMode(sw, INPUT_PULLUP);
  22. }
  23.  
  24. // setup() 함수가 호출된 이후, loop() 함수가 호출되며,
  25. // 블록 안의 코드를 무한히 반복 실행됩니다.
  26. void loop() {
  27.   // 스위치가 연결된 핀의 로직레벨이 LOW라면(버튼이 눌렸다면)
  28.   if (digitalRead(sw) == LOW) {
  29.     for (int i = 0; i < numTones; i++) {
  30.       //numTones(8)의 수만큼 반복 실행합니다.
  31.       // tone함수를 통해 피에조부저에서 소리가 나며 tones[]배열에 있는 주파수에 해당하는 음계가 출력됩니다.
  32.       tone(piezo, tones[i]);
  33.       // 0.5초 동안 대기합니다.
  34.       delay(500);
  35.     }
  36.     // 피에조 부저가 연결된 핀으로부터 square-ware를 생성을 중단하도록 설정합니다.
  37.     noTone(piezo);
  38.   }
  39. }

 

 

 

 

배열

 

배열은 비슷한 자료들의 집합or묶음으로써 하나의 변수이름안에 지정한 수 만큼의 데이터를 삽입할 수 있습니다.

배열은 보통 변수선언와 비슷하지만 이름 뒤에 대괄호[]를 붙임으로써 선언이 가능합니다.

대괄호 안에는 배열의 크기를 지정할 수 있으며, 위 코드의 경우 배열안에 들어가는 인자들을 직접 선언함으로써 배열의 크기가 8임을 명시하고 있습니다.

 

배열의 타입이 int형일 경우 자료로는 int형의 자료만 받을 수 있으며, char일 경우 문자만 받을 수 있습니다.

만약 배열의 길이가 10인데 11개의 자료를 넣게되면 에러를 발생시킵니다.

 

 

 

  1. //길이가 10인 arr배열 생성
  2. int arr[10];
  3.  
  4. //길이가 5이고 1,2,3,4,5를 자료로 가지는 배열 생성
  5. int arr1[] = {1,2,3,4,5};

※ 배열의 시작은 0부터 시작!!합니다. 위에서 arr1의 경우 arr1[0] = 0 이고 arr1[4] = 5입니다. (arr[5]를 출력하면 에러를 발생시킵니다.)

 

 

 

 

 

for문(반복문)

 

for문은 여러 반복문 중 대표적인 구문으로써 반복할 횟수를 지정함으로써 반복이 가능합니다.

 

for문은 (초기값; 조건문; 증감식)의 구조를 가지며, 

 

예를들어 for(int i = 0; i < 5; i++)라는 구문을 가지면 변수 i가 0부터 5보다 작을 동안(0, 1, 2, 3, 4) 총 5번 반복하게 됩니다.

for문의 조건이 다른 구문에 비해 복잡하기 때문에 처음사용하게 되면 조건에 무엇이 들어가야 하는지 어렵지만 반드시 필수로 익혀야 할 구문입니다.

 

  1. //시리얼 통신으로 0부터 4까지 출력하기
  2.   for(int i = 0; i < 5; i++) {
  3.     Serial.println(i);
  4.   }

 

 

 

 

피에조 부저를 활용한 프로젝트


 

멜로디 출력

 

위에서 학습한 것과 같이 피에조 부저를 이용해서 다양한 멜로디를 직접 만들어 보고 또 출력해볼 수 있습니다. 

아래 프로젝트는 피에조 부저를 이용해 슈퍼마리오의 테마송을 연주한 프로젝트입니다. 

 

출처 : https://youtu.be/-kkxs_fekWM

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

피에조 부저, 아두이노, 오렌지보드

노짱 2015-04-03 00:51:07

신기하네요. ~ +0+ 피에조 부저로 떳다떳다 비행기 노래 나오게 만들수도 있겠네요.ㅎㅎ

노짱 2015-04-03 00:58:54

[♪ 비행기] 노래입니다. ㅋㅋㅋ 해보실 분 해보셔요.
int numTones = 8;
int tones[] = { ~
부분만 아래걸로 바꾸고 실행시키면 됩니다. ㅎㅎ

int numTones = 26;
int tones[] = {
330, 294, 261, 294, 330, 330, 330, 294, 294, 294,
330, 392, 392, 330, 294, 261, 294, 330, 330, 330,
294, 294, 330, 294, 261, 523};

ㅋㅋ 마지막 음은 포인트!!!

황정호 2017-10-15 21:43:48

int numTones = 38l;;
// 음계 표준 주파수(4옥타브) :
int tones[] = {293, 391, 493, 587, 587, 523, 493, 440, 493, 391, 493, 587, 783, 783, 783, 880, 693, 659, 698, 440, 554, 698, 880, 783, 698, 659, 698, 783, 698, 659, 587, 523, 493, 523, 587, 523, 391, 440};
이렇게 바꾸면 하울의 움작이는성 노래 나옵니다ㅎㅎ

황정호 2017-10-15 21:50:04

살짝 음 벗어나도 봐주세요~ㅎㅎ

Hank 2020-08-15 14:05:11

다시 여기 바닷가 - 싹쓰리 노래입니다! ^^//
int numTones = 140;
int tones[] = {415,415,391,391,
349,349,391,391,391,233,233,246,
246,246,0,246,415,415,391,391,
349,349,391,391,391,391,391,391,
0,0,0,0,391,415,466,466,
466,466,523,523,523,311,311,311,
311,466,466,466,466,311,349,391,
391,391,349,349,349,311,349,349,
349,349,349,349,415,415,391,391,
349,349,391,391,391,233,233,246,
246,246,0,246,415,415,391,391,
349,349,391,391,391,466,466,466,
466,466,466,466,391,415,466,466,
466,466,523,523,523,311,311,311,
311,466,466,466,0,622,622,622,
622,466,523,523,0,0,0,0,
698,698,783,698,698,698,622,698,
698,587,622,622,622,622,622,622};

지민준 2021-09-09 21:33:43

비행기 박을 한 번 고쳐봤습니다!
int numTones = 30;
int tones[] = {330, 294, 261, 294, 330, 330, 330, 0,294, 294, 294,0,330, 392, 392,0, 330, 294, 261, 294, 330, 330, 330,0,294, 294, 330, 294, 261, 523};
double b[]={1.5,0.5,1,1,1,1,1.5,0.5,1,1,1.5,0.5,1,1,1.5,0.5,1.5,0.5,1,1,1,1,1.5,0.5,1,1,1,1,1.5};
이렇게 바꾸고
for문을
for (int i = 0; i < numTones; i++) {
if(tones[i]!=0){
tone(piezo, tones[i]);
delay(b[i]*300);
noTone(piezo);
delay(b[i]*100);
}
else delay(b[i]*400);
}
이렇게 바꾸면 우리가 잘 아는 비행기군요