Raspberry Pi Zero WHにJustBoom DAC Zeroを付けて音を出す

Last modified: 2021-12-14

GPIO接続の “JustBoom DAC Zero” というI2SサウンドカードをRaspberry Pi Zero WHに取り付けてこのマシンからスピーカーに音を出すようにする。OSはRaspberry Pi OSを使用する。

手元の環境ではこれらの組み合わせに合った専用ケース “JustBoom DAC Zero Case” も購入して組み立てて使用している。

Raspberry Piシリーズの製品は音を出すという用途においては音楽再生専用機として扱われることが多いのだが、手元の環境ではこれまでPCのオンボードサウンドから出力していた全ての音・具体的にはPC上のゲームの音やWebサイト上で鳴る音などもサウンドサーバを用いてRaspberry Pi Zero WHに付けたサウンドカードから出力するようにしている。

“Pi ZeroとZero用GPIOサウンドカード” という構成について

この組み合わせを選んだ理由としては

  • 本体・サウンドカードともにPiシリーズの他のモデル向けの製品よりも安価
  • Pi Zeroの本体がシンプルかつ小型であることにより他の高性能・高機能なモデルにGPIOサウンドカードを付ける場合よりも高音質にしやすいのではないかと考えた
  • ZeroはPCなどと直接USBケーブルで接続して周辺機器としてやりとりができる
  • 簡単ではないが、microSDカードなしでも動かすことが可能で異常発熱を心配しなくてもよい
  • このサウンドカードと本体を組み合わせた構成に合わせたケースが販売されている

というのが大きい。

Zero系はPiシリーズの中でもハードウェア構成が特殊なため、PiシリーズやLinuxに詳しくない人に対してはおすすめしない。Raspberry Piの新しめのモデルでサウンドカードを付けた構成向けのケースが存在するもので外部クロックを搭載したもののほうが、そういった人には使いやすそう。

特長

  • Pi Zeroとサウンドカードを合わせてもかなり省電力かつ低発熱
  • サウンドカードがGPIO接続なのでUSB接続のサウンド出力ユニットと比べてPi ZeroのCPUに負荷がかからない
  • ハードウェアボリュームコントロール搭載
  • “DSP Program” と呼ばれるフィルタ機能を搭載し、音の鳴り方を微妙に変える
    • 他のPCM51xx系DACチップ搭載サウンドカードでも同様に搭載されている模様
  • 他のモデルよりも消費電力・ランニングコストが低い

このサウンドカードにはアンプまたはスピーカー向けのアナログ出力端子の左にヘッドフォン端子もあるが、音質は悪い。
入力端子はないので、入力端子に依存した用途であればUSB接続のサウンドユニットなど別の選択肢を考える。

留意点

  • PCにサウンドカードやサウンドユニットを取り付ける場合と比べると、PiにUSB接続されたPCなどの機器からサウンドデバイスとして扱うのが難しい
    • Pi Zeroに音を出す以外の用途が全くないのであれば、Piの側にサウンドカードを付けるよりはPCでサウンドカードやUSB接続のサウンドユニットを付けて音質改善したほうが扱いやすいかもしれない
    • 主な用途が音楽鑑賞のみであればmpdというソフトウェアをZero上で動かしてこれにPCなどから接続して “Cantata” などのクライアントソフトを動かすのが便利だが、他の動画再生やゲームなどの用途で音を出すのが困難
    • Zeroを周辺機器として動作するように設定してg_audioというカーネルモジュールを読み込ませることでUSBサウンドデバイス(オーディオガジェット)として手軽に扱えるようにすることは可能
      • モジュールの読み込みだけでは音は出せない仕様なので、接続したPCなどからの音データをサウンドカードへ渡すためのコマンド(alsaloop)を別途自分で実行するようにする必要がある上、遅延と音飛びを同時に回避するのが難しい1
      • g_audioの代わりにg_etherでUSBイーサネットを使用し、そこにJACK Audio Connection KitやPulseAudioを使って音データを渡すのがやりやすい
  • Pi側で使えるOSが限られる
    • サウンドサーバを使用して他マシンから音を渡して出す使い方をすればPi側のOSのことはそれほど気にならない
      • サウンドサーバを使用するにしてもオーディオガジェットとして振る舞うようにするにしても、GNU/Linuxの使い方(UNIX系OS共通の部分とLinux固有の部分の両方)の基本的な部分が理解できている必要がある
  • JustBoom DAC Zeroには外部の高精度クロックがない
    • I2S信号からクロックを内部で生成するタイプのチップ “PCM5121” を搭載しており、それなりの鳴り方はしてくれるが、外部クロック搭載品よりはジッター2が発生する
      • PCM5121はRaspberry Piシリーズ用サウンドカードでよく採用されている “PCM5122” の下位モデルとなっている

