본문 바로가기
정보글

아두이노 피에조 부저: 소리 발생과 제어 방법

by 푸포하니 2023. 5. 9.

1. 소리와 음파의 이해

 

 

 

소리는 일반적으로 인간의 귀로 들리는 파동의 형태로 정의됩니다. 이러한 파동은 공기 분자의 진동으로 인해 발생하며, 이를 음파라고도 합니다. 이렇게 발생한 파동은 공기를 통해 전파됩니다.

 

이러한 음파는 진동 주기, 진폭, 파장, 주파수와 같은 파라미터를 가지고 있습니다. 이 중에서 가장 중요한 파라미터는 주파수입니다. 주파수란 단위 시간당 진동수를 의미하며, 고주파수일수록 인간의 귀로는 더 높은 음으로 인식됩니다. 예를 들어, 100Hz는 중저음, 1kHz는 고음, 그리고 10kHz 이상은 초고음으로 인식됩니다.

 

이와 같은 주파수를 이용하여 각기 다른 음을 만들어내는 부품 중 하나가 피에조 부저입니다. 피에조 부저는 직류 전원에 교류 주파수를 겹치는 것으로 소리를 만들어냅니다. 이를 이용하여 아두이노에서 각종 소리를 제어하고 발생시킬 수 있습니다.

 

 

 

2. 피에조 부저란?

 

 

 

피에조 부저(Piezo Buzzer)는 전기적 신호를 받아 소리를 발생시키는 부품으로, 아날로그 출력 방식과 디지털 출력 방식이 있다.

 

아날로그 출력 방식은 PWM(Pulse Width Modulation) 신호를 이용해서 주파수와 음량을 조절하여 소리를 발생시키는 방식이고, 디지털 출력 방식은 주파수와 음량을 미리 지정된 값으로 제어하여 소리를 발생시키는 방식이다.

 

피에조 부저는 주로 경보기, 시계, 게임 등 다양한 장비에 사용되며, 아두이노와 같은 마이크로컨트롤러 보드에서도 자주 사용된다. 아두이노에서는 tone() 함수를 이용하여 피에조 부저를 제어할 수 있다.

 

 

 

3. 아두이노에서 피에조 부저 사용하기

 

 

 

피에조 부저는 아날로그 출력 핀에 연결되어 사용된다. 따라서, 핀 모드를 출력으로 설정해줘야 한다. 아래는 피에조 부저를 사용하는 간단한 예제 코드이다.

 

```c++

 

int speakerPin = 9; // 피에조 부저를 연결한 핀 번호

 

void setup() {

 

pinMode(speakerPin, OUTPUT); // speakerPin을 출력 모드로 설정한다.

 

}

 

void loop() {

 

tone(speakerPin, 1000); // 1000Hz의 소리를 출력한다.

 

delay(1000); // 1초 동안 대기한다.

 

noTone(speakerPin); // 소리를 멈춘다.

 

delay(1000); // 1초 동안 대기한다.

 

}

 

```

 

위 코드에서 `tone()` 함수는 핀에서 입력 주파수의 사각 파형을 생성하고, `noTone()` 함수는 사각 파형 생성을 중지한다. 따라서, `tone()` 함수를 이용하여 소리를 만들기 위해서는 피에조 부저가 연결된 핀과 출력할 주파수를 입력해줘야 한다.

 

또한, 피에조 부저 출력에 더 많은 제어를 원한다면 `tone()` 함수에서 생성되는 사각 파형의 주기와 데이터 시트에 표시된 피에조 부저의 최대 출력 전압의 값을 고려해야 한다. 이 정보를 바탕으로 적절한 저항을 사용해 전압 조절과 증폭을 할 수 있다.

 

 

 

4. 소리의 높낮이 조절 방법

 

 

 

아두이노 피에조 부저를 사용하여 소리의 높낮이를 조절하는 방법은 크게 두 가지가 있습니다.

 

첫 번째 방법은 피에조 부저의 주파수(Frequency) 값을 변경하여 소리 높낮이를 조절하는 것입니다. 주파수 값이 높을수록 높은 소리를 발생시키고, 주파수 값이 낮을수록 낮은 소리를 발생시킵니다. 아래 코드는 주파수 값을 변경하여 피에조 부저에서 소리 높낮이를 조절하는 예시입니다.

 

```

 

int speakerPin = 9; // 피에조 부저의 핀 번호

 

int frequency = 1000; // 소리의 높낮이를 결정하는 주파수 값

 

void setup() {

 

pinMode(speakerPin, OUTPUT); // 피에조 부저의 핀을 출력 모드로 설정

 

}

 

void loop() {

 

tone(speakerPin, frequency); // 피에조 부저에서 주파수값에 해당하는 소리 발생

 

}

 

```

 

