概要
マイクロフォン(マイク)は音波(空気の疎密波)を電気信号に変換する入力デバイスです。スピーカー(ラウドスピーカー)はその逆で、電気信号を音波に変換する出力デバイス(アクチュエータ)です。
組み込みシステムで使われる主なマイクの種類は以下の通りです。
- アナログECMマイク(Electret Condenser Microphone): コンデンサーマイクの一種で、FETを内蔵しアナログ電圧を出力。安価で広く普及。ADCで読み取る。
- デジタルPDMマイク(Pulse Density Modulation): MEMSマイクの一般的な出力形式。CLK信号に同期した1bitのパルス列でデータを出力(例:SPH0645、MP34DT05)。マイコンのPDMペリフェラルやI2Sで受信。
- I2Sデジタルマイク: PDMよりも直接的なPCM(パルス符号変調)で数値データを出力。I2Sバスで接続。品質が高い。
スピーカーの駆動にはアンプ回路が必要です。組み込みでは以下が使われます。
- DAC + アナログアンプ(Class D等): PWMやDACで生成したアナログ信号を増幅。
- I2Sデジタルアンプ(Class Dアンプ内蔵IC): MAX98357A、PAM8302等がI2Sデジタル入力を直接受け取り、スピーカーを駆動。
- PWMブザー: 圧電ブザーにPWM信号を直接印加するシンプルな方式。
歴史・背景
マイクロフォンの発明は1876年頃、アレクサンダー・グラハム・ベルとエミール・ベルリナーに帰せられます(電話の発明と並行して発展)。初期の炭素粒マイク(カーボンマイク)は、電話に使われましたが品質は低いものでした。
コンデンサーマイクは1916年にE.C.Wenteによって発明され、1930〜40年代にスタジオ録音の標準となりました。エレクトレットコンデンサーマイク(ECM)は1964年にベル研究所で開発され、恒久的な電荷を保持するエレクトレット材料を使うことでバイアス電源が不要になり、小型・低コスト化が実現しました。
MEMSマイクは2000年代初頭から量産が始まり、2000年代後半にはスマートフォンへの採用が広がりました。シリコンウェハ上に音響キャビティとダイアフラムを作り込み、回路チップと一体化したMEMSマイクは超小型・低消費電力を実現し、現代のスマートフォン・スマートスピーカー・補聴器の標準デバイスとなっています。
スマートスピーカー(Amazon Echo: 2014年、Google Home: 2016年)の登場により、音声認識インターフェースが一般化し、組み込み機器へのマイク搭載が急増しました。
技術仕様
マイクロフォンの比較
| 種類 | 原理 | 出力形式 | 感度 | 周波数応答 | 価格 | 代表例 |
|---|---|---|---|---|---|---|
| ECMアナログ | エレクトレット静電容量 | アナログ電圧 | 中 | 20Hz〜20kHz | 安価 | WM-61A |
| MEMSアナログ | シリコンMEMS静電容量 | アナログ電圧 | 高 | 20Hz〜20kHz | 中 | ADMP401 |
| MEMSデジタル(PDM) | MEMS+ΔΣ変調 | 1-bitパルス列 | 高 | 20Hz〜20kHz | 中 | SPH0645, MP34DT05 |
| I2Sデジタル | MEMS+ADC内蔵 | I2S PCMデータ | 高 | 20Hz〜20kHz | 中〜高 | ICS-43434 |
| コンデンサーマイク | 外部電荷バイアス | アナログ | 非常に高い | 20Hz〜40kHz | 高価 | スタジオ用 |
スピーカー・ブザーの比較
| 種類 | 原理 | 用途 | 出力 | I/F |
|---|---|---|---|---|
| ダイナミックスピーカー | ボイスコイル電磁力 | 音楽・音声再生 | 0.1〜数W | アナログ(アンプ必要) |
- 圧電ブザー(受動型): 圧電素子に交流印加 | 単音警報・ビープ | 数十〜数百mW | PWM直接駆動可 |
- 圧電ブザー(能動型): 発振回路内蔵 | 単音警報 | DC直結でON/OFF | GPIO直接 | | I2Sデジタルアンプ | Class Dアンプ | 音楽・音声 | 3〜5W | I2S(デジタル) |
主要スペック(MEMSマイク SPH0645の例)
| パラメータ | 値 |
|---|---|
| 感度 | -26 dBFS(±1dB) |
| クロック周波数 | 1.024〜3.072 MHz |
| SNR | 65 dBA |
| THD(全高調波歪率) | 0.031%(104 dBSPL時) |
| AOP(Acoustic Overload Point) | 120 dBSPL |
| 周波数応答 | 20Hz〜20kHz |
| インターフェース | I2S(PDM出力) |
| 動作電圧 | 1.62〜3.6V |
| 電流消費 | 600μA(動作時)/ 9μA(スリープ) |
動作原理
ECMマイクの動作原理
エレクトレットコンデンサーマイクは、薄い金属蒸着膜(バックプレート)と振動板(ダイアフラム)の間の静電容量変化を電圧変化として取り出す構造です。
ECMマイクの等価回路:
Vbias(1.5〜10V)
|
[R_bias](2.2〜10kΩ)
|
音波 → ダイアフラム変位 → 静電容量変化 C(t)
C(t) = ε₀×A/(d ± Δd(t))
電圧変化: ΔV = Q/C(t)(Q=一定電荷)
≈ V_bias × Δd/d(微小変位の近似)
内蔵FETでインピーダンス変換して出力
MEMSマイクの構造
MEMSマイクの断面(模式図):
音響孔(メッシュ)
┌─────────────┐
│ ダイアフラム │ ← シリコン薄膜(厚さ数μm)
│ │
│ バックキャビティ │ ← エッチングで形成した空気室
│ │
│ バックプレート │ ← 参照電極(固定)
└─────────────┘
IC(ASIC)チップと積層またはワイヤーボンド接続
ΔC = ε₀ × A × Δd / d²
ASIC内のΔΣADCでC変化を量子化 → PDMまたはPCM出力
PDM(Pulse Density Modulation)とI2S
PDM信号の概念:
音声信号(アナログ)をΔΣ変調した1-bitパルス列
・パルス密度が高い = 振幅が大きい
・パルス密度が低い = 振幅が小さい
例(64倍オーバーサンプリング):
目標サンプリングレート: 48kHz
PDMクロック: 48kHz × 64 = 3.072 MHz
1ビット@3.072MHz → デシメーションフィルタ → 16bit PCM @ 48kHz
I2Sプロトコル(Inter-IC Sound):
・3本のライン: BCLK(ビットクロック), LRCLK(チャンネル選択), DATA
・PCM(16/24/32bit)データをシリアル転送
・48kHz/16bit/ステレオ の帯域: 48000 × 16 × 2 = 1.536Mbps
Class Dアンプの原理
PWMベースClass Dアンプ:
アナログ入力 → PWMコンパレータ → ハーフブリッジスイッチング → LCフィルタ → スピーカー
効率計算:
理想的なClass Dの電力効率: ≈ 90〜95%
(Class A: 25%, Class AB: 50〜70% と比較して高効率)
I2S入力Class Dアンプ(MAX98357A):
I2S PCMデータ → 内蔵DAC → PWMコンパレータ → MOSFET H-Bridge → スピーカー
出力: 3.2W(5V, 4Ω)
用途・ユースケース
音声認識・スマートスピーカー
Amazon Alexa、Google Assistant等の音声インターフェースは、PDMマイク(複数個のマイクアレイ)でキーワード検知(Wake Word Detection)を常時低消費電力で実施します。ESP32等にも音声認識ライブラリ(ESP-SR、TensorFlow Lite Micro)があります。
ドアベル・インターホン
玄関のマイク・スピーカーをWi-Fi経由でスマートフォンと接続し、リアルタイム双方向通話を実現するスマートドアベル(Ring、Arlo等)。
騒音計・音響測定
Raspberry Pi+デジタルマイクで環境騒音を連続計測するIoTセンサー。工場・道路・騒音規制区域のモニタリングに使われます。
産業用異常検知
モーター・ポンプ・工作機械の動作音や振動音を常時計測し、周波数特性の変化から異常(軸受け劣化、不均衡等)を早期検知する予知保全システム。
小型音声ガイドシステム
博物館・観光地の音声ガイド端末や、商業施設のアナウンスシステムに小型スピーカーと音声データの組み合わせを使います。DACまたは音声合成ICで音声を再生します。
聴覚障害者支援・補聴器
超小型MEMSマイク+DSP(Digital Signal Processor)+レシーバー(骨伝導or小型スピーカー)を組み合わせた補聴器。デジタル信号処理でノイズ低減・方向強調を行います。
実装・開発のポイント
ESP32でPDMマイク(I2S)読み取り
#include "driver/i2s.h"
#include <Arduino.h>
// I2S + PDMマイク(INMP441等)の設定
#define I2S_WS 15 // LRCLK
#define I2S_SCK 14 // BCLK
#define I2S_SD 32 // DATA
void setup_i2s_microphone() {
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = 44100,
.bits_per_sample = I2S_BITS_PER_SAMPLE_32BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, // モノラル
.communication_format = I2S_COMM_FORMAT_STAND_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 64,
.use_apll = false,
};
i2s_pin_config_t pin_config = {
.bck_io_num = I2S_SCK,
.ws_io_num = I2S_WS,
.data_out_num = I2S_PIN_NO_CHANGE,
.data_in_num = I2S_SD
};
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL);
i2s_set_pin(I2S_NUM_0, &pin_config);
}
void read_audio(int32_t *samples, size_t count) {
size_t bytes_read;
i2s_read(I2S_NUM_0, samples, count * sizeof(int32_t),
&bytes_read, portMAX_DELAY);
// 32bit中24bitが有効データ(右寄せ)なので18bitシフト
for (size_t i = 0; i < count; i++) {
samples[i] >>= 14;
}
}
Raspberry Piでの音声録音・再生(Python)
import sounddevice as sd
import soundfile as sf
import numpy as np
# サンプリング設定
SAMPLE_RATE = 44100
CHANNELS = 1
DURATION = 5 # 秒
# 録音
print("録音中...")
recording = sd.rec(int(DURATION * SAMPLE_RATE),
samplerate=SAMPLE_RATE,
channels=CHANNELS,
dtype='int16')
sd.wait() # 録音完了まで待機
print("録音完了")
# WAVファイル保存
sf.write('output.wav', recording, SAMPLE_RATE)
# 再生
data, fs = sf.read('output.wav')
sd.play(data, fs)
sd.wait()
簡易FFTによる周波数解析
import numpy as np
from scipy.fft import fft, fftfreq
import sounddevice as sd
SAMPLE_RATE = 44100
BUFFER_SIZE = 4096
def analyze_frequency():
"""マイクから取得した音声の周波数スペクトルを表示"""
audio = sd.rec(BUFFER_SIZE, samplerate=SAMPLE_RATE,
channels=1, dtype='float32')
sd.wait()
audio = audio.flatten()
# FFT計算
fft_data = fft(audio)
freqs = fftfreq(BUFFER_SIZE, 1/SAMPLE_RATE)
magnitude = np.abs(fft_data[:BUFFER_SIZE//2])
freqs_pos = freqs[:BUFFER_SIZE//2]
# 最大ピーク周波数
peak_idx = np.argmax(magnitude)
peak_freq = freqs_pos[peak_idx]
print(f"主要周波数: {peak_freq:.1f} Hz")
return freqs_pos, magnitude
圧電ブザーのPWM制御(メロディ再生)
// STM32でPWMブザーにメロディを再生
#include "stm32f4xx_hal.h"
extern TIM_HandleTypeDef htim4; // ブザーPWM用タイマー
// 音符の周波数(Hz)
#define NOTE_C4 262
#define NOTE_D4 294
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_G4 392
#define NOTE_A4 440
#define NOTE_B4 494
#define NOTE_C5 523
void buzz_tone(uint32_t freq_hz, uint32_t duration_ms) {
if (freq_hz == 0) {
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
HAL_Delay(duration_ms);
return;
}
// タイマー周期設定(APB1クロックから周波数を計算)
uint32_t prescaler = 84; // 1MHz タイマークロック
uint32_t period = 1000000 / freq_hz;
htim4.Instance->PSC = prescaler - 1;
htim4.Instance->ARR = period - 1;
htim4.Instance->CCR1 = period / 2; // 50% デューティ
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);
HAL_Delay(duration_ms);
HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);
HAL_Delay(50); // 音符間の無音
}
// きらきら星を演奏
void play_twinkle(void) {
int notes[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4,
NOTE_A4, NOTE_A4, NOTE_G4, 0,
NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4,
NOTE_D4, NOTE_D4, NOTE_C4, 0};
int durations[] = {400, 400, 400, 400, 400, 400, 800, 400,
400, 400, 400, 400, 400, 400, 800, 200};
for (int i = 0; i < 16; i++) {
buzz_tone(notes[i], durations[i]);
}
}
他技術との比較
マイクロフォンの方式比較
| 比較項目 | ECMアナログ | MEMSアナログ | MEMSデジタル(PDM/I2S) |
|---|---|---|---|
| サイズ | 大きめ(円筒形) | 非常に小型 | 非常に小型 |
| コスト | 非常に安価 | 中 | 中 |
| 耐熱性 | リフロー不可(熱に弱い) | リフロー対応 | リフロー対応 |
| 落下衝撃 | 脆弱 | 強い | 強い |
| ノイズ | 中 | 中 | 低い(デジタル) |
| インターフェース | アナログ(ADC必要) | アナログ(ADC必要) | I2S/PDMデジタル |
| 長距離配線 | ノイズに弱い | ノイズに弱い | 問題なし(デジタル) |
| 用途 | 低コスト・教育 | スマートフォン組み込み | IoT・スマートスピーカー |
スピーカー駆動方式の比較
| 比較項目 | PWMブザー | アナログClass Dアンプ | I2Sデジタルアンプ |
|---|---|---|---|
| 音質 | 単音のみ(ビープ・メロディ) | 良い | 非常に良い |
| 実装難易度 | 非常に簡単(GPIO直結) | 中程度 | 容易(I2S接続) |
| 消費電力 | 低 | 低(90〜95%効率) | 低(90〜95%効率) |
| ノイズ | PWMスイッチングノイズ | 少ない | 非常に少ない |
| 代表IC | なし(MCU PWM直接) | PAM8403, TPA2005 | MAX98357A, NS4168 |
| 用途 | 警報・通知音 | 音楽・音声(アナログ入力) | 音楽・音声(デジタル入力) |