ESP-ADFを使って、計算した音声信号を外部I2S-DACへ出力する方法(1)


はじめに

 先日、ESP-IDF(ESP32) v4 で外部I2S DACを使って正弦波を鳴らすという投稿をしました。この記事では、ESP-IDF(IoT Development Framework)を使ってESP32に外部接続したI2S-DACから正弦波を出力しました。しかし、より実用的に使う(例えばPCM音源を再生したり、合成等の信号処理をしたりする)ためには、要素機能毎にタスクを分割し、マルチタスクで同時実行したり、各タスク間で信号を受け渡したりする必要があります。

 通常、こういった機能は自前で実装するものかもしれませんが、ESP32の開発元であるEspressif社の提供しているESP-ADF(Audio Development Framework)というライブラリに、まさにこれらの機能が実装されていることが分かりましたので、これを活用することにしました。このESP-ADFは専用ボード(ESP32-LyraTなど)での使用を想定しているようですが、単体のESP32でも使用可能ですので、本投稿では前回同様にESP32と外部I2S-DACとスピーカを使用して、簡単な正弦波を出力してみます。

 公式サンプルとの違いは、出力する信号波形を自分で(sin関数を使って)計算している点です。公式のサンプルにはmp3やwavファイルを読み取って再生するものがありますが、信号波形を直接触ることはほぼしておらず、ドキュメントにもあまりその方法の説明がありません。そこで今回は、信号波形の生データを自分で生成してI2S出力に渡す処理を、分かりやすく説明できるようなプログラムを作成しました。

 今回の投稿では、まず動作させるまでを説明します。プログラムやライブラリ仕様の説明は、後日投稿します。

準備するもの

  • PC(筆者はMac)
  • ESP32開発ボード(NodeMCU, ESP-WROOM-32等)
  • MAX98357A I2S DACモジュール(Adafruit製や類似品)
  • スピーカユニット(使用するDACに適したもの。0.5~3W程度の小さいもの)

環境構築

ESP-ADFの導入

 公式サイト(Get Started)の説明通りにESP-IDFとESP-ADFを導入します。なお先日の投稿とはESP-IDFのバージョンが異なるため、注意が必要です(前回はv4でしたが、今回はv3.3.1を使います)。私はesp_v3とesp_v4の2つ似フォルダを分けて両立させています(環境変数も切り替えています)が、よく分からなければ既存のespフォルダを削除または退避して、改めて再導入すればOKです。

 新規導入する場合の手順は、以下のようになります。(macの場合)

# 事前に https://dl.espressif.com/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz を~/Downloadsへダウンロードしておく。
mkdir -p ~/esp
cd ~/esp
tar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz
git clone -b v3.3.1 --recursive https://github.com/espressif/esp-idf.git
git clone --recursive https://github.com/espressif/esp-adf.git

# pipでパッケージをインストールする。(pipが無ければ別途インストール必要)
# また、環境変数$IDF_PATHを設定する必要あり。
python -m pip install --user -r $IDF_PATH/requirements.txt

Githubからプログラムを入手(git clonoe)

 今回もgithubに一式を用意しましたので、git cloneでダウンロードするだけでOKです。

cd ~/esp
git clone https://github.com/moppii-hub/ESPADF_geneSig.git

回路の製作

 先日の投稿の回路と同じです。再掲します。

とりあえず動作させる

 まず、make menuconfigを実行し、シリアルポートの設定をします。

cd ~/esp/ESPADF_geneSig/
make menuconfig

 設定方法は公式の説明の通りですが、menuconfigの画面が出たらSerial flasher config > Default serial port と選び、ポート名を入力し、save, exitします。なおポート名は、以下の方法で調べることができます。私の環境(mac)では、/dev/tty.SLAB_USBtoUARTです。

ls /dev/tty.*

 ポートの設定が完了したら、ESP32をPCへ接続し、プログラムを書き込みます。

make flash

 プログラムの書き込みが終わり、スピーカから正弦波が鳴れば成功です。

さいごに

 簡単ですが、今回はここまでとします。次回は、今回動作させたプログラムの説明と、ESP-ADFライブラリの使用方法の説明をします。