안녕하세요.
오늘 아두이노와 피에조 부저(Piezo Buzzer)를 이용해서 음악을 연주해보려고 합니다.

그림 1 : 부저 윗 부분
[그림 1 : 부저 윗 부분]

그림 2 : 부저 아랫 부분
[그림 2 : 부저 아랫 부분]

그림 1과 2에서 보시는 것처럼 부저에는 2개의 핀이 있습니다.
오늘도 간단한 작업이 될 것 같은 느낌이네요!

1. 회로 연결

회로 연결은 너무나 간단합니다. 따라서 회로도를 생략하고 연결된 그림만 보시겠습니다.

그림 3 : 부저 연결 회로
[그림 3 : 부저 연결 회로]

그림 3에서 보시는 바와 같이 부저의 (+)표시된 핀은 아두이노의 디지털 8번 핀에 연결하고, 나머지 한 핀은 아두이노의 GND(그라운드)에 연결합니다.
혹시 반대로 연결하게 되면 소리가 나지 않으니 주의하시길 바랍니다.

2. 스케치

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

void setup() {
}

void loop() {
  tone(BUZZER_PIN, C);
  delay(500);

  tone(BUZZER_PIN, D);
  delay(500);

  tone(BUZZER_PIN, E);
  delay(500);

  tone(BUZZER_PIN, F);
  delay(500);

  tone(BUZZER_PIN, G);
  delay(500);

  tone(BUZZER_PIN, A);
  delay(500);

  tone(BUZZER_PIN, B);
  delay(500);

  noTone(BUZZER_PIN);
}
  • 1 줄 : 부저를 8번 핀으로 정의합니다.
  • 3~9 줄 : 도부터 시까지의 음을 정의합니다. 각 음에 사용된 숫자는 해당 톤의 헤르츠(Hz) 값을 의미합니다.
  • 15 줄 : tone() 함수를 이용해서 부저 핀에 도 소리를 출력합니다. 이 함수는 두개의 인자를 받는데, 첫번째 인자가 핀 번호이고, 두번째 인자가 주파수입니다.
  • 16 줄 : delay() 함수를 이용해서 500ms 쉽니다. 즉, 도 소리를 500ms 만큼 출력하게 됩니다.
  • 18~34 줄 : 15~16줄과 같은 원리로 ‘레’부터 ‘시’까지 출력합니다.
  • 36 줄 : noTone() 함수를 이용해서 부저 핀의 소리를 끕니다.


3. 응용

기본적인 사용방법을 알아봤으니, 이제 응용을 해볼 차례입니다.
‘학교 종이 땡땡땡’을 연주하는 코드를 작성해보죠.

const int BUZZER_PIN = 8;

const int C = 261;    //도
const int D = 294;    //레
const int E = 330;    //미
const int F = 349;    //파
const int G = 392;    //솔
const int A = 440;    //라
const int B = 494;    //시

typedef struct  {  
  int tone;
  unsigned long delay;
} TAD; //Tone And Delay

TAD music[] = 
  {
    {G, 100}, {G, 100}, {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200},
    {G, 100}, {G, 100}, {E, 100}, {E, 100}, {D, 200}, {G, 100}, {G, 100},
    {A, 100}, {A, 100}, {G, 100}, {G, 100}, {E, 200}, {G, 100}, {E, 100},
    {D, 100}, {E, 100}, {C, 200}
  };

int musicLen;

void setup() {
  musicLen = sizeof(music) / sizeof(TAD);
}

void loop() {
  for(int i = 0; i < musicLen; i++) {
    tone(BUZZER_PIN, music[i].tone);
    delay(music[i].delay * 5);

    noTone(BUZZER_PIN);
    delay(30);
  }

  noTone(BUZZER_PIN);
  delay(1000);
}
  • 1~9 줄 : 위의 스케치와 동일합니다.
  • 11~14 줄 : TAD라는 이름의 구조체를 정의합니다. 이 구조체에는 음을 나타내는 tone 변수와 음의 지속 시간을 나타내는 delay 변수가 있습니다.
  • 16~22 줄 : TAD 구조체를 배열로 사용해서 음악을 구성합니다.
  • 24 줄 : 음악 배열의 길이를 담을 변수입니다.
  • 26~28 줄 : 음악 베열의 길이를 구합니다.
    • sizeof(music)을 하면 music 배열에 할당된 바이트 크기를 반환합니다.
    • sizeof(TAD)를 하면 TAD 구조체 하나가 가지는 바이트 크기를 반환합니다.
    • 따라서, sizeof(music) / sizeof(TAD) = (music 배열 전체의 바이트) / (TAD 구조체의 바이트) 가 되고, 이는 music 배열에서 TAD 구조체가 몇개 있는지를 구하게 됩니다.
  • 31~37 줄 : music배열을 하나씩 차례대로 읽어서 톤을 출력합니다.
    • 32~33 줄 : music[i]에 해당하는 음을 해당 딜레이 만큼 출력합니다.
    • 35~36 줄 : 각 음을 출력하고 잠깐 동안 아무 소리를 내지 않게 함으로써 연주하는 듯한 느낌을 줍니다.
  • 39~40 줄 : 음악을 다 연주한 후 1초 동안 아무런 소리를 내지 않도록 합니다.

이렇게 ‘학교 종이 땡땡땡’을 연주하는 스케치를 만들어봤습니다.
여기에서 얼마든지 응용해서 다른 음악을 연주하게도 할 수 있을 것 같습니다.

+ Recent posts