みかんのゆるふわ技術ブログ

Raspberry PiやIoT関係のことを書き残していきます

Raspberry Piに2.4ドルのI2S DAC MAX98357Aをつないで音を鳴らす

以前の記事で、ダイソーの300円スピーカーをRaspberry Piのイヤホンジャックにつないで音を鳴らしてみました🎶

www.mikan-tech.net

しかし、例えばRaspberry Piで目覚まし時計を作りたいと思っても、このスピーカーだと大きくて不便ですよね😢

今回は、小さいスピーカーユニットを直接鳴らせる安いI2S DACオーディオアンプをAliExpressで買ってみました。

www.aliexpress.com

MAX98357AというオーディオアンプLSIが搭載されています。 見た目的には、Amazon.co.jpで売られているこちらのモジュールと同一のものと思われます。

AliExpressでの私が購入時の値段は、なんと$2.37でした!300円しないのでお買い得ですね。

これはアメリカAdafruitのオープンソースハードウェアAdafruit I2S 3W Class D Amplifier Breakout MAX98357Aをベースにしていると思われ、レイアウトやピン配置等ほぼ同じようです。

これは1ch用でモノラル出力です。Raspberry Piに何かしゃべらせたり、目覚まし時計として使う場合は、モノラル出力で十分でしょう。

探せばステレオ用の同じような商品も見つかります。

I2Sとは?

Raspberry PiとこのオーディオアンプとはI2S(Inter-IC Sound)で音データをやり取りします。 デジタルのインターフェースで、基板上のチップ同士でオーディオデータをやり取りするための規格です。

クロック線(BCLK)とデータ線(SDATA)、それと左右のスピーカを区別する信号を出す線(LRCLK)の3種類を使って通信します。

MAX98357Aとは?

MAX98357Aとはアメリカの半導体メーカーMAXIMが出しているI2S DAC機能を持ったオーディオアンプです。

DACというのはDigital-to-Analog Converterの略で、デジタル信号をアナログ信号に変換する機能です。

このチップはI2Sで受信したデジタルデータをアナログに変換して、アンプで増幅してスピーカーを鳴らす機能を持っています。

Raspberry Piにつないでみよう

MAX98357Aモジュールの準備

私が買ったMAX98357Aモジュールはこちらです👇

f:id:kimura_khs:20210612153453j:plain

マイコンに簡単に繋げられるように、標準ピッチ(2.54mm)のピンヘッダが付属しています。また、スピーカーを接続するための端子台もついてきました。

基板の真ん中に搭載されている黒い四角いチップがMAX98357Aです。

f:id:kimura_khs:20210612153529j:plain:w480

ピンヘッダをはんだ付けしました。はんだ付けが必要なのが少し面倒ですね。

はんだごてがない方は、こちらのICテストクリップケーブルを使って、端子同士を引っかけてつかうこともできます。ピンヘッダにもスルーホールの穴にもクリップできるので便利です。ただし、ショート⚡️させないよう注意してくださいね。

スピーカーの接続

実際に音を鳴らすには、スピーカーユニットを繋がなければなりません。

スピーカーユニットというものはピンキリで、高級品は何千円~何万円もするものもあります。 ふつうは次のような数百円のもので良いでしょう。

私は上👆の商品とは違いますが、大阪・日本橋にある電子部品屋さんで売っていた150円のスピーカーユニットをつなぎました。 ケーブルとコネクタ付きだったので、コネクタ部分をハサミでチョキンと切り落として、芯線を出して接続しました。はんだ付けしなくてよかったので簡単です。

f:id:kimura_khs:20210612154446j:plain

スピーカーユニットは、MAX98357Aモジュールの端子台に接続します。 端子台上部からマイナスドライバーでねじを回して端子台を開け、横から線を差し込んで、ねじを反対に回して締め付けます。 上から押さえつけるように止めます。

Raspberry Piへの接続

f:id:kimura_khs:20200922113215p:plain
画像出典: raspberrypi.org

Raspberry Piのピンヘッダは上図のように機能が割り当てられています。このモジュールはI2Sで通信するので、次のピンに接続します。

RasPiピン番号 RasPi 機能 MAX98357Aモジュール 説明
2 5V power VIN 電源(5V)
6 Ground GND グランド (0V基準電圧)
12 GPIO 18 (PCM_CLK) BCLK I2Sビットクロック
35 GPIO 19 (PCM_FS) LRC I2S LRクロック
40 GPIO 21 (PCM_DOUT) DIN I2Sデータ (Raspi→MAX98357A)

これらをジャンプワイヤーでRaspberry Pi Zero WHに接続すると、次のようになりました。

