ラズパイオーディオをUSB-DAC化して、サブスクをもっと楽しもう!!


 
 さて、ガジェットといえばKichitaro、Kichitaroといえばオモロダイブ。

という事で、今回は、以前からインターネットで見て気になっていた、USBガジェットモードというRaspberry Piに準備された機能を用いて、ラズパイオーディオをUSB-DAC化して、サブスクやYoutubeなどを楽しむ実験だ。

なお、基本的な情報はここを参照しているので、主にはここを見て頂ければ。
ただ、この通りではうまくいかないところもあったので、そこについては補足できる部分はするが、どうせなら実験だけでなく『ちゃんと用途を考えてそれにあったカタチ』で使えるようにするべきだろう。

そこには動いた→やった!→おしまい、ではない、あとは人様が考えたブログのネタをパクってYoutube動画を作ったりするようなヘボYoutuberなんかとは異なる、ガジェット道とも言える、高い志があるのだ。

後半、悪口を書きたかっただけなのは認める。


やっぱりラズパイ3A+が好き。


さて、まずはこの記事ではRaspberry Pi Zero 2 Wを対象にしているのだけど、日本ではいっこうに発売される気配が無い。それよりもちゃんと流通している物で試すべきである。

また、Raspberry Pi4で試す、という話もあるのだけど、こちらは他のブログでも紹介している方が多い上、先ほどのガジェット道、に照らし合わせた場合に、消費電力が多く、自宅の据え置き運用を対象としてしまうので、また遊びの幅が狭くなってしまうだろう。

という事で、今回は対象をRaspberry Pi 3A+を対象として試してみる事とする。

今、売ってないじゃないか、という話はあると思うけど、スマン。自分はRaspberry Pi 3A+が大好きなのである。

NosPiDAC MAX!遊びを定義しよう!


そして、対象もある程度絞って、具体的な遊び方をイメージした方がより面白いし、実際はなんでもできますよ、という物より、「自分もそれやりたい!」となる物の方が良いだろう。

という事で、今回はじんそん氏の最新作であるNosPiDAC MAXを対象として、「MicroSDを挿し替えれば外出先でもサブスクを楽しめる!」遊びを目指すことにしたい。
さて、まず第一に、NosPiDAC MAXはバッテリー(18650電池)を搭載し、それぞれラズパイ側とDAC側に別給電をすることで高音質化を実現しているので、給電はNosPiDAC MAXに任せるのが良いだろう。

という事で、スマホなどの母艦との接続には「5Vラインが非接続のUSBケーブル」を用いて接続するのが良いだろう。

そして、外部で使用する→突然バッテリー切れを起こす、という事で、突然のシャットダウンに堅牢なシステム構成とするべきだ。

これには、OSを「オンメモリで動作させる」のが有効だと思う。

あとは、Wi-FiやBTもUSB-DACにはいらないよね、とか画面表示するものも特にないのでいらない、高速起動、その他、多くの調整、はあるのだけど、まあ、その辺はおいおいという事で。

5V給電を切り離したUSB-A⇔Aケーブル


さて、今回はUSB-A⇔Aケーブルという不穏なケーブルを使う。

「えっ?それ、アカンやつちゃうの?」なんて思う人もいると思うけど、実は結構存在していたりする。こちら、HDDケースに付属しているケーブルがこのタイプだったりするので、確認していただき、必要に合わせて調達して欲しい。


さて、それでは次は、このケーブルをどのように接続するか。

なお、現時点では、試しているUSBガジェットモードの制約のためなのか、WindowsとiPhoneでは「音量調節ができない」問題があり、現時点では使いにくいので、唯一うまくいっているAndroidを対象として書きたいと思う。(なお、おそらくLinuxも問題ないんじゃないかと思っている)

まずは、Androidなどで使う場合。この場合は、「OTGケーブル」なるものが必要となるので、こちらは皆さん、お持ちかと思うけど、こちらも必要があれば調達して欲しい。



さて、冒頭に「5V給電を切り離した」ケーブルと書いたのだけど、実はそんなものは存在していない。というわけで、私は自作した。


グランドは接続としたまま、5V給電のみを接続しないように、ユニバーサル基板にコネクタを取り付け、配線したのみである。

ちょっとこれをやらないと、USBケーブル経由でスマホからラズパイに給電されてしまい、昇圧を行っているICの出力側に5Vが常にかかってしまう事になるので、なんとなくバッテリーを積んでいる事もあって、気持ちが悪いので、常用には必須としたい。

だれか、IP5305のデータシート読んで、問題ないよ!と書いてあったら教えて欲しい。(なお、しばらく試した分だと問題無さそうには見える)

だけど、ガジェット道は常に安全に、かつここをカットしておくとスマホからのノイズも抑えられるので、真似をする場合はここはちゃんとカットされたケーブルを使用して欲しい。

さて、全て準備できれば、スマホ→OTGケーブル→USB-A⇔Aケーブル→5Vカットコネクタの順に接続する事で接続はOKだ。

LeanMPD


さて、次に、「突然のシャットダウンによりファイルシステムが破壊されるのを回避する」ための方法について。

こちらは過去に私がかなり実験してノウハウがあるので、それを採用したい。

こちらで紹介していたLeanMPD(既にディスコン扱い)は、AuFS+fsprotectを用いて、Read-Onlyのファイルシステムを実現し、突然のシャットダウンにおいても、基本的にはメモリ上で動作しているので問題ないシステム構成を実現していた。

今回も要件は同じ、ということなので、『USB-DAC化』した上で、これをRead-Onlyのファイルシステムで稼働するようにすれば、それで目的は達成できることになる。

なお、ここで使われているAuFSという機能について、最新のBullseye版ではサポートされない、という事になってしまった。ただし、幸いBuster版については、まだサポートが継続されている、という事で、今回のこのネタでもBusterを使用している。

