반응형

2015년도 저물어가고 즐거운 크리스마스가 다가오고 있습니다. 크리스마스 캐롤은 당연히 CD나 MP3의 고음질로 듣는게 좋지만 아두이노에서 피에조 부저를 통해서 크리스마스 캐롤을 들어보고 싶은 생각이 갑자기 들었습니다. 구글링을 해 보니 아두이노 포럼에 관련 글이... ㅎㅎ (http://forum.arduino.cc/index.php?topic=1390.0) 그래서 저도 따라해 봤습니다. 아두이노 포럼의 캐롤 이외에도 징글벨이 추가 되었습니다.




뭐 예전에도 피에조부저는 한 번 다룬적이 있어서 (피에조부저에 대해 궁금한 분들은 클릭: http://deneb21.tistory.com/218) 음계에 대해서 안다면 멜로디 만드는 것은 별로 어려운 것이 없습니다.


먼저 아두이노의 디지털 9번핀에 피에조부저의 + 극을 연결합니다. 물론 다른 핀에 연결하셔도 됩니다. 코드에서 출력핀을 바꿔주면 되니까요. 피에조 부저의 - 극은 아두이노의 GND(Ground)에 연결해 줍니다. 


아두이노를 PC에 연결하고 아두이노 IDE에 다음의 코드를 입력하고 업로드하면 됩니다.

아래의 코드는 기본적으로 징글벨이 나오며 듣고 싶은 캐롤을 주석제거하고 업로드 하시면 음악이 나옵니다. 물론 이전의 멜로디는 주석처리를 해야겠죠.


##소스코드##


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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
int speakerPin = 9;
 
//Jingle Bells
int length = 26;
char notes[] = "eeeeeeegcde fffffeeeeddedg";
int beats[] = { 11211211114111111111111122};
 
////Ding Dong Merrily on High
//int length = 73;
//char notes[] = "ggagsed deggsgg ggagsed deggsgg DCbCDbCbabCabagabgagsgasgsesgeseddeggsgg "; // a space represents a rest
//int beats[] = { 2,2,1,1,1,1,4,2,2,2,2,2,2,4,2,2,2,2,1,1,1,1,4,2,2,2,2,2,2,4,2,2,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,1,1,1,1,3,1,2,2,2,2,2,2,4,2,2 };
 
////God Rest Ye Merry Gentlemen
//int length = 69;
//char notes[] = "ddaagfedcdefga ddaagfedcdefga avgavCDagfdefgfgavaagfedfedgfgavCDagfed";
//int beats[] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,4,2,2,2,2,2,2,4,1,1,2,4,2,2,2,2,2,2,2,2,2,2,8 };
 
////O Little Town of Bethlehem
//int length = 71;
//char notes[] = "cfffgagavCavafggfcfffgagavCavafggffaCDCvagfgavCcfagfccfffgagavCavafggf ";
//int beats[] = { 2,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,2,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,1,1,3,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,4,4,2,2,2,2,1,1,1,1,2,2,2,1,1,2,2,6,2 };
 
////While Shephards Watched
//int length = 29;
//char notes[] = "faagfvvagaCCbCaDCvagfeagffef ";
//int beats[] = { 2,3,1,2,2,2,2,2,2,2,2,2,2,6,2,3,1,2,2,2,2,2,2,2,2,2,2,6,2 };
 
////In The Bleak Midwinter
//int length = 51;
//char notes[] = "aavCagfgagdgavCaggfgagff vavCDDaaCagfecavCagfgagff ";
//int beats[] = { 2,3,1,2,2,4,4,3,1,2,2,8,3,1,2,2,3,1,4,2,2,3,1,6,2,3,1,2,2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,4,4,2,2,3,1,8,8};
 
////Hark the Herald
//int length = 77;
//char notes[] = "cffefaagCCCvagacffefaagCffeedcCCCfvaagCCCfvaagDDDCvavgavCffgaDDDCvavgavCffgf ";
//int beats[] = {2,2,3,1,2,2,2,2,2,2,3,1,2,2,4,2,2,3,1,2,2,2,2,2,2,3,1,2,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,1,1,3,1,2,2,4,3,1,2,2,2,2,4,2,1,1,3,1,2,2,4,8};
 
////O come all Ye Faithful
//int length = 64;
//char notes[] = "ggdgadbabCbaggsesgabsedd DCbCbabgasedggsgagdbbabCbabCbagsgCbagg ";
//int beats[] = { 2,4,2,2,4,4,2,2,2,2,4,2,2,4,2,2,2,2,2,2,4,3,1,6,2,4,2,2,4,4,2,2,2,2,3,1,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,4,3,1,6,8 };
 
////O Come O Come Emmanuel
//int length = 63;
//char notes[] = "egbbbaCbagabgegasedeaaeesgsedgabbbaCbag DD bb baCdagabgegasede ";
//int beats[] = { 2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,2,2,2,2,6,2,2,2,2,2,4,2,2,6,2,2,2,2,2,2,2,2,2,4,2,2,4,2,2,4,2,2,2,2,2,2,6,2,2,2,2,2,2,2,2,2,8,8 };
 
int tempo = 300;
 
void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}
 
void playNote(char note, int duration) {
  
char names[] = { 'c''d''e''f''s''g''a''v''b''C''D''E' };
int tones[] = { 191517001519143213521275113610731014956852758 };
 
  // play the tone corresponding to the note name
  for (int i = 0; i < 8; i++) {
    if (names[i] == note) {
      playTone(tones[i], duration);
    }
  }
}
 
void setup() {
  pinMode(speakerPin, OUTPUT);
}
 
void loop() {
  for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(notes[i], beats[i] * tempo);
    }
 
    // pause between notes
    delay(tempo / 2); 
  }
}
cs



##실행결과##



반응형

+ Recent posts