f:id:kimura_khs:20210612154421j:plain

Raspberry Pi Zero WHの場合、1番ピンはSDカードスロットの横にあたります。

もちろん、Raspberry Pi 3B+や4Bでも同じように使えます。

Raspberry Piの設定

Raspberry Pi側の設定は、以下のAdafruitの記事が参考になります。

learn.adafruit.com

これに沿ってセットアップしてみましょう。

I2Sオーディオの有効化

Raspberry Piの/boot/config.txtでデバイスツリーのオーバーレイを設定します。 Raspberry Piを起動して、vimやnanoなどのエディタで編集します。

$ sudo vim /boot/config.txt

このファイル中に、dtparam=audio=onという行があると思います。 これはRaspberry Piのイヤホンジャックの内蔵オーディオを有効にしているものです。 ややこしいので、こちらはオフにしておきます。 この行の先頭に#(シャープ)をつけてコメントアウトしておきます。

そして、次の行にhifiberry-dacを有効にする記述を追加します。

#dtparam=audio=on         # コメントアウト
dtoverlay=hifiberry-dac   # 追加

Adafruitのページにはi2c-mmapも追加するようになっていますが、最近のRaspberry Pi OSではデフォルトで有効になっているので、追加の必要はありません。古いOSを使っている場合は、i2c-mmapも同様に有効にしてください。

ALSA設定ファイルの作成

Adafruitのページでは、ALSA設定ファイル/etc/asound.confを作成するようになっています。 スピーカーのポップ音を減らす効果があるとのことですが、私はALSAに詳しくないのでよく分からず、そのままコピペします😅

$ sudo vim /etc/asound.conf

以下の内容でファイルを作成します。

pcm.speakerbonnet {
   type hw card 0
}

pcm.dmixer {
   type dmix
   ipc_key 1024
   ipc_perm 0666
   slave {
     pcm "speakerbonnet"
     period_time 0
     period_size 1024
     buffer_size 8192
     rate 44100
     channels 2
   }
}

ctl.dmixer {
    type hw card 0
}

pcm.softvol {
    type softvol
    slave.pcm "dmixer"
    control.name "PCM"
    control.card 0
}

ctl.softvol {
    type hw card 0
}

pcm.!default {
    type             plug
    slave.pcm       "softvol"
}

これで保存します。

以上で設定が完了です!Raspberry Piを再起動してデバイスオーバーレイの設定を反映させましょう。

設定の確認

再起動すると、HifiBerry DACというオーディオデバイスが見えるようになっていると思います。

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0 [HifiBerry DAC HiFi pcm5102a-hifi-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

音を鳴らしてみよう

音量調整

音を鳴らす前に、音量を下げておきましょう。 場合によっては爆音が鳴り、スピーカーユニットにも心臓にも悪い可能性もあるので念のため😅 alsamixerコマンドで調整できます。

$ alsamixer

次のような画面が出ますので、上下キーで音量を調整して、ESCキーで終了します。

f:id:kimura_khs:20210612161623p:plain

スピーカーのテスト

いよいよ音を鳴らしてみましょう。次のコマンドで、ホワイトノイズが出ます。

$ speaker-test -c2

サーーというホワイトノイズが聞こえるでしょうか?

音が出ない場合は、少しずつ音量を上げるなどして調整してみましょう。 それでも出なければ、何かがおかしいかもしれません。手順を一通り見直してみましょう。

音が出れば成功です!🎶

WAVファイルを鳴らす

ALSA付属のaplayコマンドでWAVファイルが再生できます。テスト用の音声を再生してみましょう。

$ aplay /usr/share/sounds/alsa/Front_Center.wav

「Front, Center」という声が聞こえると思います。 他に、好きなWAVファイルを入れて再生もできます。

MP3ファイルを再生する

MP3ファイルを再生するには、オーディオプレーヤーソフトが必要です。 コマンドラインで使えるmpg123を使ってみましょう。

$ sudo apt install mpg123

これで、何か音楽ファイルをダウンロードして再生してみましょう。何でも良いです。

$ wget https://dl.espressif.com/dl/audio/gs-16b-2c-44100hz.mp3
$ mpg123 gs-16b-2c-44100hz.mp3

音楽が聞こえてくれば成功です。

さらに次のステップへ

Pythonから音を鳴らしたり、

www.mikan-tech.net

日本語をしゃべらせることもできます。

www.mikan-tech.net

これらを組み合わせれば、目覚まし時計を作ったり、ちょっとしたことを音声で知らせたりと様々な応用が広がりますね。

ぜひ皆様もいろんなところで活用してみてください☺️