인투피온 강좌/아두이노 팁(Tip)

아두이노 매뉴얼 [소리감지 LED 키트] - 3

인투피온 2022. 7. 28. 10:00

(이미지 클릭시 구매할 수 있는 링크로 이동됩니다)

 

 

오늘은 소리감지 LED 키트인

Hear & Light 키트에 대해서 알아보는 마지막 시간입니다.

 

 

 

소리감지 LED 키트 매뉴얼을 1&2편 보지 않으신 분들은

아래 링크를 통해 순서대로 따라해주시기 바랍니다.

 

▼  ▼  ▼

 

[소리감지 LED] 매뉴얼 2편

https://intopionshop.tistory.com/507?category=1021753 

 

[소리감지 LED] 매뉴얼 1편

https://intopionshop.tistory.com/506?category=1052256 

 

아두이노 매뉴얼 [소리감지 LED 키트] - 1

오늘은 소리감지 LED 키트인 Hear & Light 키트에 대해서 알아보도록 하겠습니다! MAX9814 마이크 증폭 모듈과 네오픽셀 WS2812B LED 모듈을 활용해 소리의 크기에 따라 LED 를 출력하는 키트입니다. 동영

intopionshop.tistory.com

 

 

 

Chapter 3. LED

 

 

이제 챕터 1 과 2 에서 한 것들을 종합하여

소리의 크기를 LED 로 표시해 보겠습니다.

 

 

MAX9814 + 네오 픽셀 LED

 

 

 

MAX9814 + 네오 픽셀 LED

 

 

 

 

MAX9814 + 네오 픽셀 LED

 

#include <Adafruit_NeoPixel.h>
#define PIN 6  // DI 핀번호
#define N_LEDS 16 // 네오픽셀 LED 갯수
 
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(N_LEDS, PIN, NEO_GRB + NEO_KHZ800);  
//NEO_GRB <= 네오픽셀 타입 ,  NEO_KHZ800 <= 클럭 주파수
 
const int sampleWindow = 50// 샘플링 시간(50 mS = 20Hz)
unsigned int sample;
int displayPeak = 0;
int C = 0;
 
void setup() 
{
   Serial.begin(9600);
   strip.begin();  // 네오픽셀 시작
   strip.setBrightness(50);   // 네오픽셀 밝기
}
 
   
void loop() 
{
  strip.setPixelColor(0 , 0);
  
  int R = 0;
  int G = 0;
  int B = 0;
  int C = 0;
  
  data();
  R = 255;
  G = 0;
  for (int B = 0; B < 156 ; B+=50) {
    chase(strip.Color(R, G, 0));
    R -= 50;
    G += 50;
  }
  data();
  R = 105;
  G = 150;
  for (int B = 150; B < 256 ; B+=50) {
    chase(strip.Color(R, G, 0));
    R -= 50;
    G += 50;
  }
 
  
  data();
  G = 255;
  B = 0;
  for (int R = 0; R < 156 ; R+=50) {
    chase(strip.Color(0, G, B));
    G -= 50;
    B += 50;
  }
  data();
  G = 105;
  B = 150;
  for (int R = 150; R < 256 ; R+=50) {
    chase(strip.Color(0, G, B));
    G -= 50;
    B += 50;
  }
 
  
  data();
  B = 255;
  R = 0;
  for (int G = 0; G < 156 ; G+=50) {
    chase(strip.Color(R, 0, B));
    B -= 50;
    R += 50;
  } 
  data();
  B = 1055;
  R = 150;
  for (int G = 150; G < 256 ; G+=50) {
    chase(strip.Color(R, 0, B));
    B -= 50;
    R += 50;
  } 
  
}
 
 
 
static void chase(uint32_t c) {
  for (uint16_t i = 0; i < displayPeak; i++) {
    strip.setPixelColor(i  , c); // i 번째 픽셀에 LED 색상 지정
    strip.show();
    delay(7);
  }
  for (uint16_t j =  N_LEDS ; j > displayPeak ; j--) {  
 
    strip.setPixelColor(j, 0);
    strip.setPixelColor(j-10);
    strip.show();
    delay(7);
  }
}
 
