PDMインタフェース MEMS マイク SPM0405HD4H を ESP32のESP-IDF で試す

Knowles の PDMインタフェースのMEMS(Micro Electro Mechanical Systems – マイクロメカトロニクス) マイク SPM0405HD4H から音声をESP32 に入力するプログラムをESP-IDFフレームワークで作成して試した。

ESP-IDF のサンプルプログラム i2s_adc_dac を試す」で示したサンプルプログラムi2s_adc_dacを基に、espidf_pdm_mic_dac を作成し、試した。

i2s_adc_dacと同様に、リセットするとMEMS マイクからPDMでデータを読み込み、フラッシュメモリに書き込んで録音する。その後は、フラッシュメモリに書き込んだデータを再生し、その後に、あらかじめプログラムで用意されているデータを再生する。

PDMインタフェースではステレオを伝送することができるが、片側だけにマイクを接続して試した。

部品

  • Espressif ESP32 開発ボード
  • PDM マイクロフォン
    • 秋月電子  ディジタルシリコンマイクロホンモジュール SPM0405HD4H
      • http://akizukidenshi.com/catalog/g/gM-04330/
  • スピーカ
    • 基板取付用スピーカーユニット 8Ω0.08W UGSM23A
  • コンデンサー
    • 0.1μF コンデンサ
      • DFRobot ECell の 100nF のコンデンサ
      • DFRobot ECell はブレッドボード用端子が付いたものだが、普通のコンデンサがあればそれでよい。
  • ブレッドボードと配線材

ブレッドボード図

実際の配線例

回路図

Fritzingファイル

パーツのFritzingデータ

ディジタルシリコンマイクロホンモジュール SPM0405HD4H

I2Sインタフェース MEMS マイク ADMP441を ESP32のESP-IDF で試す」に記載したAnalog Devices AD8226を基に修正を加えたADMP441 DIPモジュールをさらに修正してディジタルシリコンマイクロホンモジュール SPM0405HD4H を作成した。

テスト環境

  • Windows 10
  • Visual Studio Code
    •  バージョン: 1.28.2 (user setup)
      コミット: 7f3ce96ff4729c91352ae6def877e59c561f4850
      日付: 2018-10-17T00:23:51.859Z
      Electron: 2.0.9
      Chrome: 61.0.3163.100
      Node.js: 8.9.3
      V8: 6.1.534.41
      Architecture: x64
  • PlatformIO
    • Home 1.0.6  Core 3.6.2a2
  • フレームワーク
    • Espressif 32 (Version 1.5.0)

ソフトウェア

次にあるサンプルプログラムを基にして修正を加えた。

https://github.com/espressif/esp-idf/tree/master/examples/peripherals/i2s_adc_dac

試した環境ではマイク入力の振幅が小さかったので、動作確認のために、4ビット左シフトしたデータを使うようにして試してみた。マイクに口を近づけてしゃべってみて録音した音が再生されることは確認した。

マクロ

マクロの設定によって、出力をモノラルにするかステレオにするか、あらかじめ用意してあるデータをunsigned 8bit  mono にするか signed 16bit  stereo にするかなどを切り替えられるようにした。

  • PDM_MIC
    • このプログラムでは常に1にしておく。0にした場合は正しく記述されていない
  • PDM_OUT
    • 出力をPDMそのままで行う場合には1、ADCで変換する場合には
  • PCM8_MONO_DATA
    • あらかじめ用意してある再生用データの選択をする
      • 1にするとunsigned 8bit mono 16kHz のデータを再生する
        • i2s_adc_dacに含まれていたもの
      • 0にすると signed 16bit stereo 16kHz のデータを再生する
        • ゴルトベルク変奏曲第1変奏から 1.5秒のデータ
        • The Open Goldberg Variationsの CC0 (public domain)データを利用
#define EXAMPLE_PDM_SAMPLE_RATE (16 * 1000) // 16kHz

PDMのサンプリング周波数を16kHzにしているが、録音データとあらかじめ用意されているデータは同じサンプリング周波数としてプログラムが作成されているので、サンプリング周波数を変更した場合には、あらかじめ用意するデータも変更する必要がある。

プロジェクトファイル

使用したプロジェクトのソースファイル等をGitHubの次のリポジトリに置いた。

https://github.com/kunsen-an/espidf_pdm_mic_out

参考資料

以下のサイトなどを参考にさせていただきました。大変助かりました。