Make Technology

I2Sデジタル出力マイクをESP32で扱う方法(3)

Make
スポンサーリンク

最近は涼しい日が続いてますね。
久々にESP32のI2Sマイク回路という技術的な内容を投稿しましたが、今回はその続きでソフトウェア編です。
(前回の記事↓)

事前準備

I2S用のライブラリは、公式の提供するArduino用SDKをインストールすれば自動で付属します。
なお、ESP32用SDKのインストール方法は過去記事でも取り上げています。

ソフトウェア開発

ソースコード(全体)

では、さっそくソースコードを見てみましょう。

上のコードをArduino IDEにコピペして、ESP32に書き込めばマイクに入力された音量がシリアル通信で送信されます。今のArduinoにはシリアルプロッタという送信されたデータをグラフに変換してくれる機能があるので、音声信号が波形となって見られます。
(昔はモニタしかなくて、数字しか見られなかったのに…)

音の波形が何となくわかります

続けて、コードの中身を掻い摘んで説明していきます。

I2Sピン定義

ソースコード31-36行目にI2S用の通信ピンを定義しています。

ここではdefineでピン番号の定数を予め定義してますが、直接数字を入れても問題ありません。
なお、定数の I2S_PIN_NO_CHANGE とは、ライブラリ側であらかじめ用意された、利用しないピンを明記する定数です。今回はスピーカーを使わないので音声出力を不使用としているわけです。

I2Sパラメータ設定

上と前後しますが、ソースコード17-29行目でI2Sの設定をしています。
フォーマット(I2S)の指定をはじめ、入出力モード、サンプリング周波数、音声信号のビット数、ステレオかモノラルか、バッファサイズなどを設定します。

開発時は tx_desc_auto_clear という引数を入れるとエラーが発生したのでコメントアウトしていますが、最新版では利用可能なようなので、SDK(とArduino IDE)を最新版にしておけばビルドできるかもしれません(コメントアウトのままでも動きます)。

また、定数は I2S_SAMPLE_RATE(サンプリング周波数)、I2S_BUFFER_COUNT(バッファ数)、I2S_BUFFER_SIZE(バッファサイズ) だけを独自で定義しており、他はライブラリの定数をそのまま利用しています。バッファサイズ以外はここでしか使わないため、数値を直接打ち込んでもOKです。

なお、パラメータの詳細についてはこちらのサイトをご参照ください。

I2S回路の選択

ESP32にはI2S回路が2つ内蔵されており、I2S_NUM_x(0, 1)という定数で使う回路を選択できます。
例えばマイクで音声を取りながらスピーカーで音声再生といった処理も可能です。

初期化処理

ソースコード43-62行目のsetup関数でI2Sの初期化しています。

関係する関数は、以下の2つです。

  • i2s_driver_install:I2Sの音声処理の設定
  • i2s_setup_pin:I2Sのピン設定

前者にはI2S回路番号、パラメータ、I2Sイベントのキューへのポインタとサイズ、後者にはI2S回路番号とピン定義を与えます。I2Sイベントのキューはまだよく分かっていないのですが、今回は特に使うことも無いので0とNULLを指定しています。
また、どちらの関数もエラーコードを返してくれるので、異常が発生した時の処理も実装できます。

メイン処理

いよいよマイクからの音声を取得する処理に入っていきます。
ソースコード65-79行目のloop関数内に処理が記述されています。

マイクからの音声データ取得は関数 i2s_read で実行しています。
引数はI2S回路番号、サンプリングデータ、バッファサイズ、データ長、タイムアウト時間ですが、portMAX_DELAYにするとタイムアウトしなくなります。また、こちらもエラーコードを出すので、エラーに応じた処理を実装することが可能です。

そのあとは、配列 samples に音声データを格納し、ボリューム調整(シフトダウン)とオフセットを入れてシリアル通信で数値を送信しています。

以上でソフトウェアの解説は終わりです。
それでは、ESP32でI2Sマイクを触ってみてください。

参考

こちらのサイトを参考にプログラム開発をしました。

ESP32のI2Sマイク研究 その1 基礎
概要ESP32でI2S経由でマイクを使う場合のポイントを調べてみました。I2Sとは?Inter-ICSoundの略で、本当はI2Sと上付きになるはずです。IC間でサウンドデータを通信するための仕様ですが、ESP32の場合にはちょっと違う意味
I2Sマイク、ESP32、Arduino、SPH0645LM4H - 万象酔歩
 I2Sマイク、ESP32、Ardui...
マイコンの実験:ESP32-WROOM-32EでMicroPython(I2S編)を使用する

また、公式のAPIリファレンスもありますので、ライブラリの関数や使い方が参照できます。

Inter-IC Sound (I2S) - ESP32 - — ESP-IDF Programming Guide latest documentation
タイトルとURLをコピーしました