안녕하세요.
오늘 아두이노와 피에조 부저(Piezo Buzzer)를 이용해서 음악을 연주해보려고 합니다.
[그림 1 : 부저 윗 부분]
[그림 2 : 부저 아랫 부분]
그림 1과 2에서 보시는 것처럼 부저에는 2개의 핀이 있습니다.
오늘도 간단한 작업이 될 것 같은 느낌이네요!
1. 회로 연결
회로 연결은 너무나 간단합니다. 따라서 회로도를 생략하고 연결된 그림만 보시겠습니다.
[그림 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초 동안 아무런 소리를 내지 않도록 합니다.
이렇게 ‘학교 종이 땡땡땡’을 연주하는 스케치를 만들어봤습니다.
여기에서 얼마든지 응용해서 다른 음악을 연주하게도 할 수 있을 것 같습니다.
'아두이노' 카테고리의 다른 글
[아두이노] 팁 - 스케치 업로드가 잘 안될 때 (0) | 2016.12.01 |
---|---|
[아두이노] 수위 센서를 사용해보자. (0) | 2016.11.18 |
[아두이노] 소리 센서 사용하기 (0) | 2016.11.02 |
[아두이노] 시리얼 모니터와 가변저항 (0) | 2016.10.30 |
[아두이노] PWM 활용편 - LED 점점 밝게, 점점 어둡게 (0) | 2016.10.04 |