본문 바로가기
프로세싱+아두이노+안드로이드

아두이노 사운드 센서 사용해보기!

by YJHTPII 2022. 5. 14.
반응형

https://blog.naver.com/PostView.naver?blogId=roboholic84&logNo=220801048809 

 

아두이노 사운드 센서 사용해보기!

안녕하세요 메카솔루션입니다. 이번에는 아두이노 사운드 센서에 대해 집중적으로 알아보고자 합니다.사운...

blog.naver.com

 

일부 소스코드 중복:

https://yjhtpi.tistory.com/141

 


이번에는 아두이노 사운드 센서에 대해 집중적으로 알아보고자 합니다.

 
사운드 센서란 무엇일까?

사운드 센서는 이름과 같이 소리를 감지하여 측정을 하는 센서를 의미합니다.

이러한 소리를 감지하는 소자로 가장 많이 사용되는 것이 마이크 이지요

사운드 센서가 사용되는 예


전화기에서는 마이크를 통해 자신의 목소리를 상대방에게 전달할 수 있으며,
소음측정기 등의 장치는 주위 소음의 크기 등을 측정할 수 있습니다.

 
 
다양한 사운드 센서들

 

위의 다양한 사운드센서들은 모두 마이크를 포함하고 있고, 이를 증폭하거나, 아니면 증폭하지 않고 바로 아두이노에 연결되어 신호를 출력합니다.

신호를 증폭하는 모듈의 경우, 소리를 읽어들이는 감도가 높고 그렇지 않은 모듈 등은 감도가 낮은 편입니다.

청각 신호는 기본적으로 아날로그 전압 신호로 출력이 되기 때문에 아두이노의 아날로그 핀 등을 통해서 측정이 됩니다.

아두이노의 아날로그 입력 판들

 

아두이노 아날로그 핀에 대해서 간략하게 설명하고 넘어가자면, 
GND~VCC(5V) 범위 내의 전압을 디지털 정보로 변화한다 하여 ADC(analog digital converter)이라고 부릅니다.
그리고 ADC의 분해능은 GND ~ VCC의 범위를 얼마나 세밀하게 구분할 수 있는지에 대한 성능을 의미합니다.
아두이노의 아날로그 핀의 분해능은 10bit로 GND~VCC를 1024단계로 구분할 수 있다는 것입니다.

 

 
청각 신호에 대해 알아보기

청각 신호에는 우리들의 목소리나. 주위 소음 등이 담겨있지만 수치적으로 바라보게 된다면 대표적으로 두 가지 정보를 얻을 수 있습니다.

바로 소리의 크기 (dB) 와 음의 높낮이(Hz)

음성신호

위의 음성신호를 본다면 신호들이 반복적으로 떨리고 있음을 알 수 있습니다.

그렇다면 신호가 떨리고 있을 때 떨리는 주기가 음의 높낮이가 되며
떨리는 폭이 소리의 크기가 되는 것이지요.

 
아두이노에서 청각 신호로 데이터 받아보기

대부분의 사운드센서들은 회로와 소스코드가 동일하기 때문에 특정 센서 모듈을 지목하거나 하지는 않습니다.


청각 신호에는 음의 높낮이와, 소리의 크기가 있다고 설명드렸지만 음의 높낮이를 구분하는 것은 주파수를 구분하는 과정이 아두이노 성능으로는 부족하기에 제외되고

진폭을 계산하는 소리의 크기를 예제로 실행해보도록 하겠습니다. 

// 예제에 있는 코드를 사용했습니다.
/****************************************
Example Sound Level Sketch for the 
Adafruit Microphone Amplifier
****************************************/

const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;

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


void loop() 
{
   unsigned long startMillis= millis();  // Start of sample window
   unsigned int peakToPeak = 0;   // peak-to-peak level

   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;

   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  // save just the max levels
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  // save just the min levels
         }
      }
   }
   peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
   double volts = (peakToPeak * 5.0) / 1024;  // convert to volts

   Serial.println(volts);
}
시리얼 플로터 출력으로 소리의 크기에 대한 그래프를 볼 수 있습니다. 

 

 
반응형

댓글