본문 바로가기

메이킹/아두이노

부저 활용하기(초음파 센서-에어피아노)

반응형

오늘은 초음파센서를 활용하여 부저를 제어하는 방법에 대해 알아보겠습니다.

 

초음파센서로 거리를 측정하여 거리에 따라 다른 음이 나오도록 부저의 주파수를 조정하도록 하겠습니다.

 

준비물

- 아두이노 우노

- 수동형 부저

- 브레드 보드

- 점퍼선

- 초음파 센서

 

1) 초음파센서로 부저 제어하기

회로도

 

소스코드

#define Trig 5		//Trig에 연결하는 핀 설정
#define Echo 6		//Echo에 연결하는 핀 설정
#define Buzz 11		//Buzz에 연결하는 핀 설정

//아래는 부저의 음계를 설정하는 코드
#define Do 261	// 도
#define Re 293	// 레
#define Mi 329	// 미
#define Pa 349	// 파
#define Sol 392	// 솔
#define Ra 440	// 라
#define Si 493	// 시
#define Do2 523	// 도

void setup() {
  Serial.begin(9600);			//시리얼 통신 시작
  pinMode(Trig, OUTPUT);		//Trig 핀은 초음파를 쏘아내는 핀이므로 출력 핀으로 설정
  pinMode(Echo, INPUT);			//Echo 핀은 초음파를 받아들이는 핀이므로 입력 핀으로 설정
  pinMode(Buzz, OUTPUT);		//Buzz 핀은 출력하는 핀으로 설정                  
}

void loop()
{
  long duration, distance;
  
  digitalWrite(Trig, LOW);	//Trig 핀을 초기화합니다.
  delayMicroseconds(2);		//2마이크로초만큼 대기합니다.
  digitalWrite(Trig, HIGH);	//Trig핀을 이용해 초음파를 쏩니다.
  delayMicroseconds(5);		//5마이크로초만큼 대기합니다.
  digitalWrite(Trig, LOW);	//Trig 핀을 초기화합니다.
  
  //초음파가 반사되어 돌아온 시간을 변수 duration에 저장합니다.
  //이때 시간의 단위는 마이크로초(ms)입니다.
  duration = pulseIn (Echo, HIGH); 
  
  //(물체까지의 거리) = (초음파가 반사되어 돌아온 시간) x 340 / 2 / 10,000
  //음파의 속력은 340m/s = 34,000cm/s
  //물체까지의 거리는 왕복값이 아니라 편도 값으로 계산해야하므로 2를 나눠줍니다.
  //마이크로초를 초(s)로 변환하기 위해 10,000을 나눠줍니다.
  //1초는 1,000,000마이크로초입니다.
  //아래 코드는 cm 기준으로 작성한 코드입니다.
  distance = duration * 17 / 1000;
  
  //시리얼모니터에 distance 값을 출력합니다.
  Serial.print("Distance : ");
  Serial.print(distance); 
  Serial.println("cm");
  
  //0.3초의 딜레이를 줍니다.
  //아두이노의 delay()함수는 밀리세컨드(ms) 기준이므로 1초의 딜레이를 주기 위해서는 1,000의 값을 줘야합니다.
  delay(300);

  //거리에 따라 부저의 음계를 설정합니다.
  if (distance >= 1 && distance <= 5)   {
    tone(Buzz, Do, 250);
    delay(500);
    noTone(Buzz);			//noTone()함수를 이용해 부저를 끕니다.
   }
   else if (distance >= 7 && distance <= 9)   {
    tone(Buzz, Re, 250);
    delay(500);
    noTone(Buzz);
   }   
   else if (distance >= 10 && distance <= 13)   {
    tone(Buzz, Mi, 250);
    delay(500);
    noTone(Buzz);
   }   
   else if (distance >= 14 && distance <= 16)   {
    tone(Buzz, Pa, 250);
    delay(500);
    noTone(Buzz);
   }  
   else if (distance >= 17 && distance <= 19)   {
    tone(Buzz, Sol, 250);
    delay(500);
    noTone(Buzz);
   }
   else if (distance >= 20 && distance <= 22)   {
    tone(Buzz, Ra, 250);
    delay(500);
    noTone(Buzz);
   }
   else if (distance >= 23 && distance <= 26)   {
    tone(Buzz, Si, 250);
    delay(500);
    noTone(Buzz);
   }
   else if (distance >= 27 && distance <= 29)   {
    tone(Buzz, Do2, 250);
    delay(500);
    noTone(Buzz);
   }
   //조건이 충족되지 않는다면 아래 명령어를 실행합니다.
   else   {
    noTone(Buzz);
   }
   
}

-tone(핀번호, 소리주파수, 소리지속시간)함수를 이용해 음을 울립니다.
-지속시간은 ms기준입니다.

-noTone() : 부저 소리 끄기

반응형