아두이노 사운드센서 데시벨 - adu-ino saundeusenseo desibel

아두이노중급

[아두이노] LED 볼륨 타워 만들기(소리감지센서)

1. 소리에 대하여

  소리는 공기의 진동을 통해 전달되는 파동이다. 진동이 공기를 통해 우리의 귀를 자극해서 듣게 되는 것이다. 소리 감지 센서(KY-038)는 이러한 공기의 진동을 인식하여 그에 따른 전압을 출력해 주는 센서이다. 이를 응용하여 소리를 감지하고 반응하는 프로젝트를 만들 수 있다.

  가. 소리의 크기

  • 소리의 크기는 dB(데시벨) 단위로 나타내고, 사람이 들을 수 있는 가장 작은 소리를 0dB로 하고, 숫자가 클수록 소리의 크기가 크다.
  • 소리의 세기는 파동의 진폭이 클수록 더 큰 소리가 난다.
  • 진폭 : http://terms.naver.com/entry.nhn?docId=1245429&cid=40942&categoryId=32235

  나. 소리의 높이

  • 소리의 높이는 hz(헤르츠) 단위로 나타내고, 초당 음의 진동수 즉 파형의 반복 횟수에 의해 결정된다. 1초당 파형의 반복 횟수가 많을수록 소리가 높고, 적을수록 소리가 낮다. 
  • 소리의 높이는 파동의 진동수가 클수록 파동의 모양이 촘촘해지고 높은 소리가 난다.
  • 진동수: http://terms.naver.com/entry.nhn?docId=1143084&cid=40942&categoryId=32237​

2. 소리 감지 센서

디지털 출력 센서

아날로그/디지털 출력 센서

-파워 LED

-센서인티케이트 LED

3. 회로구성

4. 프로그램

 void setup()
{
  Serial.begin(9600);
}

void loop()
{
  int p = analogRead(A0);
  Serial.println(p);
  delay(1000);
} 

  가. 시리얼 모니터에 출력하기

  나. 시리얼 플로터에 출력하기

  • 시리얼 값을 직렬 플로터 그래프 값으로 확인 가능

  • 값의 변화를 시각적으로 확 가능
  • 아두이노 IDE - [툴] - [시리얼 플로터]
  • y축은 시리얼 값, x축은 지나간 시간
  • 시리얼 모니터와 시리얼 플로터를 동시 사용은 안된다. 


[예제] 소리 크기에 따라 LED 밝기 조절하기

 void setup()
{
  pinMode(9, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int p = analogRead(A0);
  Serial.println(p);
  int p1 = p - 68;  // 68은 자신의 소리 감지 센서 기본값에 따라 적절하게 조절
  int i = map(p1, 0, 5, 0, 255); // 0~5의 p1값을 led 밝기 0~255값으로 매핑
  analogWrite(9, i);
  delay(50);
}
 

[도전과제] 나만의 LED 볼륨 타워(volume towers)를 제작해 보자.

  ▶ 참고 사이트

  • http://blog.naver.com/etsea/220972701728
  • http://www.instructables.com/id/How-to-Make-Arduino-VU-Meter-LED-Logo/

※ 배열(array) : 같은 자료형의 데이터들을 저장한 장소

 예) vu[4] = { 1, 2, 3, 4 }

 vu[0]

 vu[1]

 vu[2]

 vu[3]

 1

 2

 3

 4

▶ LED 개수 및 소리 감지 센서 기본값에 따라 붉은 색 부분을 수정하시오.

 int vu[12] = {2,3,4,5,6,7,8,9,10,11,12,13};
int p = 0;
int i = 0;

void setup()
{
    for (i = 0; i < 12; i++) {
      pinMode(vu[i], OUTPUT);
    }
    Serial.begin(9600);
}

void loop()
{
    p = analogRead(A0);
    Serial.println(p);
    p = p - 68;
       
    if(p < 13)
    {
      if (p == 0)
       {
          for(i = 0; i < 12; i++) {
            digitalWrite(vu[i], LOW);
          }
        }
      else
      {
          for (i = 0; i < p; i++)
          {
            digitalWrite(vu[i], HIGH);
            delay(5);
          }
         
          for(i = i; i < 12; i++)
          {
            digitalWrite(vu[i], LOW);
          }
       }
    }
}

 // LED 개수만큼 배열 지정, 핀 번호 선언

 // LED 개수만큼 핀 모드 출력으로 지정

 // 자신의 소리 감지 센서 기본값에 따라 적절하게 조절

 // p 값이 0이면 LED를 모두 끈다.

 // p 값이 0이 아니면,

 // p 개수만큼 LED를 켰다가,

 //  LED를 모두 끈다.