코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-09-01 14:24:25
NO
|
부품명
|
수량
|
1
|
아두이노 보드 우노
|
1
|
2
|
초음파 거리 센서
|
2
|
3
|
피에조 부저
|
1
|
4
|
점퍼 케이블
|
15
|
5
|
브레드보드
|
1
|
부품명 | 아두이노 보드 우노 | 초음파 거리 센서 | 피에조 부저 | 점퍼 케이블 | 브레드 보드 |
부품사진 | X1 | X2 | X1 | X15 | X1 |
/*
초음파 거리 센서로 테레민 만들기
이 스케치는 kocoaFAB에서 만들었습니다.
누구나 무료로 사용하실 수 있습니다.
*/
//초음파 센서의 핀번호를 설정
//왼쪽 초음파 거리센서로 음을 바꾸고 오른쪽 초음파 거리센서로 음량 조절함
int echoPin = 12;
int trigPin = 13;
int echoPin_right = 10;
int trigPin_right = 11;
int piezoPin = 3; //피에조 부저센서의 핀번호를 설정
float duration, duration_right;
int amp = 0;
void setup(){
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(trigPin_right, OUTPUT);
pinMode(echoPin_right, INPUT);
// trig, trig_right를 출력모드로 설정, echo, echo_right를 입력모드로 설정
pinMode(piezoPin, OUTPUT);
//piezoPin을 출력모들 설정
}
void loop(){
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
// 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다.
digitalWrite(trigPin_right, HIGH);
delay(10);
digitalWrite(trigPin_right, LOW);
duration_right = pulseIn(echoPin_right, HIGH);
//아날로그 입력값의 범위로 바꿈
duration_right = constrain( map(duration_right, 0, 6000, 0, 1023), 0, 1023);
//음량과 음 높이를 변화시키는 함수 호출
changeVolume();
changeNote(duration, amp);
}
//거리에 따라 음량을 변화시키는 함수
void changeVolume() {
amp = duration_right / 10;
}
//거리에 따라 음 높이를 변화시키는 함수
void changeNote(float time, int amp) {
if((duration >0) && (duration < 400)) { //거리가 0이상 400이하면
for(long i = 0; i < 1000000; i=i+2552) { //도
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1911 - amp);
}
} else if(duration < 800 ){ //거리가 800이하면
for(long i = 0; i < 1000000; i=i+2552) { //레
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1702 - amp);
}
} else if(duration < 1200) { //거리가 1200이하면
for(long i = 0; i < 1000000; i=i+2552) { //미
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1517 - amp);
}
} else if (duration < 1600) { //거리가 1600이하면
for(long i = 0; i < 1000000; i=i+2552) { //파
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1431 - amp);
}
} else if (duration < 2000) { //거리가 2000이하면
for(long i = 0; i < 1000000; i=i+2552) { //솔
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2 * 1276 - amp);
}
} else if (duration < 2400) { //거리가 2400이하면
for(long i = 0; i < 1000000; i=i+2552) { //라
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1137 - amp);
}
} else if (duration < 2800) { //거리가 2800이하면
for(long i = 0; i < 1000000; i=i+2552) { //시
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*1012 - amp);
}
} else if (duration < 3200) { //거리가 2300이하면
for(long i = 0; i < 1000000; i=i+2552) { //도
digitalWrite(piezoPin,1);
delayMicroseconds(amp);
digitalWrite(piezoPin,0);
delayMicroseconds(2*995 - amp);
}
}
}
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
// 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다.
digitalWrite(trigPin_right, HIGH);
delay(10);
digitalWrite(trigPin_right, LOW);
duration_right = pulseIn(echoPin_right, HIGH);
//아날로그 입력값의 범위로 바꿈
duration_right = constrain( map(duration_right, 0, 6000, 0, 1023), 0, 1023);
//아날로그 입력값의 범위로 바꿈
duration_right = constrain( map(duration_right, 0, 6000, 0, 1023), 0, 1023);
음량을 조절하기 위해서는 아날로그 입력 범위(0 ~ 1023)의 값이 필요합니다.
map, constrain함수를 통해 6000이하의 값을 0 ~ 1023 값의 범위로 바꿉니다.
void changeVolume() { amp = duration_right / 10; }
//거리에 따라 음 높이를 변화시키는 함수 void changeNote(float time, int amp) {
if((duration >0) && (duration < 400)) { //거리가 0이상 400이하면 for(long i = 0; i < 1000000; i=i+2552) { //도 digitalWrite(piezoPin,1); delayMicroseconds(amp); digitalWrite(piezoPin,0); delayMicroseconds(2*1911 - amp); }
kocoafab