[아두이노] 피에조부저 제어

IOT/아두이노|2019. 2. 4. 14:54

[아두이노] 피에조부저 제어



1. 회로도 구성


  • 준비물 : 피에조부조 1개, 아두이노우노
  • 내용 : 12번 핀을 주파수 출력핀으로 사용하여 멜로디를 만들어 보자.

회로 구성은 보는것과 같이 간단하다.



2. 코딩


  • 출처 : https://www.arduino.cc/en/Tutorial/toneMelody
  • 함수 : tone(핀번호, 주파수, 출력시간), noTone(핀번호), delay(시간값)
  • 내용 : 주파수 값은 해당 사이트에서 제공되는 값으로 도레미파솔라시도 출력해보자.

#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 //도

int tonepin = 12;
int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 }; //도레미파솔라시도
int noteDurations = 1000 / 4; //톤길이(4분음표)

void setup() {
  for (int i = 0; i < 8; i++) {
    tone(tonepin, melody[i], noteDurations);
    int pauseBetweenNotes = noteDurations * 1.30;
    delay(pauseBetweenNotes);
    noTone(tonepin);
  }
}
void loop() {
}

첫번째 :
#define은 매크로 변수로 NOTE_C5란 변수명은 523이란 숫자를 지칭한다. 매크로상수라고만 이해하시면 된다. 523의 별명으로 NOTE_C5라고 불리운다라고 생각하면 될듯요. 각 주파수 값을 숫자로 이게 도인지 솔일지 모르잖아요. 그걸 별명으로 이름을 지어주는 거라고 생각하시면 됩니다.

두번째 :
setup()함수에 로직을 짠 이유는 loop()함수에다가 코딩해도 됩니다. 그런데 멜로디를 무한 반복해서 듣는건 좀 그래서 처음 한번만 수행하는 setup()함수에 1번만 멜로디를 듣도로 실험하기 위해서 setup()에 코딩했습니다. setup()에 코딩해야하는건 아니고 그냥 1회만 멜로디 출력시키기 위해서 이쪽에다 코딩했을뿐 의미가 있는건 아닙니다.

세번째 :
tone()과 notone()은 확실히 음과 음사이를 끊어주기 위한 것으로 하나의 음계의 소리가 귀로 들을때 들리는 음의 구별하기 위해서 처음과 끝을 나타내는 위치로 생각하시면 됩니다.
그리고 그 사이 delay() 함수의 길이가 1.3배함으로 음과 음의소리가 음과 음의길이사이의 딜레이가 발생시키게 합니다. 이걸 구별해서 이해하실려면 1.3대신에 더 큰 숫자를 넣고 돌려보세요. 음을 실제로 들어보면 왜 delay()함수를 넣은지 이해가 되실꺼에요.

melody[] 변수는 배열변수로 하나의 이름으로 여러개의 저장소를 갖는데 int melody[8]로 선언되면 8개의 그릇을 갖게 됩니다. 각 그릇은 다른 값을 저장이 가능합니다. 배열변수는 안에 숫자로 위치를 나타냅니다.
가령 melody[0]=523 , melody[1]=587, .... 이렇게 각 그릇해 주파수 값을 저장되어 있는 것이죠.

for문으로 0~7까지 루프를 돌잖아요.

tone(tonepin, melody[0], noteDurations);

이것은

tone(12, 523, 1000/4);

되는 것이죠.

하나의 음계의 동작은 도라는 음계를 4분음표이고 그걸 피에조부조로 들리게 한다면 아래와 같이 수행되게 됩니다.

tone(핀번호, 523, 1000/4); //도 4분음표
int pauseBetweenNotes = (1000/4) * 1.30; //4분음표 딜레이시간
delay(pauseBetweenNotes);
noTone(핀번호); 

여기서 도레미파솔라시도 총 8번 반복 수행해서 각 melody[i]값이 음계가 출력되는 것이죠.

3. 결과


마무리


오늘은 tone(), noTone()의 함수에 대해 배웠습니다. 이걸 통해서 피에조부저를 통해 멜로디를 만들었습니다.
그러면 한번 곰세마리를 악보를 보고 멜로디를 만들어 보세요.

참고할것은 여기서, 도레미파솔라시도는 4분음표로 고정해서 멜로디를 만들었습니다.
하지만 모든 음악이 4분음표만 있는게 아니죠.

힌트는,
1000/4은 4분음표면 1000/8은 8분음표겠죠. 1000/2은 2분음표이고요.
도레미파솔라시도의 4분음표일때
int noteDurations[]={4,4,4,4,4,4,4,4}; 이렇게 하면 음표 배열을 만들어지겠죠.
Durations=1000/noteDurations[i]으로 하면 해당 음계에 음표를 만들 수 있겠죠.

한번 곰세마리를 만들어 보세요.
내일 곰세마리 멜로디를 올리도 할께요.


댓글()