프로그래밍/Arduino

7장. 피에조 부저 사용하기

길냥이 2024. 9. 17. 16:12
728x90

※목표

피에조 부저를 이용하여 소리를 내고, 배열을 이용해 음계를 배열할 수 있습니다.

 

※준비물

아두이노 우노 R3 : 1개

USB 케이블 : 1개

피에조 부저 : 1개

 

이번에는 피에조 부저를 이용해서 소리를 내 보도록 합시다.

 

※다음과 같이 만들어주시면 됩니다. 

그리고 아두이노 보드에 다음과 같은 코드를 입력해주시면 됩니다.

void setup()
{
  int piezo = 9;
  pinMode(piezo, OUTPUT);
  tone(piezo, 523, 100);
  delay(500);
  tone(piezo, 659, 100);
  delay(500);
  tone(piezo, 784, 100);
  delay(500);
}

void loop() { }

 

코드 제작 및 업로드에 성공했다면 피에조 부저에서 소리가 나게 됩니다.

 

 

여기서 잠깐, 코드 해석 이전에 음계별 표준 주파수라는거에 대해서 잠시 알아봅시다.

 

음계별 표준 주파수는 다음과 같은데, 아두이노에서는 소수점을 제거한 부분을 입력하시면 됩니다. 

 

소리 발생의 원리에는 추당 저 숫자만큼의 펄스를 만들어서 출력을 하는데, 계산식이라던가 이런 것이 존재하지만 그런 것은 딱히 지금 필요하지 않기에.. 간단한 7옥타브 정도만 알고 계시면 저 자료를 보고 입력하실 수 있습니다.

 

이건 나중에 부품 강좌를 만들 때 피에조 부저 쪽으로 옮겨질 것 같네요, 아니면 tone 명령어 쪽이라던가..

 

그러면 코드를 해석해 봅시다!

void setup()
{
  int piezo = 9;
  pinMode(piezo, OUTPUT);
  tone(piezo, 523, 100);
  delay(500);
  tone(piezo, 659, 100);
  delay(500);
  tone(piezo, 783, 100);
  delay(500);
}

void loop() { }

 

// 간단하네요,  tone와 delay가 세 번 반복되었습니다. int는 이제 말 안 해도 다 아실 테고, tone 명령어만 새로 알아봅시다. 

 

tone(pin, frequency, duration) 인데, pin에는 piezo = 9 가, frequency에는 위 표에 나왔던 Hz가, duration에는 음을 출력할 길이가 들어갑니다. 

 

아쉽게도 tone 함수는 한번에 한 곳에서만 출력이 가능하며, 31Hz보다 낮은 주파수를 만드는 것은 불가능합니다. 사실 최저 주파수도 표 상에서는 31Hz보다 높아서 문제가 없지만, 더 큰 문제는 3, 11번 핀의 PWM 출력을 방해한다는 것이에요.

 

 

 

좋아요, 그럼 여기 배열을 한번 써봅시다. 

물론 배열을 여기 말고 이전 장에 있었던 LED 같은 곳에서도 사용해도 문제없습니다. 

 

배열 관련 정보는 6-1장에 가보면 배울 수 있습니다.

 

하드웨어는 그대로 유지하고, 코드를 이렇게 바꿔 주세요.

 

void setup()
{
int melody[] = {523, 587, 659, 698, 784, 880, 989};

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[5], 250);
  delay(400);
  tone(9, melody[5], 250);
  delay(400);

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[2], 500);
  delay(800);

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[2], 250);
  delay(400);
  tone(9, melody[2], 250);
  delay(400);

  tone(9, melody[1], 750);
  delay(1200);

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[5], 250);
  delay(400);
  tone(9, melody[5], 250);
  delay(400);

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[2], 500);
  delay(800);

  tone(9, melody[4], 250);
  delay(400);
  tone(9, melody[2], 250);
  delay(400);
  tone(9, melody[1], 250);
  delay(400);
  tone(9, melody[2], 250);
  delay(400);

  tone(9, melody[0], 750);
  delay(1200);
}

void loop()
{
}

 

이거 완전 생노가다인데?

뭐, 어쩔 수 없어요. 

 

작은악절(4마디) 2개로 이루어진 곡인 학교종이 땡땡땡 같은 1분도 안되는 곡도 구현하기 귀찮게 코드가 길어집니다. 

물론 나중에는 어떻게는 만들기는 하는데.. 결국 그것도 노가다이긴 합니다.

 

그러니 피에조 부저로 음악을 만드려는건 때려치우시죠!

728x90