본문 바로가기
Arduino&RasberryPi/Arduino Uno

13. Arduino - 압전 부저(Buzzer)의 원리, 소리와 주파수

by Rosmary 2019. 11. 7.
728x90
반응형

Arduino 스타터 키트에, 압전 부저라고 불리는 소자가 하나 있다. 막상 그 모양새를 보면, "이 조그만한 게 소리를 낼 수 있다고?"라는 의문이 들 정도로 부저라는 이름과 어울리지 않는다는 느낌이 든다. 그러나, 회로에 연결해보면, 의외로 소리가 크다. 

 

 

위의 사진과 같이, 모양은 매우 다양하며 크기는 이전 포스팅에서 언급했던 택트 스위치보다 약간 작은 크기다. 이 작은 녀석은 큰 소리를 발생시킬 수 있는 능력 하나 덕분에, 대부분의 전자 알람 시계에 내장되어 있다. 

 

압전 부저 역시, Arduino 회로에 연결해 사용할 수 있다. 하지만, 이전의 부품과는 다르게, 부저는 작동 과정을 이해하지 못한다면 소리를 발생시킬 수 있는 코드를 작성하는 것이 상당히 난해하다. 따라서, 이번 포스팅은 압전 부저의 작동 원리부터 상세히 설명하는 것으로 시작하려고 한다.

 

 

1. 압전 부저의 정의 및 작동 방식.

 

압전이라는 말은, 영어로 Piezo-electric이라고 표현하는데, Piezo는 그리스 어로 "누르다"라는 의미를 가지는 πιέζειν(Piezein)이라는 단어에서 유래되었다고 한다. 용어에서 알 수 있듯이, 압전이라는 말은, 무언가를 누르거나 쥐어짜냄으로 인해 전기를 발생시킨다는 말이다. 

 

하지만, 압전 부저에서는 이 의미가 반대로 적용되는데, 전기 신호에 의해 부저에 압력이 전달되는 것이라고 생각하면 된다. 무슨 말이냐면, 부저로 들어오는 전기 에너지가, 부저 내에 존재하는 막에 주기적인 압력을 가해 막을 진동시키고, 이 막의 진동으로 인해 소리가 발생한다는 것이다. 마치 팽팽한 장력을 가진 줄을 튕기면, 줄의 진동에 의해 소리가 발생하듯이.(기타를 생각해보자)

 

그렇다면, 전기 신호는 어떻게 부저 막에 주기적인 진동을 줄 수 있는 것일까? 전기 신호가 부저로 전달되면, 전기 에너지에 의해 막이 한 번 튀어 오르게 된다. 전기 신호를 다시 끊었다가 부저로 전달한다면, 이전과 동일하게 막이 튀어오른다. 이 막이 튀는 과정에서 소리가 발생하게 된다. 하지만, 이 소리는 부저에서 나는 소리라고 하기에는 뭔가 고장난 듯한 느낌이 들 것이다.(압전 부저의 한 쪽 끝은 GND로, 다른 한 쪽 끝은 3.3V Power Pin에 연결하고 소리를 들으면, 뭔가가 '타다닥' 하고 튀는 소리가 난다)

 

그렇다면, 어떻게 해야 부저에서 우리가 원하는 소리가 나도록 만들 수 있을까? Arduino에서 Digital 신호로 부저를 작동시킨다고 가정해보자. 

 

필자가 부저를 작동시키기 위해, 부저에 전기를 공급하는 핀을 통해, digitalWrite() 함수에 HIGH 값을 부여하여 0.1초 동안 작동시키고, 다음 0.1초는 LOW값을 부여하여 신호 공급을 끊는 코드를 작성했다고 해보자. 그럼, 프로그램이 실행되는 순간을 시작으로, 0.2초 간격으로 막이 튀는 소리를 듣게 될 것이다. 0.2초마다 막이 한 번 진동을 하니 1초에 5번을 하게 된다. 물리 용어로 1초간 진동하는 횟수를 진동수(또는 주파수)라고 표현하는데, 단위까지 사용해서 이 내용을 나타낸다면 5Hz( 헤르츠, 1초 동안의 진동 횟수 = '1초  / 1회 진동에 걸리는 시간' )로 표시할 수 있겠다.

 