void data(){
  unsigned long startMillis= millis();  // 샘플링 시작
  unsigned int peakToPeak = 0;   // 음성신호의 진폭
  unsigned int signalMax = 0;    // 최대크기 초기값 0
  unsigned int signalMin = 1024// 최소크기 초기값 1024
  
   while (millis() - startMillis < sampleWindow){ // 50ms 마다 데이터 수집
      sample = analogRead(0);  // 마이크 증폭 모듈로부터 받아오는 아날로그 값 저장
      if (sample < 1024){  // 값이 1024 보다 작을때
         if (sample > signalMax){ // 0보다 크면
            signalMax = sample;  // signalMax에 저장
         }
         else if (sample < signalMin){ // 1024보다 작으면
            signalMin = sample;  // signalMin에 저장
         }
      }
   }
   
   peakToPeak = signalMax - signalMin;  // 최대- 최소 = 진폭값
   double volts = (peakToPeak * 5.0/ 1024;  // // 전압 단위로 변환 = 소리 크기로 변환
   displayPeak = map(peakToPeak, 1505000, N_LEDS); // 범위는 테스트를 통해 최소 최대값으로 설정
 
   if(peakToPeak<150){ // peakToPeak 값이 150보다 작을경우 LED를 출력하지 않음
      displayPeak = 0;  
   }
   else if(peakToPeak>500) { //peakToPeak 값이 500보다 클경우 LED를 최대로 출력함
      displayPeak  = N_LEDS+1;
   }
 
  
}

 

 

 


chase() 함수

 

static void chase(uint32_t c) {
  for (uint16_t i = 0; i < displayPeak; i++) {
    strip.setPixelColor(i  , c); // i 번째 픽셀에 LED 색상 지정
    strip.show();
    delay(7);
  }
  for (uint16_t j =  N_LEDS ; j > displayPeak ; j--) {  
 
    strip.setPixelColor(j, 0);
    strip.setPixelColor(j-10);
    strip.show();
    delay(7);
  }
}

 

첫번째 for 문은 LED 를 displayPeak 아래까지 출력합니다.

두번째 for 문은 맨 위에서부터 displayPeak 까지 지원하게 됩니다.

 

이 함수가 LED 를 오르락내리락 하게 해주는데 그 속도는

각 for 문의 delay(); 를 조절하면 됩니다.

 

만약 LED의 반응을 빠르게 하고 싶다면 본문의 data, chase 함수에 설정된

LED 값을 단색으로 변경해주세요.

 

 

 

 

 

 


 

data() 함수

 

기존 MAX9814 소스 코드의 샘플링 코드를 가지고 LED 출력 개수를 정합니다.

 

1
2
3
4
5
6
7
8
9
10
displayPeak = map(peakToPeak, 150, 500, 0, N_LEDS);
 
if(peakToPeak<150)
{
   displayPeak = 0;  
}
else if(peakToPeak>500) 
{
   displayPeak  = N_LEDS+2;  
}
 
 

 

먼저 측정한 peakToPeak 값을 기준으로 displayPeak(LED 출력 개수)를 정하게 됩니다.

peakToPeak 의 150 부터 500 까지 값들을 LED 개수에 따라 매핑하도록 되어있습니다.

저는 주변 소음이 150 미만으로 발생해 150보다 작을 경우 LED 를 0 개로 정했고,

노래를 틀었을 때 최대가 500에 가까워 500을 넘을 경우 최대치로 출력하게 했습니다.

 

 

소리감지 LED 영상

 

아두이노 우노와 마이크 증폭모듈 네오픽셀 모듈을 이용

 

 


전자부품 전문 쇼핑몰 인투피온입니다.
필요한 자재에 관한 문의는 홈페이지를 통한 견적 신청, 혹은 전화나 메일로 주시면 빠른 회신을 드릴 수 있도록 하겠습니다.

▶ 홈페이지: http://intopion.com/
▶ 전화: 02-2615-7278
▶ FAX : 02-6124-4242
▶ 메일: intopion@hanmail.net