音質についての個人的な印象

音質の感じ方には個人差があるので、全ての人が以下のように感じるわけではない。また、音の感じ方はスピーカーやアンプのそれぞれによるところも非常に大きいため、サウンドカード/ユニットの部分の変化だけでは変わらない部分もある。

これまでにオンボード以外の単独のサウンドカード/ユニットは使用した経験がないが、過去に使用したマザーボードにおけるオンボードサウンドで使用したときの音3と比べると明らかに “高品質” な音が出ていると感じられる。

  • 音がクリアでくっきり鮮明になった
    • これまで気づかなかった音が色々と鳴っていることに気づくことが多々ある
    • 金属の高い音などの聞こえ方には明らかに違いが出る
  • ソフトウェアのイコライザを別途使用しなくても低音も含めて迫力のある音が出る

ただし、2019年11月に購入した安価なマザーボードのオンボードサウンドも音が良くなっていて差が縮まった印象もある。

PCのオンボードサウンドの音もLADSPAプラグイン(capsなど)でイコライザを設定すれば決して悪くはないのだが、それでもこちらの音と比べるとぼやけた感じで鮮明さや迫力が落ちる。microSDカードの故障でオンボードサウンドに戻して半月程度使用した後でmicroSDカードなしで動かせるようになってJustBoom DAC Zeroに戻ってから “やはりオンボードサウンドの音とは違う” と改めて実感した。

この音質でZero WH本体やケースなどを合計しても8-9千円程度4というのは割と費用対効果が高い。ケースが大きさの割にやや高価な気もするが、よく作られているし有用性は十分ある。

JustBoom DAC Zeroは単独のサウンドカードとしては安価なほうなので、他社製品を含めた中で音が一番良いというわけではなさそうな気もするが、満足度は高いので壊れない限りは使い続けるつもり。

専用ケース組み立て時のメモ

2019年9月に専用ケース “JustBoom DAC Zero Case” を組み立てたときのメモ。

ケースが届いた時の状態

  • 同時に購入した他の商品と一緒の箱の中に保護フィルムに包まれた状態で入っており、サウンドカードとは異なり専用の箱には入っていなかった(販売店によっては異なる可能性もある)
    • 更にケースの部品の一部にはシートが貼り付けてあり、これを剥がして使う
  • 上下2つの部品が噛み合った状態で閉じており、端の部分に対して慎重に両側に力を入れて少しだけズレるようにすると、これらを分離できる
  • 内部にはケースの足の部品が4つとGPIOピンの延長の部品(本体とサウンドカードの距離を空けつつ接続も行うためのもの)が入った袋が入っている
    • 足の部品は余分には入っていないため、紛失しないように充分注意する
      • 1つずつ袋から取り出すのを推奨
      • もし作業中に手から落ちても転がってどこかに消えていくことのない場所で作業するとよい

このサウンドカードとケースはZero本体にGPIOピンがあることを前提としているため、無印ZeroやZero Wの場合はGPIOヘッダの部品を別途用意して取り付ける必要がある。ハンマーで叩いて付けられる形のものが売られており、特別な電子工作用の工具は不要。

