지니어스키트 학습가이드

아두이노 시작의 첫단계, 기본은 충실하게, 그러나 가볍게!!

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

2015-01-20 15:59:02

개요

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




이 예제에서는 초음파 거리 센서를 사용하여 테레민을 만들려고 합니다.
초음파 거리 센서 1개와 가변 저항을 사용하여 하나는 음 높이를 바꾸는 용도로 사용하고 
다른 하나로는 음량 조절용도로 사용합니다.





필요한 사전 지식

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


부품 목록

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

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

하드웨어 making

브레드보드



전자회로도




소프트웨어 coding

//핀 번호 선언
int analogPin = A0; 
int piezoPin = 3; 
int echoPin = 12;
int trigPin = 13;

//변수 선언 int volumeLevel, distance; float duration; int amp = 0; void setup(){
//핀모드 선언 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(piezoPin, OUTPUT); } void loop(){ digitalWrite(trigPin, HIGH); delay(10); digitalWrite(trigPin, LOW); // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다. duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다. distance = ((float)(340 * duration) / 10000) / 2; //왕복시간을 통해 거리를 계산 int sensorReading = analogRead(analogPin); volumeLevel = map(sensorReading, 0, 1023, 0, 255); //음량과 음 높이를 변화시키는 함수 호출 changeVolume(); changeNote(duration, amp); delay(100); } //거리에 따라 음량을 변화시키는 함수 void changeVolume() { amp = volumeLevel / 10; } void changeNote(float time, int amp) { if((distance >0) && (distance <= 5)) { //거리가 0이상 5이하면 intervals(1910); } else if(distance <= 10 ){ //거리가 10이하면 intervals(1703); } else if(distance <= 15) { //거리가 15이하면 intervals(1517); } else if (distance <= 20) { //거리가 20이하면 intervals(1432); } else if (distance <= 25) { //거리가 25이하면 intervals(1276); } else if (distance <= 30) { //거리가 30이하면 intervals(1137); } else if (distance <= 35) { //거리가 35이하면 intervals(1012); } else if (distance <= 40) { //거리가 40이하면 intervals(995); } }
//거리에 맞게 음을 출력해 주는 함수 void intervals(int scale) { for(long i = 0; i < 1000000; i=i+2552) { digitalWrite(piezoPin,1); delayMicroseconds(amp); digitalWrite(piezoPin,0); delayMicroseconds(2*scale - amp); } }

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

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