초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

초음파 센서로 테레민(Theremin) 만들기

2015-01-20 15:59:02

개요

 

테레민이라는 악기를 들어보신 적이 있으신가요?

 

만약 들어보신 적이 없다면 아래의 영상을 먼저 봐주세요!

 



 
 
 
 
 
 
 
공중에서 손만 흔들었을 뿐인데 소리가 나는것이 신기하지 않나요??
 
테레민은 다른악기들과 다르게 음향적으로도 특이한 소리를 내는것이 특징이기도 합니다.
 
 

테레민은 러시아의 음향 물리학자이자 첼리스트이기도 한 테레민(Léon Theremin)이 개발한 악기로써 두 고주파 발진기의 간섭에 의해 생기는 소리를 이용하여 1920년에 발명한 전자악기 입니다. 

 
테레민에 달려있는 수직 안테나와 루프 안테나에 손을 가까이하여 각각의 거리로 음계를 구분하여 출력합니다.
 
 

 

 

 
 
 
 
 
 
이번 예제에서 초음파 거리 센서를 사용하여 초음파 거리 센서와 손과의 거리를 통해
음계를 출력하는 테레민을 만들어봅니다.
 

초음파 거리 센서는 테레민의 안테나 역할을 하게되고, 피에조부저는 스피커 역할을 하게 됩니다.
 




 

 

 

 

 

필요한 사전 지식

초음파 센서
가변 저항
피에조 부저

 

 

 

 

 

 

 

부품 목록

No 부품명 수량
1 오렌지 보드 1
2 초음파센서 1
3 피에조 부저 1
4 점퍼 케이블 11
5 브레드 보드 1

 

부품명 오렌지 보드 초음파 센서 피에조 부저 점퍼 케이블 브레드 보드
부품 사진

 

 

 

 

 

 

 

 

 

하드웨어 making

브레드보드

 

 

 

 

 

 

 

 

 

 

소프트웨어 coding

/*
 * site : Kocoafab.cc
 * date : 2018.06.01
 */

//모듈의 핀 번호 선언
int piezoPin = 3;
int echoPin = 13;
int trigPin = 12;

void setup() {
  //모듈 핀모드(pinMode) 선언
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(piezoPin, OUTPUT);
}

void loop() {
  digitalWrite(trigPin, LOW);
  digitalWrite(echoPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  unsigned long duration = pulseIn(echoPin, HIGH);

  float distance = duration / 29.0 / 2.0;

  
/*
 * 측정된 거리값을 사용하여 거리에 맞는 음계 출력(6옥타브 음계 출력)
 * 50cm 미만일 때 소리가 출력됩니다. 50cm를 초과하면 소리 X
 * 5cm간격으로 5, 10, 15, 20, 25씩 소리가 출력됩니다.
 */
  if (distance < 50) {
    if (distance <= 5) {
      tone(piezoPin, 1047);            //도
    } else if (distance <= 10) {
      tone(piezoPin, 1174);            //레     
    } else if (distance <= 15) {
      tone(piezoPin, 1318);            //미
    } else if (distance <= 20) {
      tone(piezoPin, 1396);            //파
    } else if (distance <= 25) {
      tone(piezoPin, 1567);            //솔
    } else if (distance <= 30) {
      tone(piezoPin, 1760);            //라
    } else if (distance <= 35) {
      tone(piezoPin, 1975);            //시
    } else if (distance <= 40) {
      tone(piezoPin, 2093);            //도
    }
  }
  else {
    noTone(piezoPin);
  }
  delay(100);
}

 

코드에서는 초음파 거리 센서에서 손과의 거리를 측정한 이 후에 거리값을 통해 5cm단위로 구분하여 tone()함수로 소리를 출력합니다.

 

 

 

 

 

 

 

 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

물공 2016-02-18 18:30:16

for(long i = 0; i < 1000000; i=i+2552)

여기 코드에서 왜 i에다가 2552를 매번 더해주는지 궁금합니다.
그리고 1000000는 왜 나온지도 궁금합니다.

심불석 2016-10-13 19:42:45

아니 도대체 왜 명령어 안되는거죠??

심불석 2016-10-13 19:42:47

아니 도대체 왜 명령어 안되는거죠??

신예주 2016-11-21 15:32:35

계속 같은 음만 나는데 이유가 뭘까요??ㅠㅠ