組み立て

  • ケースの足の部品が4つあり、それぞれ出っ張った部分をケースの外側から穴に入れていくのだが、これが一筋縄ではいかず、なかなか通らない
    • ねじったり、力を入れて押し込んだりを根気強く続けていき、斜めにはまってきたら力を入れる向きも意識しながら頑張ってまっすぐの向きで奥まで入り切るまで続ける
    • 結局、道具を使わずに自分の手だけで4ヶ所はめることができたが、親指が何日も痛くなってしまった
  • ZeroのGPIOピンの上にGPIOピン延長の部品をかぶせ、その上にサウンドカードを本体と同じ向きでかぶせる
    • 最初は隙間ができるが、少しずつ動かして詰めていき、ピンの金属部分が完全に見えなくなるような形で隙間が完全になくなるまで続ける
      • 隙間を詰めるとサウンドカード上部のピン穴部分からピンの先端が飛び出てくるので、怪我を避けるためにそこには指などをおかないようにする
  • 足を付けたほうの底側の部品のケース内側には本体とサウンドカードの基板がはまる “へこみ” があり、部品の上部(端側)に対して外側へ慎重に力を入れて幅を開けつつ合体済みの基板をケース内へ持ってきて、両側の全てのへこみに基板がはまるようにする(基板が2枚で両側にへこみがあるため、全部で4ヶ所)
    • ケースの片側にはmicroSDカード用の大きめの穴(高さがある)があり、これが本体の左側になるようにする
    • これが済んだらケースからはみ出す部分が出ないように微調整する
  • もう一方のケース部品を持ち、端子のある側に穴のある面が重なるようにして慎重にかぶせてケースを閉める
    • すぐには完全には閉じないため、別角度から状態を見ながら手であちこちを押さえるなどして確実に閉じる
  • microSDカードを使用する場合、OSの書き込まれたmicroSDカードを側面(端子のある面を手前に向けたときの左側面)の四角い穴から入れる

ケースに中身を入れた後でも質量が非常に軽く、ケーブル接続後もちょっとしたことで動きやすいため、設置や移動などの際には注意したほうがいいかもしれない。

JustBoom DAC Zeroを使用するための起動設定

Piシリーズ用のGPIO接続サウンドカードは無設定では使えず、使用するための設定の記述が別途必要となっている。

JustBoom DACシリーズの場合、Raspberry Pi OSのJessie,Stretch,Busterの時点では下の=を含んだ2つの行が必要。

[追記]ファイル名:/boot/config.txt
# JustBoom DAC
dtparam=i2s=on
dtoverlay=justboom-dac

dtparam=audio=onの行が既にある場合、ディスプレイとHDMI接続してHDMIオーディオの音を出すつもりがなければこれを消すかコメントアウトしてもよい。HDMIオーディオが有効の場合はALSA準拠のサウンドカードが複数存在することになり、どちらから音を出すかを文字列(このDACの場合はsndrpijustboomd)か番号(01のどちらか)で指定することになる。

ミキサー

ALSA準拠のドライバで、alsamixeramixerで操作できる。

音量に影響するのは以下の項目。

  • Analogue: 0%か100%の2段階で出力レベルがある程度変わる
  • Digital: 1%か2%の刻みで細かく音量を制御する

初期状態では最大音量(爆音設定)になっているため、初めて音を出すときはDigitalを大きくても20-30程度までにして音を出してみて、必要に応じて上げてみる。

以下にamixerでRaspberry Pi OS Busterにおける初期状態の全項目を表示したものを貼り付ける。

ここから
Simple mixer control 'DSP Program',0
  Capabilities: enum
  Items: 'FIR interpolation with de-emphasis' 'Low latency IIR with de-emphasis' 'High attenuation with de-emphasis' 'Fixed process flow' 'Ringing-less low latency FIR'
  Item0: 'FIR interpolation with de-emphasis'
Simple mixer control 'Analogue',0
  Capabilities: pvolume
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 1
  Mono:
  Front Left: Playback 1 [100%] [0.00dB]
  Front Right: Playback 1 [100%] [0.00dB]
