2022/3/10

M5StickCとSpeakerHatでwavを再生する


 M5StickCイラスト ←M5StickCです

M5StickCとは、小型(消しゴムサイズくらい)ながら多機能を備えたマイコンボードです。
M5StickCには「HAT」と呼ばれる拡張モジュールが用意されており、HATを装着することにより、様々な機能を追加できます。
本記事では、SpeakerHatを使用して、wavファイルを再生していきます。

HATの種類

また、プログラムはUIFlowを使用します。
UIFlowについてはこちらを参照ください。

UIFlow Use


※注

本記事の方法でwav再生できるのは、UIFLOWのバージョンが1.7.5のものになります。
1.9以上のものはI2Sクラスの中身が異なっており、再生することができませんのでご注意ください。
詳しくは末尾の "(参考)micropythonについて" を参照ください。

SpeakerHatについて

SpeakerHatの写真 ←Speaker Hatはこんなの

SpeakerHatの中にはアンプとスピーカーが入っています。
M5StickCのG26ピン(内蔵DAC出力)から音声信号が出力され、Speaker Hat内のアンプで増幅してスピーカーで音を出します。

M5StickCとSpeakerHatの接続ブロック図

アンプはPAM8303というICを使用しています。
回路図は↓↓です。
/SD端子(シャットダウン)がG0に繋がっていて、G0をLowレベルにすると音声出力が止まります。

SpeakerHatの回路図

UIFlow(micropython)のI2Sクラスについて

M5StickCから音声信号を出すために、machineモジュールのI2Sクラスを使用します。
I2Sクラスの内容および説明は、下記のページが参考になります。

M5StickC UIFlow非公式日本語リファレンス
espressif Inter-IC Sound (I2S)

これらを使ってwavファイルを再生します。

wavファイルを再生するプログラム

まず最初に、wavファイルをM5StickCへアップロードします。
UIFlowの設定画面でCore2を選択します。(M5StickCの設定だと50kbまでしか転送できないので)

※M5StickCが使えるメモリは少なく、転送ファイルは合計1Mb以下程度に納めることをお勧めします。

 UIFlowでwavファイルをアップロードする説明の図 その1

その後、MANAGERアイコンをクリックし、wavファイルを転送します。
画面はCore2になっていますが、ちゃんとM5StickCへファイル転送できます。

 UIFlowでwavファイルをアップロードする説明の図 その2
 UIFlowでwavファイルをアップロードする説明の図 その3

wavファイルを再生するには下記のプログラムを実行します。

from machine import I2S
from wav import wave

wav = wave.open('res/<ファイル名.wav>')
i2s = I2S(mode=I2S.MODE_MASTER | I2S.MODE_TX | I2S.MODE_DAC_BUILT_IN)
i2s.set_dac_mode(i2s.DAC_RIGHT_EN)
i2s.sample_rate(wav.getframerate())
i2s.bits(wav.getsampwidth() * 8)
i2s.nchannels(wav.getnchannels())
i2s.volume(50)

while True:
    data = wav.readframes(256)
    if len(data) > 0:
        i2s.write(data)
    else:
        wav.close()
        i2s.deinit()
        break

UIFlowで実行するには下記のようにします。
pin0は、SpeakerHat内のアンプのON/OFFをしています。
wavファイル名指定のところを変えるのを忘れずに。

 UIFlowでwavファイルをアップロードする説明の図 その3

これをM5StickCへ転送してボタンを押せば、wavファイルを再生できます。

カスタムブロックの作成

UIFlowにはブロックを自作する機能があります。
先ほどのwav再生のプログラムのブロックを作成しておくと、何度も使うときにいちいちコピペしなくて良くなり便利です。
ブロックの作り方は以下を参照ください。
例として、wavファイルを再生するブロックの作成方法の説明があります。

M5Stack向けのVisual Programming「UIFLOW」でカスタムブロックを作成する

M5StickC購入先

秋葉原へ行くと秋月電子やマルツで購入できます。
また、オンラインですとamazonのスイッチサイエンスショップでも購入できます。

(参考)micropythonについて

UIFLowはmicropythonをベースに作成されています。
micropythonとは、pythonをマイコン上で動かせるように最適化したものです。
主にesp32系のマイコンでよく使われているようです。

特徴として、pythonで書けるので記述がシンプルになるのと、REPLと呼ばれるインタープリタが使用できデバッグしやすいなどがあります。
また、オープンソースで以下で公開されています。

github micropython

micropythonには、loborisという派生バージョンがあります。
色々違いはあるのですが、I2Sクラスを使って内蔵DACで音声再生ができる機能が追加されています。

github MicroPython_ESP32_psRAM_LoBo

UIFlowはver 1.7.5ではloboris版をベースに作成されていますが、最新版ではmainstream版で作成されています。
mainstream版では、I2Sクラスで内蔵DACから音声データを出力することができません。
なので、本記事の方法でwavデータを再生することができなくなっています。

参考 M5Stack Community

再生する他の方法としては、UIFlowではなくArduinoを使う、外部にI2S対応アンプをつなげてI2Sで音声を出力するなどがあるかと思います。


以上です。




コメント(githubのアカウントが必要です)