안녕하세요! 인투피온입니다.
마이크 증폭모듈 MAX 9814로 할 수 있는게 뭐가 있을지 생각하다
문득, 소리 무드등이 생각났습니다.
소리의 크기에 따라 LED가 변화하게 되는데
마이크 모듈로도 가능할 것 같아서 테스트 해보았습니다.
LED는 WS2812B 1x8 네오픽셀 모듈을 사용했습니다.
아두이노 우노( 소형화 -> 나노, 프로미니 사용 )
마이크 증폭모듈 GY-MAX9814
네오픽셀 8-WS2812-5050RGB MODLUE II
미니빵판(브레드보드 JD-107)
이렇게 사용합니다.
네오픽셀 LED를 보면 선 4가닥이 연결되어 있는데
실제로는 파란색 선은 없어도 되니 3개만 연결해도 됩니다.
우선 마이크 증목모듈이 정상적으로 동작하는지 테스트 해야 합니다!
마이크 증폭모듈 MAX9814
연결은 이렇게 하면 됩니다!
그럼 이제 코딩을 해봅시다.
코딩
12345678910111213141516171819202122232425262728293031323334353637383940414243 const int sampleWindow = 50; // 샘플링 시간(50 mS = 20Hz)unsigned int sample;void setup(){Serial.begin(9600);}void loop(){unsigned long startMillis= millis(); // 샘플링 시작unsigned int peakToPeak = 0; // 음성신호의 진폭unsigned int signalMax = 0; // 최대크기 초기값 0unsigned int signalMin = 1024; // 최소크기 초기값 1024int displayPeak = 0;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; // // 전압 단위로 변환 = 소리 크기로 변환Serial.print(" volts : ");Serial.println(volts);cs
이렇게 작성하고 업로드를 눌러주세요!
그 다음은 아두이노의 시리얼 플로터를 열어줍니다.
일단 마이크 모듈 동작은 확인되었습니다.
이제 네오픽셀 LED 모듈과 연계를 생각해봐야겠죠?
먼저 네오픽셀 동작은 아래 링크에서 확인 가능하다.
https://intopionshop.tistory.com/240
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 #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 maxScale = 8;void setup(){Serial.begin(9600);strip.begin();strip.setBrightness(50); // 네오픽셀 밝기}void loop(){strip.setPixelColor(0 , 0);unsigned long startMillis= millis(); // 샘플링 시작unsigned int peakToPeak = 0; // 음성신호의 진폭unsigned int signalMax = 0; // 최대크기 초기값 0unsigned int signalMin = 1024; // 최소크기 초기값 1024int displayPeak = 0;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, 200, 540, 0, maxScale); //진폭값 200~540 사이의 값을 0~maxScale 사이값으로 맵핑if(peakToPeak<200){displayPeak = 0;}else if(peakToPeak>540){displayPeak = N_LEDS+2;}Serial.print("peakToPeak : "); //peakToPeak 값과, 맵핑된 displayPeak 값 모니터링Serial.println(peakToPeak);Serial.print("displayPeak : ");Serial.println(displayPeak);for (uint16_t i = 0; i <= displayPeak ; i++) // 0번째 칸부터 정해진 displayPeak 값까지 led 출력{strip.setPixelColor(i, 255,5,200);strip.show();delay(10);}for (uint16_t j = N_LEDS ; j > displayPeak ; j--){strip.setPixelColor(j, 0);strip.show();delay(10);}}
마이크 증폭모듈의 값에 따라 LED 갯수를 정하고 출력하는 코드입니다.
밑줄 부분을 보면 'peakToPeak' 범위가 200~540으로 되어 있는데
이건 자신의 환경에 따라 수정하고 아래
if문의 peakToPeak 범위도 수정해주면 됩니다.
저는 기본값이 70~170 정도 유지되어 안전하게 200부터 display 표시값을 주었습니다.
실행하기
이렇게 소리 크기에 따른 LED를 출력해 보았습니다.
영롱한 빛을 내는 무드등 만들기였습니다!
포스팅에 나온 증폭 센서 구입하고 싶다면?
▼ ▼ ▼
전자부품 전문 쇼핑몰 인투피온입니다.
필요한 자재에 관한 문의는 홈페이지를 통한 견적 신청, 혹은 전화나 메일로 주시면 빠른 회신을 드릴 수 있도록 하겠습니다.
▶ 홈페이지: http://intopion.com/
▶ 전화: 02-2615-7278
▶ FAX : 02-6124-4242
▶ 메일: intopion@hanmail.net
'인투피온 강좌 > 아두이노 팁(Tip)' 카테고리의 다른 글
아두이노 SHT20 온습도센서 사용하기 (0) | 2022.01.24 |
---|---|
아두이노 토양 습도 체크하기 (0) | 2022.01.21 |
아두이노 심박 펄스센서 사용하기 (0) | 2022.01.21 |
아두이노 4x4 멤브레인 키패드 응용편 (0) | 2021.12.28 |
아두이노 4x4 멤브레인 키패드 사용하기 (0) | 2021.12.28 |