Simple mixer control 'Analogue Playback Boost',0
  Capabilities: volume
  Playback channels: Front Left - Front Right
  Capture channels: Front Left - Front Right
  Limits: 0 - 1
  Front Left: 0 [0%] [0.00dB]
  Front Right: 0 [0%] [0.00dB]
Simple mixer control 'Auto Mute',0
  Capabilities: pswitch
  Playback channels: Front Left - Front Right
  Mono:
  Front Left: Playback [on]
  Front Right: Playback [on]
Simple mixer control 'Auto Mute Mono',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]
Simple mixer control 'Auto Mute Time Left',0
  Capabilities: enum
  Items: '21ms' '106ms' '213ms' '533ms' '1.07s' '2.13s' '5.33s' '10.66s'
  Item0: '21ms'
Simple mixer control 'Auto Mute Time Right',0
  Capabilities: enum
  Items: '21ms' '106ms' '213ms' '533ms' '1.07s' '2.13s' '5.33s' '10.66s'
  Item0: '21ms'
Simple mixer control 'Clock Missing Period',0
  Capabilities: enum
  Items: '1s' '2s' '3s' '4s' '5s' '6s' '7s' '8s'
  Item0: '1s'
Simple mixer control 'Deemphasis',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]
Simple mixer control 'Digital',0
  Capabilities: pvolume pswitch
  Playback channels: Front Left - Front Right
  Limits: Playback 0 - 207
  Mono:
  Front Left: Playback 207 [100%] [0.00dB] [on]
  Front Right: Playback 207 [100%] [0.00dB] [on]
Simple mixer control 'Max Overclock DAC',0
  Capabilities: volume volume-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: 0 - 40
  Mono: 0 [0%]
Simple mixer control 'Max Overclock DSP',0
  Capabilities: volume volume-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: 0 - 40
  Mono: 0 [0%]
Simple mixer control 'Max Overclock PLL',0
  Capabilities: volume volume-joined
  Playback channels: Mono
  Capture channels: Mono
  Limits: 0 - 20
  Mono: 0 [0%]
Simple mixer control 'Volume Ramp Down Emergency Rate',0
  Capabilities: enum
  Items: '1 sample/update' '2 samples/update' '4 samples/update' 'Immediate'
  Item0: '1 sample/update'
Simple mixer control 'Volume Ramp Down Emergency Step',0
  Capabilities: enum
  Items: '4dB/step' '2dB/step' '1dB/step' '0.5dB/step'
  Item0: '4dB/step'
Simple mixer control 'Volume Ramp Down Rate',0
  Capabilities: enum
  Items: '1 sample/update' '2 samples/update' '4 samples/update' 'Immediate'
  Item0: '1 sample/update'
Simple mixer control 'Volume Ramp Down Step',0
  Capabilities: enum
  Items: '4dB/step' '2dB/step' '1dB/step' '0.5dB/step'
  Item0: '1dB/step'
Simple mixer control 'Volume Ramp Up Rate',0
  Capabilities: enum
  Items: '1 sample/update' '2 samples/update' '4 samples/update' 'Immediate'
  Item0: '1 sample/update'
Simple mixer control 'Volume Ramp Up Step',0
  Capabilities: enum
  Items: '4dB/step' '2dB/step' '1dB/step' '0.5dB/step'
  Item0: '1dB/step'

  1. -tオプションで最適な遅延時間を調整することになるが、手元の環境ではalsaloopでこの値を上げて試すと何故か無線LAN接続が切れてSSHからの制御ができなくなる現象が発生したため、最適な値は不明で、他にもg_audiog_etherと同時には使えずに不便なこともあり、オーディオガジェット化を試すのは保留とした ↩︎

  2. サウンドカードにおけるデジタルからアナログへの変換の過程において発生する時間的な歪み ↩︎

  3. PCのオンボードサウンド使用時はJACKをサンプリングレートを96kHz以上にして動かしており、それとの比較 ↩︎

  4. microSDカードなしで動かせば更にコストが下がる ↩︎