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 開発ボード
- WeMos Lolin D32
- PDM マイクロフォン
- 秋月電子 ディジタルシリコンマイクロホンモジュール SPM0405HD4H
- http://akizukidenshi.com/catalog/g/gM-04330/
- 秋月電子 ディジタルシリコンマイクロホンモジュール SPM0405HD4H
- スピーカ
- 基板取付用スピーカーユニット 8Ω0.08W UGSM23A
- http://akizukidenshi.com/catalog/g/gP-09797/
- これでは非常に小さな音でしか再生できないが、とりあえず手持ちのもので。
- 基板取付用スピーカーユニット 8Ω0.08W UGSM23A
- コンデンサー
- 0.1μF コンデンサ
- DFRobot ECell の 100nF のコンデンサ
- DFRobot ECell はブレッドボード用端子が付いたものだが、普通のコンデンサがあればそれでよい。
- 0.1μF コンデンサ
- ブレッドボードと配線材
ブレッドボード図
実際の配線例
回路図
Fritzingファイル
espidf-pdm-mic-out.fzz
パーツの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
- バージョン: 1.28.2 (user setup)
- 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)データを利用
- 1にするとunsigned 8bit mono 16kHz のデータを再生する
- あらかじめ用意してある再生用データの選択をする
1 |
#define EXAMPLE_PDM_SAMPLE_RATE (16 * 1000) // 16kHz |
PDMのサンプリング周波数を16kHzにしているが、録音データとあらかじめ用意されているデータは同じサンプリング周波数としてプログラムが作成されているので、サンプリング周波数を変更した場合には、あらかじめ用意するデータも変更する必要がある。
プロジェクトファイル
使用したプロジェクトのソースファイル等をGitHubの次のリポジトリに置いた。
https://github.com/kunsen-an/espidf_pdm_mic_out
参考資料
以下のサイトなどを参考にさせていただきました。大変助かりました。