프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

초음파 거리 센서로 테레민만들기

2014-09-01 14:24:25

개요

테레민이라는 악기를 아시나요?

테레민은 두 고주파 발진기의 간섭에 의해 생기는 소리를 이용하여 발명한 신시사이저 악기입니다.
가상의 줄 하나가 있다고 볼 수 있고 한 손으로는 높이, 한 손으로는 음의 세기를 조절한다고 생각하시면 됩니다.

본 프로젝트는 초음파 거리 센서를 사용하여 테리민을 만들려고 합니다.
초음파 거리 센서 2개를 사용하여 하나는 음량 조절용으로 사용하고 
다른 하나로는 음 높이를 바꾸는 용도로 사용합니다.

출처 : www.ezdenki.com

미리보기 동영상

시작 전 개념이해하기

부품목록

NO
부품명
수량 
1
아두이노 보드 우노
1
2
초음파 거리 센서
2
3
피에조 부저
1
4
점퍼 케이블
15
5
브레드보드
1


부품명 아두이노 보드 우노 초음파 거리 센서 피에조 부저 점퍼 케이블 브레드 보드
부품사진 X1 X2 X1 X15 X1


하드웨어 Making

회로도

브레드보드 레이아웃

 

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

/*
초음파 거리 센서로 테레민 만들기
이 스케치는 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); } } }

소프트웨어&하드웨어 설명

1. 스케치 설명


  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);

왼쪽에 있는 초음파 거리 센서에서 echo 핀이 HIGH 였던 시간을 pulseln함수를 통해 받아옵니다.
이 값을 duration이라는 변수에 저장합니다. duration은 나중에 음 높이를 변화시킬 때 사용할 것입니다.

똑같이 오른쪽 초음파 거리 센서에서도 값을 받아와 duration_right에 저장합니다.
이 값은 음량을 변화시킬 때 사용할 것입니다.
초음파 거리 센서의 동작원리를 자세히 알고 싶으시면 이 링크를 참고하세요.

//아날로그 입력값의 범위로 바꿈
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); }
거리의 범위는 바꾸셔도 됩니다.
또 더 먼 거리에 더 높은 옥타브를 추가하셔도 됩니다.
0에서 400이상에 거리에 있을 경우 도라는 음이 1초동안 나옵니다.

amp를 통해 디지털 출력이 1,0인 상태의 비율을 조절해서 음량을 조절합니다.
자세한 원리가 궁금하신 분은 이 링크를 참고하세요.

기술문서

  • 부품목록
  • 브레드보드 레이아웃
  • 회로도
  • 스케치



kocoafab

테레민, 초음파 거리 센서, 음 높이 바꾸기, 음량 바꾸기