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

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

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

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

ハードウェア

I2Sではステレオを伝送することができるが、今回は、左だけにマイクを接続するとした。

部品

ブレッドボード図

実際の配線例

回路図

Fritzingファイル

パーツのFritzingデータ

WeMos Lolin D32

次のWeMos esp32 Lolinを基に修正を加えた。

WeMos esp32 Lolin

ADMP441 DIPモジュール

次のAnalog Devices AD8226を基に修正を加えた。

Analog Devices AD8226

テスト環境

  • Windows 10
  • PlatformIO IDE for VSCode
    • バージョン: 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
  • フレームワーク
    • Espressif 32 (Version 1.4.0)

ソフトウェア

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

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

試した環境ではマイク入力の振幅が小さかったので、動作確認のために、マイク出力の24bit の最上位8ビットを利用するのではなく、最上位7ビットを捨てて、その下の8ビットを使うようにして試してみた。マイクに口を近づけてしゃべってみて録音した音が再生されることは確認した。

ADMP441からのデータ読み込み

ADMP441 の出力は 24ビットで出力されることはわかったが、プログラミングのための詳しい資料がみつからずフォーマットがはっきりしなかった。上位ビットから単純に取ると音がおかしい。データを見ると最上位バイトが 0x7f や 0x00 などになっており、最上位1ビットが常に0であった。

次のブログでは4バイトで読み込んだ際に最上位1ビットは捨てるようになっていた。

ESP8266とデジタルマイクADMP441を接続(Arduino SPIライブラリ版)

i2s_config_t  の .bits_per_sample に 24 を指定してI2Sから読み込むと4バイト単位(32ビット単位)で読み込まれる。そのデータをバイトオーダーがリトルエンディアン(little endian)表現の整数とみなすと、最上位1ビットが無効で、その後の24ビットが有効なデータ(最下位7ビットは無効)になっている。

MSB                             LSB
xooooooo oooooooo oooooooo oxxxxxxx
x: 無効 o: 有効

プロジェクトファイル

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

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