피에조(스피커)의 소스코딩을 해석하겠다.
이 소스코딩만 이해한다면 피에조로 간단한 노래는 만들 수 있을 것이다.
int BuzzerPin = 9; // 피에조 핀버튼또한 0~13번 아무핀이나 사용가능하다.
char noteNames[] = {'C','D','E','F','G','a','b','c','d'}; // 도 = C 레 = D 이런식으로 노트를 구성한다.
//도ㅡ레ㅡ미ㅡ파ㅡ솔ㅡ라ㅡ시ㅡ도
int frequency[] = {1047,1175,1319,1397,1568,1760,1976,2093,2349}; // 더 많은 음의 주파수는 검색하여 찾기 바란다.
byte noteCount = sizeof(noteNames); //음계의 갯수를 구한다. 지금은 도~ 도까지니 8개.
//char score[] = "CCGGaaGFFEEDDC GGFFEEDGGFFEED CCGGaaGFFEEDDC"; //작은별악보
//char score[] = "GGaaGGE GGEED GGaaGGE GEDEC"; //학교종악보
char score[] = "GEE FDD CDEFGGG GEE FDD CEGGC DDDDDEF EEEEEFG GEE FDD CEGGC"; // 나비야악보
byte scoreLen = sizeof(score); // 악보의 크기를 구한다.
//ex) "GEE FDD"면 크기는 7이다.(byte는 글자하나당 1로 취급)
void setup()
{
pinMode(BuzzerPin,OUTPUT); // 소리를 내니 OUTPUT으로 지정한다.
}
void loop()
{
for (int i=0 ; i<scoreLen ; i++) // i는 0부터 악보크기만큼 반복한다.
{ //( 악보를 연주해야되니 악보크기만큼 반복 )
int duration = 150; // 박자를 의미한다
playNote(score[i], duration); // 연주 함수를 만든다.이때 악보와 박자를 가져간다.
}
delay(5000); // 연주가 끝나면 5초 딜레이
}
void playNote(char note, int duration) // 노트는 score[i]의 배열이니 note로 가져올수 있다.
{
for (int i=0 ; i<noteCount ; i++) // 도~도까지 반복 검색한다.
{
if (noteNames[i] == note) // 만약 음계와 악보에 있던 음계가 일치한다면
{
tone(BuzzerPin, frequency[i], duration); // 음이 울린다.
}
}
delay(duration); // 음이울리고 박자만큼 delay를 제공한다.
}
다소 어려울 수도있다. 필자도 처음에는 해석하는데 힘이 들었다.
하지만 이것만 해석한다면 피에조를 완벽하게는 아니지만 능숙하게 사용할 수 있을 것이다.
'Applied > Arduino' 카테고리의 다른 글
line tracing with sensor moudule ( 라인트레이서 ) (0) | 2014.02.15 |
---|---|
ServoMotor (0) | 2014.02.15 |
Push Button (0) | 2014.01.15 |
LED fading (0) | 2014.01.15 |
LED Blink ( on / off ) (0) | 2014.01.15 |