두 번째 방법은 피에조 부저의 Duty Cycle 값을 조정하여 소리 높낮이를 조절하는 것입니다. Duty Cycle 값이 높을수록 더 강한 소리를 발생시키고, Duty Cycle 값이 낮을수록 더 약한 소리를 발생시킵니다. 아래 코드는 Duty Cycle 값을 변경하여 피에조 부저에서 소리 높낮이를 조절하는 예시입니다.

 

```

 

int speakerPin = 9; // 피에조 부저의 핀 번호

 

int dutyCycle = 50; // 소리의 높낮이를 결정하는 Duty Cycle 값

 

void setup() {

 

pinMode(speakerPin, OUTPUT); // 피에조 부저의 핀을 출력 모드로 설정

 

}

 

void loop() {

 

analogWrite(speakerPin, dutyCycle); // 피에조 부저에서 Duty Cycle 값에 해당하는 소리 발생

 

}

 

```

 

위의 코드 중에서, 앞서 작성한 코드에서 tone 함수 대신 analogWrite 함수를 사용하면 됩니다. Duty Cycle 값은 0에서 255까지의 값을 가질 수 있습니다. 50이면 대략 20% 정도의 소리 크기를 가진다고 할 수 있습니다.

 

이러한 방법을 통해 피에조 부저에서 발생하는 소리 높낮이를 조절할 수 있습니다.

 

 

 

5. 음계 연주하기

 

 

 

아두이노 피에조 부저를 이용하여 음악을 연주해보자. 음계는 다음과 같이 정의된다.

 

도(C) - 레(D) - 미(E) - 파(F) - 솔(G) - 라(A) - 시(B)

 

가장 기본적인 방법은 음계에 해당하는 주파수를 tone() 함수를 사용하여 발생하는 것이다. 예를 들어, 도(C) 음을 발생시키려면 tone() 함수를 다음과 같이 호출하면 된다.

 

```

 

tone(buzzer_pin, 262);

 

```

 

이 코드는 buzzer_pin에 연결된 피에조 부저에서 262Hz의 주파수를 발생시킨다. 262Hz는 도(C) 음에 해당하는 주파수이다.

 

다음은 전체 음계를 연주하는 코드이다.

 

```cpp

 

int buzzer_pin = 8;

 

void setup() {

 

pinMode(buzzer_pin, OUTPUT);

 

}

 

void loop() {

 

int melody[] = {262, 294, 330, 349, 392, 440, 494};

 

int noteDuration = 1000 / 4;

 

for (int i = 0; i < 7; i++) {

 

tone(buzzer_pin, melody[i]);

 

delay(noteDuration);

 

noTone(buzzer_pin);

 

delay(noteDuration / 10);

 

}

 

}

 

```

 

이 코드는 피에조 부저 핀을 8번에 연결하고, 음계 배열을 melody에 정의한다. noteDuration은 4분음표의 길이이다. for 루프에서 모든 음을 연주한다. tone() 함수로 음을 발생시키고, delay() 함수로 음 길이를 조절한다. noTone() 함수로 음을 멈춘다. 마지막으로 delay() 함수로 음과 음 사이의 간격을 조절한다.

 

 

 

6. 멜로디 연주하기

 

 

 

아두이노 피에조 부저를 이용해 멜로디를 연주할 수 있습니다. 다음은 빵판 연결 방법과 기본적인 멜로디 코드입니다.

 

- 빵판 연결 방법

 

1. 피에조 부저의 긴 다리를 11번 핀에 연결합니다.

 

2. 피에조 부저의 짧은 다리를 GND(Ground)에 연결합니다.

 

- 멜로디 코드

 

```c

 

#define C4 262

 

#define D4 294

 

#define E4 330

 

#define F4 349

 

#define G4 392

 

#define A4 440

 

#define B4 494

 

#define C5 523

 

void setup() {

 

pinMode(11, OUTPUT);

 

}

 

void loop() {

 

int melody[] = { C4, D4, E4, F4, G4, A4, B4, C5 };

 

int duration = 200;

 

for (int i = 0; i < 8; i++) {

 

tone(11, melody[i], duration);

 

delay(duration);

 

}

 

}

 

```

 

위 코드는 도(C4)부터 도(C5)까지의 옥타브를 한 번씩 울리는 간단한 멜로디 코드입니다. 코드의 동작 원리는 다음과 같습니다.

 

1. `setup()` 함수에서 11번 핀을 출력 모드로 설정합니다.

 

2. `loop()` 함수에서 `melody` 배열과 `duration` 변수를 정의합니다.

 

3. `for`문을 이용해 `melody` 배열의 요소를 차례대로 `tone` 함수로 전달합니다. `tone` 함수는 주파수와 지속시간을 받아 피에조 부저를 울리게 합니다.

 

4. 각 음을 울린 후 `delay()` 함수로 일정 시간동안 기다립니다.

 

위 코드를 업로드하면 멜로디가 연주됩니다. `melody` 배열과 `duration` 변수를 적절히 조절하여 다양한 멜로디를 연주해보세요.

 

 

 

댓글