[아두이노] 아두이노 피아노 만들기

IOT/아두이노|2019. 8. 16. 09:00

[아두이노] 아두이노 피아노 만들기



예전 post를 정리하면서 피에조부저의 응용 예제로 빼먹었던 아두이노 피아노 만들기를 이번에 post로 작성하게 되었습니다. 원리는 피에조부저 제어편에서 "도레미파솔라시도" 음을 순서대로 FOR문을 통해 멜로디를 출력했던 소스에서 이 멜로디 음을 스위치버턴을 이용하여 아두이노 피아노로 구현해 보았습니다. 실험은 가상시뮬레이터에서 이루어 집니다.

이제 어떻게 만들는지 살펴보도록 하죠.

1. 피아노 이해



피아노의 건반을 아두이노를 이용하여 표현을 해 볼까요. 피아노는 건반과 사운드로 나눌 수 있습니다. 건반을 누르면 해당 음으로 소리로 출력이 됩니다. 이 부분을 아두이노로 표현한다면 다음과 같습니다.

  • 건반 = 스위치 버턴
  • 사운드 = 피에조부조


스위치 버턴을 누르면 피에조부저로 해당 음을 출력하면 간단히 아두이노 피아노를 만들 수 있겠죠.

2. 아두이노 피아노 회로도


준비물 : 스위치버턴 8개, 피에조부저 1개, 아두이노우노
내용 : 스위치 버턴을 2,3,4,5,6,7,8,9번 핀에 연결하고 피에조부저는 12번에 연결하시오.



9번부터 2번까지 "도레미파솔라시도"의 건반핀으로 사용 할 예정입니다.

3. 코딩



피에조부저 제어편에 가시면 기본 멜로디 "도레미파솔라시도" 출력 예제가 있습니다. 그 소스를 기반으로 실험합니다.

  • 기본음계
#define NOTE_C5  523   //도 (5옥타브 음계 데이터)
#define NOTE_D5  587   //레
#define NOTE_E5  659   //미
#define NOTE_F5  698   //파
#define NOTE_G5  784   //솔
#define NOTE_A5  880   //라
#define NOTE_B5  988   //시
#define NOTE_C6  1047  //도
  • 스위치버턴 변수
const byte melodyPin[] = {9,8,7,6,5,4,3,2}; //스위치버턴
  • 멜로디 출력 변수
const byte tonepin = 12; //피에조부저
  • 음계 변수
const int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 }; //도레미파솔라시도
int noteDurations = 50; //톤길이
  • 스위치버턴 누름 동작
for(int i=0;i<8;i++){ //8개의 건반을 빠르게 체크
   if(digitalRead(melodyPin[i])==LOW){ //내부풀업스위치버턴 누르면
     tone(tonepin, melody[i],noteDurations); //해당 스위치 버턴 음 출력
     delay(noteDurations);  //음길이 최소
     noTone(tonepin); //음 중단
   }
 }

총 0~7까지의 배열위치의 스위치버턴 상태를 체크합니다. 8개의 스위치 버턴 상태를 체크하기 때문에 위에서 for문을 이용하여 순차적으로 체크를 하게 됩니다. 해당 스위치 버턴이 눌르게 되면 최소 누른 음과 길이를 50만큼 음이 울리게 지정했습니다. 이렇게 한 이유는 2개 이상의 스위치 버턴을 누를 때 2개이상의 음이 동시에 울리는 착시음 효과를 나타내기 위해 최소음길이로 지정했네요. 이 원리는 예전에 여러개의 LED를 하나의 제어선을 이용하여 시간차로 동시에 서로 다른 LED에 불이 들어오게 하는 원리와 비슷합니다.

종합해보면,

#define NOTE_C5  523   //도 (5옥타브 음계 데이터)
#define NOTE_D5  587   //레
#define NOTE_E5  659   //미
#define NOTE_F5  698   //파
#define NOTE_G5  784   //솔
#define NOTE_A5  880   //라
#define NOTE_B5  988   //시
#define NOTE_C6  1047  //도

const byte melodyPin[] = {9,8,7,6,5,4,3,2}; //스위치버턴
const byte tonepin = 12; //피에조부저
const int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 }; //도레미파솔라시도
int noteDurations = 50; //톤길이

void setup()
{
  for (int i = 0; i < 8; i++) {
    pinMode(melodyPin[i], INPUT_PULLUP); //내부풀업스위치 지정
  }    
}

void loop()
{
  for(int i=0;i<8;i++){ //8개의 건반을 빠르게 체크
    if(digitalRead(melodyPin[i])==LOW){ //내부풀업스위치버턴 누르면
      tone(tonepin, melody[i],noteDurations); //해당 스위치 버턴 음 출력
      delay(noteDurations); //음길이 최소
      noTone(tonepin); //음 중단
    }
  }
}

4. 결과


간단히 "학교종"을 연주해 보았습니다.


마무리


오늘은 예전에 피에조부저에 대해서 post하면서 빼먹은 피에조부저 응용 예제로 아두이노 피아노를 간단히 실험을 하였습니다.


댓글()