아두이노 오디오 주파수 감지기 - 고감도 사운드 모듈로 최대 음량 피크 주파수 측정
부품 및 소모품
| 아두이노 우노 |
1개 |
| DEVMO 고감도 사운드 감지 모듈 |
1개 |
| 무납 브레드보드 풀사이즈 |
1개 |
| 컴퓨터 |
1대 |
| USB A-B 케이블 |
1개 |
| 점퍼 와이어 |
1세트 |
프로젝트 개요
이 프로젝트는 사운드 감지 모듈이 감지한 소리 중 가장 큰 음량의 주파수를 아두이노로 측정해 시리얼 모니터에 표시합니다.
작동 원리
- 사운드 모듈의 아날로그 출력을 아두이노 A0 핀에 연결
- 아날로그 신호를 샘플링하여 디지털화 (양자화)
- 디지털 데이터에 고속 푸리에 변환(FFT) 수행
- FFT 결과(주파수 영역)에서 최대 진폭을 가진 주파수(피크) 탐색
- 시리얼 모니터(115200 baud)로 결과 출력
아두이노 우노의 메모리 제약으로 FFT 샘플 수는 최대 128포인트(2의 거듭제곱)로 제한됩니다. 샘플링 주파수는 2048Hz로, 나이퀴스트 이론에 따라 최대 1024Hz까지 측정 가능합니다.
코드
arduinoFFT.h 라이브러리 필요 (라이브러리 매니저에서 설치)
#include "arduinoFFT.h"
#define SAMPLES 128 // FFT 포인트 수 (2의 거듭제곱, 우노 최대 128)
#define SAMPLING_FREQUENCY 2048 // 샘플링 주파수 (Hz)
arduinoFFT FFT = arduinoFFT();
unsigned int samplingPeriod;
unsigned long microSeconds;
double vReal[SAMPLES];
double vImag[SAMPLES];
void setup() {
Serial.begin(115200);
samplingPeriod = round(1000000 * (1.0 / SAMPLING_FREQUENCY)); // 마이크로초 단위 주기
}
void loop() {
// 1. 샘플링
for (int i = 0; i < SAMPLES; i++) {
microSeconds = micros();
vReal[i] = analogRead(A0); // A0 읽기
vImag[i] = 0; // 허수부는 0
// 샘플링 주기 대기
while (micros() < (microSeconds + samplingPeriod)) {
// busy wait
}
}
// 2. FFT 수행
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); // 해밍 윈도우
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD); // FFT 계산
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES); // 복소수 → 크기
// 3. 피크 주파수 탐색 및 출력
double peak = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY);
Serial.println(peak); // 가장 강한 주파수 출력 (Hz)
// 4. 1회만 실행 후 정지 (하드웨어 리셋 필요)
while (1);
}
회로도
사운드 모듈 VCC → 5V, GND → GND, OUT → A0
상세 회로도는 첨부 이미지 참조
참고 사항
- 이 프로젝트는 단일 주파수(가장 큰 소리)만 감지합니다. 스펙트럼 분석이 필요하면 샘플 수 늘리거나 ESP32 등 고성능 보드 권장
- 자세한 설명은 작성자 블로그 참조
- 후속 프로젝트도 확인해 보세요