본문으로 바로가기

피에조 부저(Piezo buzzer)



피에조 부저는 피에조를 이용하여 소리를 내는 작은 스피커이다. 피에조는 특정 방향으로 압력을 가하면 결정체(수정, 전기석 등)의 표면에서 전기가 발생하는 성질을 이용한 것으로 여기에 얇은 판을 붙여 미세한 떨림으로부터 소리가 나게 된다. 소리가 크지 않다는 단점이 있지만 세밀하게 조작하면 음악도 연주할 수 있다. 

피에조 부저는 극성(+, -)가 있다. 부저 윗면에 +라고 써져 있거나 조그만 홈이 파여있는 쪽에 +극을 연결하면 된다.


피에조 부저 옥타브별 음계의 주파수


소리는 공기의 떨림으로 표현하는데 각 음계마다 고유의 떨림 주파수를 가지고 있다. 예를 들어 1옥타브 도의 경우 32.7032라는 고유 진동수를 가지고 있어 피에조 부저를 1초에 대략 32번정도 진동시키면 1옥타브 도의 음을 낼 수 있다.

<이미지 출처 : google image> 

소스 코드를 작성할 때 위의 표를 참고하면 원하는 연주를 할 수있다.


실습 내용


피에조 부저를 이용하여, 도레미파솔라시도를 연주해 보자.


준비물


아두이노, 브레드보드, 점퍼선 2개, 피에조 부저 or 스피커


회로도





소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int piezo = 7;
 
void setup() {
  pinMode(piezo, OUTPUT);
  
  tone(piezo, 523); // 5옥타브 도
  delay(1000);
  tone(piezo, 587); // 레
  delay(1000);
  tone(piezo, 659); // 미
  delay(1000);
  tone(piezo, 698); // 파 
  delay(1000);
  tone(piezo, 784); // 솔
  delay(1000);
  tone(piezo, 880); // 라
  delay(1000);
  tone(piezo, 988); // 시
  delay(1000);
  tone(piezo, 1046); // 6옥타브 도
  delay(1000);
  noTone(piezo);
}
 
void loop() {
  
}
cs

응용(배열 이용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int piezo = 7;
int tones[] = { 5235876596987848809881046 };
//각 음계 배열에 담는다
 
void setup() {
  pinMode(piezo, OUTPUT);
  for(int i=0; i < 8; i++)  //for문을 이용하여 i값을 증가시켜
  {                         //도레미파솔라시도를 출력한다.
    tone(piezo, tones[i]);   
    delay(1000);
  }
  noTone(piezo);
}
 
void loop() {
  
}
cs


결과 영상




댓글을 달아 주세요

  1. 스프콘 2017.02.16 15:07 신고

    선생님! 질문있습니닷! for 문에서 i++를 --로 변경해주면 높은 도음까지 갔다가 도로 내려오는 거 아닌가요? 도레미파솔라시도~ 도시라솔파미레도~로 내려오려면 for문을 어떻게 변경해주면 되나요?

    • BlogIcon 코딩런 2017.02.16 15:25 신고

      EX4_2_PIEZO의 코드를 말씀하시는거죠?

      저 예제 코드에서는 i++을 i--로 바꾸면 정상적인 코드가 아닙니다. 0부터 시작해서 8보다 작을때까지를 따지므로 i++을 사용하셔야 하고,
      i--를 사용할 경우 0에서 -1씩 감소, 감소 하게 되면 무한루프를 돕니다.

      질문하신건 for문을 바꾸는게 아니고 밑에 하나를 더 추가해 주세요.
      for(int i=0; i < 8; i++)
      {
      tone(piezo, tones[i]);
      delay(1000);
      }

      //이 부분에 작성하세요.

      for(int j=7; j >= 0; j--) //다시 선언을 했으므로 i던 j던 상관없음.
      {
      tone(piezo, tones[j]);
      delay(1000);
      }
      로 구현이 가능합니다.

    • 스프콘 2017.02.16 15:41 신고

      빠른 답변 감사합니다!! ㅠㅠ이제 이해했어요!! 실행도 잘 됩니다..하..진짜 코딩런 아니었으면 아두이노 어케 시작했을지 생각만해도 앞이 캄캄하네요. 정말 감사합니다ㅠㅠ ㅠㅠㅠㅠㅠㅠㅠ

  2. 사람 2017.08.20 15:17 신고

    exit status 1
    expected ',' or ';' before 'pinMode'
    세미콜론 붙였는데도 이러네요.

    • 지나가던행인 2017.12.31 18:03 신고

      핀 모드를 잘못했다는 뜻 아닐까요 대부분의 컴파일러가 에러의 위치를 잘 알려주지 못한다 하는데

티스토리 툴바