진동수가 높으면 높을수록, 고음이 발생하며, 반대로 진동수가 낮아지면 소리도 저음이 나게 된다. 기타 줄의 튜닝 작업을 진행해보신 분들이라면 금방 이해 될 것이다, 줄의 장력이 높으면 높을수록, 진동수가 커지고 그에 따라 소리가 점차 높아지며, 반대로 줄의 장력이 낮으면 진동수가 작아짐에 따라 소리도 저음으로 나는 것처럼 말이다. 현재 Arduino에서 코드로 설정한 진동수 5Hz는, 사람이 분석가능한 소리를 내기에는 너무나도 작은 진동수다. 따라서, 의미있는 소리를 듣기 위해서는 이 진동수를 증가시켜야 한다.

 

진동수를 증가시키기 위해 사용하는 한 가지 방법은, 전기 신호를 공급하는 주기를 짧게 만드는 것이다. 

 

Hz = 1초 / (1회 진동에 걸린 시간) 

 

이므로, 1회 진동에 걸린 시간, 즉 전기 신호를 On/Off 하는 주기만 짧게 가져간다면, 진동수(Hz)는 올라가게 된다. 보통 악기를 시작하면서 배우는 기본적인 "도"음계의 진동수는 250Hz 언저리다. 따라서, 250Hz 언저리로 전기 신호를 부저로 전달할 수 있다면, 식별 가능한 소리를 들을 수 있을 것이다.

 

 250 Hz = 1 / x       =>  x = 1초 / 250  = 1000 밀리초 / 250 = 4 밀리초.

 

즉, digitalWrite() 함수의 HIGH/LOW 주기를 4밀리초로 설정한다면, 이전과 다르게 뚜렷한 소리가 발생하는 것을 듣게 될 수 있다. 

 

 

 

2. 음계에 따른 주파수 값

 

음악 시간에 기본으로 배우는 "도레미파솔라시"를 압전 부저로 출력해본다고 가정해보자. 각 음계마다 특정 주파수를 가지고 있으므로, 이 주파수에 맞게 HIGH/LOW 주기를 조절해 줄 수 있다면, 충분히 "도레미파솔라시도"를 압전 부저로 출력하는 것이 가능하다.

 

각각의 음이 가지는 주파수는 다음과 같다. 표의 길이가 많이 길다. 조금 더 가독성 있는 표를 원하시는 분들은 첨부된 엑셀 파일을 참조하면 된다.

 

Tone-Hz_Table.xlsx
0.01MB

 

***   '도레미파솔라시'는 각각 'CDEFGAB'로 치환하여 나타낸다)

 

음(Tone) 주파수(Hz)
A(3음계) 220
A# 233
B 247
C(4음계) 262
C# 277
D 294
D# 311
E 330
F 349
F# 370
G 392
G# 415
A 440
A# 466
B 494
C(4음계) 523
C# 554
D 587
D# 622
E 659
F 698
F# 740
G 784
G# 831
A 880
A# 932
B 988
C(5음계) 1047
C# 1109
D 1175
D# 1245
E 1319
F 1397
F# 1480
G 1568
G# 1661
A 1760
A# 1865
B 1976
C(6음계) 2093
C# 2217
D 2349
D# 2489
E 2637
F 2794
F# 2960
G 3136
G# 3322
A 6520
A# 3729
B 3951
C(7음계) 4186
C# 4435
D 4699
D# 4978
E 5274
F 5588
F# 5920
G 6272
G# 6645
A 7040
A# 7459
B 7902

 

다음 포스팅에서는, 압전 부저의 작동에 필요한 코드 및 mtone() 등의 관련 함수에 대해 작성하려 한다.

생각보다 쓸 내용이 많네...

 

 

FIN.

 

반응형

댓글