SW 배움터

아두이노 8: 멜로디 연주하기

kusson 2017. 7. 14. 22:29
반응형
728x170

이번 시간에는 아두이노 보드와 부저(스피커)를 이용하여 멜로디를 만들어 보자. 부저는 전기적으로 연결된 전기코일이 작은 떨림판에 붙었다 떨어지면서 소리를 내는 부품이다. 붙거나 떨어지는 시간을 조정하면 소리가 난다. 이 간격이 빠르냐 느리냐에 따라 다양한 소리가 나는데 이것을 적당하게 조작하면 멜로디도 연주 할 수 있다. 먼저 삐~ 소리가 나는지 확인하고, 두번째는 도레미파솔라시도 계이름 소리가 나는지 알아 볼 것이다. 그리고 마지막으로 간단한 동요 멜로디를 연주해 보고 아두이노 보드와 스피커 하나로 멋진 연주도 가능하다는 것을 보일 것이다.

 

 

 

위의 그림과 같이 아두이노 우노 보드의 5번 핀을 스피커의 한선에 연결하고 또 GND에서 한선을 뽑아서 스피커의 다른쪽 선에 연결한다. 그리고 다음과 같이 스케치 프로그램을 작성해서 소리가 나는지 부터 확인한다.

 

void setup() {
  pinMode(5, OUTPUT);      //5번핀을 출력으로 설정.
  digitalWrite(5, HIGH);       //5번핀에 5V를 출력한다.
  tone(5, 262);                   //도음을 낸다.
  delay(3000);                    //3초 정도의 지연시간을 준다.


  noTone(5);                      //음을 소거한다.
  digitalWrite(5, LOW);         //5번핀에 0V를 출력한다.
}

 

void loop() {
}

 

 

소리가 나는 것을 확인 했다면 '도레미파솔라시도' 소리가 나게 해 보자. 아래 프로그램을 보면 tone이란 명령어를 사용하고 있는데 소리를 내라는 명령이다. 5번 출력핀 옆에 숫자가 표시되어 있는 것을 볼 수 있는데 그 숫자가 음의 높이를 나타내는 숫자이다. 262는 도, 294는 레, 330은 미, 349는 파, 392는 솔, 440은 라, 494는 시, 523은 높은도를 나타낸다.

 

void setup() {
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  tone(5, 262);                     //도음 출력
  delay(200);
  tone(5, 294);                     //레
  delay(200);
  tone(5, 330);                     //미
  delay(200);
  tone(5, 349);                     //파
  delay(200);
  tone(5, 392);                     //솔
  delay(200);
  tone(5, 440);                     //라
  delay(200);
  tone(5, 494);                     //시
  delay(200); 
  tone(5,523);                      //도
  delay(200); 


  noTone(5); 
  digitalWrite(5, LOW);
}

 

void loop() {
}

 

아래 프로그램은 위의 프로그램을 for 문을 이용해서 간단하게 나타낸 것이다.

 

int nTones[] = {262, 294, 330, 349, 392, 440, 494, 523};  //도레미파솔라시도

void setup() {
 int nMax = 8;                  

 

 for (int i = 0; i < nMax; i++)
 {
  tone(5, nTones[i]);         //0부터 순서대로 들어간다.
  delay(200);                  //0.2초의 지연시간을 준다.
 }


noTone(5);
}

 

void loop() {
}

 

 

도레미파솔라시도 소리가 나는 것을 확인했다면 이제 간단한 멜로디를 연주해 보자.

 

int nTones[] = {262, 294, 330, 349, 392, 440, 494, 523};
int nMusic[] = {0,2,4,0,2,4,5,5,5,4,4,4,3,3,3,2,2,2,1,1,1,0,0,0};   //멜로디의 음높이를 나타낸다. 도,미,솔,도,미,솔,라....

                                                                     //음의 길이는 5,5,5등으로 같은 음을 반복해서 겹쳐 나타냄.

void setup() {
int nMax = sizeof(nMusic)/sizeof(int);         //음이 몇개인지 확인한다. 세어보면 24개이다.
for(int i = 0; i < nMax; i++)
{
  tone(5, nTones[nMusic[i]]);              //음높이에 맞는 소리를 출력한다.
  delay(200);                                  //한음당 0.2초의 지연시간을 준다.
}
  noTone(5);
}

 

void loop() { 
}

 

이렇게 얼마든지 우리가 원하는 노래를 연주할 수 있다.

 

반응형
그리드형