압전(piezo) 효과
압전 정효과 : 압력 -> 전압발생
압전 역효과 : 전압 -> 압력변화
가청주파수
20Hz~20KHz 의 주파수로 사람이 들을 수 있는 소리의 주파수를 가청주파수라고 합니다.
20Hz이하의 주파수를 초저주파수, 20Khz 이상의 주파수를 초음파라고합니다.
단 가청주파수는 동물마다, 또 사람마다 다 다를 수 있다.
참고 : MHz, GHz 정도되면 무선통신에 사용합니다. 2.4GHz 블루투스 주파수
피에조 부저를 연주하려면 tone(pin번호, 주파수) , noTone()함수를 사용해야합니다.
ex) : tone(10, 32.7032) // 피에조부저가 '도'로 울립니다.
delay(1000); // 1초 경과
noTone() //더 이상 안 울림
실습 1. 도레미파솔라시도 소리내보기
#define piezo 9
float tones[]={262,293,329,349,392,440,493,523};
void playSound(){
int size=sizeof(tones); // 배열의 총 byte : 4byte x 8
size=size/sizeof(float); // 배열의 길이
for(int i=0; i<size ; i++){
tone(piezo,tones[i]);
delay(500);
}
noTone(piezo);
}
void setup() {
pinMode(piezo,OUTPUT);
playSound();
}
void loop() {
// put your main code here, to run repeatedly:
}
실습2. 학교종이 땡땡땡
int do1=1047;
int re=1175;
int mi=1319;
int fa=1397;
int sol=1568;
int ra=1760;
int si=1976;
float musicData[]={sol,sol,ra,ra,sol,sol,mi, sol,sol,mi,mi,re
,sol,sol,ra,ra,sol,sol,mi, sol,mi,re,mi,do1};
int delayTime[]= {400,400,400,400,400,400,800, 400,400,400,400,800
,400,400,400,400,400,400,800, 400,400,400,400,800};
를 이용해서 학교종이 땡땡땡을 연주해보세요.
#define piezo 9
int do1=1047;
int re=1175;
int mi=1319;
int fa=1397;
int sol=1568;
int ra=1760;
int si=1976;
float musicData[]={sol,sol,ra,ra,sol,sol,mi, sol,sol,mi,mi,re
,sol,sol,ra,ra,sol,sol,mi, sol,mi,re,mi,do1};
int delayTime[]= {400,400,400,400,400,400,800, 400,400,400,400,800
,400,400,400,400,400,400,800, 400,400,400,400,800};
void playSound(){
int size=sizeof(musicData);
size=size/sizeof(float);
for(int i=0; i<size ; i++){
tone(piezo,musicData[i]);
delay(delayTime[i]);
}
noTone(piezo);
}
void setup() {
pinMode(piezo,OUTPUT);
playSound();
}
void loop() {
// put your main code here, to run repeatedly:
}
실습3. 원하는 음악 연주해보기
구글에 동요를 검색해보시고 원하는 음악을 만들어보세요.
----------------------------------------------------------------------------------------------------
동요 외 음악 구현해보기.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody
에서 음계 복사.
(피에조부저 특성상 음이 울리기 때문에 고음에서 해야 명확하게 들립니다.
원래음보다 2~3옥타브 이상의 음을 사용해 작성해보세요)
음표.
음 길이 구하기
//기본 음표
#define n1 4 //온음표
#define n2 2 //2분음표
#define n4 1
#define n8 0.5
#define n16 0.25
#define n32 0.125
//점음표
#define n2s 3 //점2분음표
#define n4s 1.5 //점4분음표
#define n4ss 1.75 //점점2분4분음표
#define n8s 0.75 //점8분음표
//셋잇단음표
#define n4t 0.66
#define n8t 0.333
#define n16t 0.165
템포 구하기
의미 : 1분에 4분음표 100개 연주되는 속도
1분 : 60000ms
60000ms 동안 4분음표 100개 연주
4분음표 1개 길이= 60000/100=600
#define tempo 600
※ 실제 음 길이
4분음표 : n4*tempo
8분음표 : n8*tempo
정답 :
#define B0 31
#define C1 33
#define CS1 35
#define D1 37
#define DS1 39
#define E1 41
#define F1 44
#define FS1 46
#define G1 49
#define GS1 52
#define A1 55
#define AS1 58
#define B1 62
#define C2 65
#define CS2 69
#define D2 73
#define DS2 78
#define E2 82
#define F2 87
#define FS2 93
#define G2 98
#define GS2 104
#define A2 110
#define AS2 117
#define B2 123
#define C3 131
#define CS3 139
#define D3 147
#define DS3 156
#define E3 165
#define F3 175
#define FS3 185
#define G3 196
#define GS3 208
#define A3 220
#define AS3 233
#define B3 247
#define C4 262
#define CS4 277
#define D4 294
#define DS4 311
#define E4 330
#define F4 349
#define FS4 370
#define G4 392
#define GS4 415
#define A4 440
#define AS4 466
#define B4 494
#define C5 523
#define CS5 554
#define D5 587
#define DS5 622
#define E5 659
#define F5 698
#define FS5 740
#define G5 784
#define GS5 831
#define A5 880
#define AS5 932
#define B5 988
#define C6 1047
#define CS6 1109
#define D6 1175
#define DS6 1245
#define E6 1319
#define F6 1397
#define FS6 1480
#define G6 1568
#define GS6 1661
#define A6 1760
#define AS6 1865
#define B6 1976
#define C7 2093
#define CS7 2217
#define D7 2349
#define DS7 2489
#define E7 2637
#define F7 2794
#define FS7 2960
#define G7 3136
#define GS7 3322
#define A7 3520
#define AS7 3729
#define B7 3951
#define C8 4186
#define CS8 4435
#define D8 4699
#define DS8 49784978
//계이름 내부적으로 A0~A5 는 14~19였는데 아날로그핀 사용은 이제 14 15로 직접 설정해주자
//템포 4분음표가 1분에 몇개 있냐
//4분음표=100 ==> 1분에 4분음표 100개
//1분은 60000ms, 60000/100=600
//4분음표=100 인 악보에서의 tempo는 600
// n4 * tempo 하면 4분음표 1개만큼의 길이
#define tempo 600
//기본 음표
#define n1 4
#define n2 2
#define n4 1
#define n8 0.5
#define n16 0.25
#define n32 0.125
#define n64 0.0625
//점음표 s는 점5분표, ss는 점점5분표, t는 3ㅂ
#define n2s 3
#define n4s 1.5
#define n4ss 1.75
#define n8s 0.75
#define n4t 0.66
#define n8t 0.333
#define n16t 0.165
#define piezo 9
float gye[]={AS5,G6,F6,G6,F6,DS6,AS5,G6,C6,D6,C6,AS5,C6,C7,G6,AS6,FS6,G6,F6,G6,D6,DS6,C6,AS5,D7,C7,AS6,GS6,G6,GS6,C6,D6,DS6};
float note[]={n8,n4s+n8,n8,n8,n4s,n4,n8,n4,n32,n64,n64,n64,n64,n4,n8,n4s,n4,n8,n4s,n4,n8,n4s,n4s,n8,n8,n8,n16,n16,n16,n16,n16,n16,n4s};
void setup() {
int size=sizeof(gye)/sizeof(float);
for(int i=0;i<size;i++){
if(gye[i]!=size-1){
if(gye[i]==gye[i+1]){ //다음 음이랑 같은 계이름일 경우 조금 쉬었다가 울리게
tone(piezo,gye[i]);
delay(tempo*note[i]-50);
noTone(piezo);
delay(50);
}else{ //아니면 그냥 울리게
tone(piezo,gye[i]);
delay(tempo*note[i]);
noTone(piezo);
}
}else if(gye[i]==size-1){ //마지막도 그냥 울리게
tone(piezo,gye[i]);
delay(tempo*note[i]);
noTone(piezo);
}
}
}
void loop() {
// put your main code here, to run repeatedly:
}
실습: 스위치를 이용해서 피아노 만들어 보기
--하고싶으신분만 해보세요--