반응형

아두이노에서는 피에조부저를 이용해서 간단하게 소리를 낼 수가 있다.

이를 이용하여 간단한 멜로디를 만들어보자.


피에조 부저의 모습


아두이노와 피에조 부저의 연결은 다음과 같다.

피에조 부저는 극성이 있다. 핀이 긴쪽이 + 이고 짧은쪽이 - 이다.

짧은쪽은 GND에 긴쪽은 아두이노 디지털 단자에 연결해 준다.



##소스 1##

BEEP 음을 1초 마다 내는 소스, tone() 의 파라미터를 조절하면 다양한 음을 만들 수 있다.

1
2
3
4
5
6
7
8
9
int speakerpin = 12//스피커가 연결된 디지털핀 설정
 
void setup() {
}
 
void loop() {
  tone(speakerpin,500,1000);  //500: 음의 높낮이(주파수), 1000: 음의 지속시간(1초)
  delay(2000); 
}

cs


##결과 1##



##소스 2##

도레미파솔라시도를 연주한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int speakerpin = 12//스피커가 연결된 디지털핀 설정
int note[] = {2093,2349,2637,2793,3136,3520,3951,4186}; //도레미파솔라시도
 
void setup() {
  int elementCount = sizeof(note) / sizeof(int);
  for (int i=0; i < elementCount; i++)    //note를 play
  {
    tone(speakerpin,note[i],500);
    delay(750);
  }
}
 
void loop() {
}
cs



##결과 2##




위와 같이 도레미파솔라시도를 연주할 경우 각각의 음계의 tone값을 적어주어야 한다. 만약 tone값을 모를 경우 멜로디를 만들기가 아주 힘들다. 이런 경우 사용할 수 있도록 tone값에 대해서 미리 정의해 놓은 pitches.h 라는 헤더파일을 만들어 이용하면 손쉽게 멜로디를 만들 수 있다.


※ 참조: https://www.arduino.cc/en/Tutorial/Tone


아래의 소스를 pitches.h 라는 이름으로 프로그램과 같은 폴더에 저장해 놓고 프로그램에서 include하여 사용하면 된다.


## pitches.h ##

아래의 소스를 pitches.h 라는 이름으로 프로그램과 같은 폴더에 저장


/*************************************************

 * Public Constants

 *************************************************/

#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978






##소스 3##

pitches.h를 이용하여 '학교종이 떙땡땡' 노래를 연주한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
#include "pitches.h"
 
int speakerpin = 12//스피커가 연결된 디지털핀 설정
 
//음계 데이터 (24개)
int melody[] = {NOTE_G7,NOTE_G7,NOTE_A7,NOTE_A7,NOTE_G7,
                NOTE_G7,NOTE_E7,NOTE_G7,NOTE_G7,NOTE_E7,
                NOTE_E7,NOTE_D7,NOTE_G7,NOTE_G7,NOTE_A7,
                NOTE_A7,NOTE_G7,NOTE_G7,NOTE_E7,NOTE_G7,
                NOTE_E7,NOTE_D7,NOTE_E7,NOTE_C7};
//음의길이, 4:4분음표, 2:2분음표
int noteDurations[] = {4,4,4,4,4,4,2,4,4,4,4,1,4,4,4,4,4,4,2,4,4,4,4,1};
 
void setup() {
  for (int thisNote = 0; thisNote < 24; thisNote++)
  {
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(speakerpin, melody[thisNote], noteDuration); //소리를 낸다.
    int pauseBetweenNotes = noteDuration * 1.30;      //delay 계산식
    delay(pauseBetweenNotes);                         //delay
    noTone(speakerpin);                               //대상핀 출력 중단
  }
}
 
void loop() {
}
cs


##결과 3##
뭔가 음정이 이상하지만 비슷하게는 된다. ^^


반응형

+ Recent posts