なお、ほぼほぼ意味は無いかもだけど、RTカーネルについても『今後の展開を考えて』搭載済みとしておいた。

Linux's built-in UAC2 gadget g_audio driverの実装


さて、周辺の準備や解説はすんだところで、実際にUSBガジェットモードを実装していこう。

具体的なところは、先ほど紹介した「RPi Zero 2 W Audio Gadget」での説明でほぼ済んでしまっているので、ここでは注意点や変更点のみ書いていく事にしたい。

まず、接続について。紹介したサイトはRaspberry Pi Zero 2 Wを用いているので、この場合は、USB給電用ポートには電源を、そして、隣のMicroUSBポートにUSB-DAC接続用のケーブルをつなげることになる。

ただし。今回の例だとRaspberry Pi 3A+を用いる事にしているので、USB-Aポートしかなく、ここをUSB-DACの口とするためにA⇔Aケーブルを使う事になっている。

また、サイトでは、カーネルのバージョンを5.16で説明しているが、私の場合は、最新の5.17を用いている。

これは、USBガジェットモード自体が発展途上で、どうもボリュームの調整を可能とするコードが5.17のソースで追加されているような話を見たためであるが、まあ、実際はWindowsやiPhoneでは動作しなかったので、まだまだ今後の改善がある部分なのかと思う。

なお、Windowsに関しては、自分はWin10でテストしていて、こちらではWin11を使っているので、もしかするとWin11では挙動が異なるのかもしれない。

いずれにせよ、WindowsとiPhoneはほとんどテストしていないので、現時点ではAndroid推奨、MacとかLinuxは動いたらぜひTwitter等でレポートしていただけると助かります!

あと、これはメモなのだけど、最初、g_audioをmodprobeする記述を他サイトを参照して、「/etc/rc.local」に書いていたのだけど、こちらでは動作せず、結局はこちらのサイトにあるように、「/etc/modprobe.d/g_audio.conf」に記述するようにしたところ、うまくいったので、ここは注意が必要かもしれない。

LeanUAC2(仮)と名付けてみる



さて、という事で、今後もうちょっと改善することを前提に、この「NosPiDAC MAXをRead-OnlyなUSB-DAC化するためのOS」に「LeanUAC2」というプロジェクト名を仮に付けてみた。

まあ、プロジェクト名を付けると気分が上がると言うかなんというか。以下にテストバージョンを置いてみたので、「勇気のある方は」ぜひ試してみて欲しい。当然、保証も何もない。


・なお、時々動画で遅延が発生することがあったため、RTカーネル版→LowLatencyカーネル版に変更してみた。ドライバの限界はあるかもだけど、元のイメージで遅延が気になっていた方は試してみて欲しい。(2022/5/11)
・上記の遅延に対応するため、内部で動かしてるalsaloopプロセスをボタン操作する事で、リセット(再起動)するバージョンを準備してみた。Zero MAXの場合は一番左のボタン長押し、NosPiDAC MAXはジョイスティック右を長押しだと思う。必要な方は試してほしい。(2022/5/14)

使い方もメチャクチャ簡単。上記でダウンロードしたイメージをMicroSDに焼き、NosPiDAC MAXのラズパイ3A+のVolumioがおそらく入っているMicroSDと挿し替えるだけ。

その後、通常通りNosPiDAC MAXを起動し(画面は何も出ない)、スマホ→OTG→USBケーブル→5Vカットコネクタ(超推奨)→ラズパイ3A+とつなげてやるだけだ。

で、勢いでRaspberry Pi4版も作ってみた(New!)。


ちょっとちゃんとテストはしてないのだけど、ラズパイ4しかないよ!という方はこっちで。接続方法は、以下のようにスマホ→OTG→5Vカットコネクタ(超推奨)→USBケーブル→ラズパイ4のUSB Type-Cポートで問題なし。なお、ちょっとケーブル配置のせいか、ラズパイ4のせいかわからないけど、ノイズが乗りやすい印象。


でついでに、ラズパイゼロでも動くようにしてみた。なお、RTカーネルだと安定しないので、LowLatencyカーネルで構築してみたのだけど、なんかこっちの方がいいのかも。他のもRTカーネルやめようかなあとかw


接続方法はこんな感じ。なお、どうも、この接続の場合、Raspberry Pi Zero側もスマホ側も「OTG対応したケーブル」が必要みたいなので、ちょっと接続は色々と悩むかも。。



あと、Twitterで「DAC01でも使いたい!」みたいな話があったので、試してみたのだけど、config.txtの「dtoverlay=hifiberry-dac」というドライバ指定行をDAC01向けに「dtoverlay=hifiberry-dacplus」に変更すること(PC上で変更可)で、音が出ることまでは確認した。

こちら、興味のある方は試してみて欲しい。ただ、長時間の駆動で何らか問題が出ないかなどは不明なので、自己責任でお願いしたい。



これで、おそらくAndroidからはUSB-DACとしてNosPiDAC MAXが認識され、高音質でYoutube動画なんかが楽しめるはずだ。かなり、「おおっ!」という体験が味わえるのでぜひ試してもらいたい。

なお、以降の活動としては、もうちょっと洗練させたいというのもあるのだけど、まあ、使えるからこれでいいかと思っていたり。(なお、これは秘密だけどゼ〇2でも動くかと。Pi4やZeroWは未対応)

以上、今回も長くなってしまったのだけど、ぜひ興味のある方は試してみてください!

まあ、逸般の方以外はこんな悪い事してないで、USB-DACつかおうぜ(笑)
(逸般の方も、時々アフィリンク押しておいてもらえるとWin-Winで元気出るかもなのでヨロシク!!)


スポンサーリンク
スポンサーリンク