見出し画像

Raspberry Pi OS をUSB DAC化カスタム

新しい記事を投稿しました!
当記事の内容は古いです!
ダウンロードリンク外しました!

久々の投稿はカフェ記事ではなくIT系でした・・・
書いてあることも参考サイトの焼き直しなので申し訳ないです。

前置き

ラズパイで使うi2s DACがあるのですが、音源をストリーミングに移行してからというもの使う機会が随分と減ってしまいました。
さすがに勿体無いのでなんとか活用する方法を探していたところラズパイ自体をUSBレシーバにするという方法があるということを発見し、やってみることにしました。

内容は当面の間Raspberry Pi 4専用です。
追加のアイテムが届いたらRaspberry Pi 3 model Bでも試してみたいと思います。

【注意】

こちらズブのど素人です。素人が検索を駆使して情報収集し組み上げたモノです。当然、保証なんてものはありません。試す人は自己責任という重みを忘れないでください。

また、動作確認はMacでしか行っておりません。あしからず。

使ったもの

Raspberry Pi 4(4GBモデルですが、なんでもいい)
ラズパイ用電源(ボード直給電)
microSDカード(4GB)
SDカードリーダー
2023-05-03-raspios-bullseye-armhf-lite.img.xz
imager
USB Type-Cケーブル(デバイス接続用)
V+の配線を切断したUSB延長ケーブル(念の為)
USBアイソレーター(おまじない)
i2sサウンドボード(任意)
i2sサウンドボード用電源(任意)
ラズパイのケースとか放熱板とか(任意)
銅箔テープ(任意:アルミテープでも良いかも)

概要

主目的: i2s DACをUSB DACとして使いたい
目標: 192KHz/24bitでの再生
副次目標: アップサンプリングで384KHz/32bitでの再生
副次目標: 電源ブツ切りで壊れないようにシステムファイルを保護

結果

主目的: Done!(起動時間27秒くらい)
目標: できなかったので成功例の多い96KHz/32bitに設定
副次目標: 一応入れ設定したがよくわからない機能してなさげ(音は鳴る)
副次目標: 一応捨てファイルを作って試したら揮発したので成功?

CUI基本操作

nanoエディタの上書き保存 Ctrl o → Enter → Ctrl x
再起動 sudo reboot
シャットダウン sudo poweroff
処理強制中断 Ctrl c

手順

  • OSインストール

  • リードオンリーにできる機能の実装

  • モジュールインストール

  • OTG(Gadget mode)の実装

  • ffmpegとsoxrの設定

  • リードオンリーが機能しているか確認

Lite版インストール

imagerなりbalenaEtcherなりなんなり
ただしimagerだと事前にSSHやWiFiの設定ができるので、有線LANとかディスプレイとキーボードとかない人はimagerがよろしいかと

記事はWiFiでSSH接続している前提で書いてます
ディスプレイ繋げている人は途中にあるdtoverlay=disable-hdmi書いて再起動すると詰むよ!よく考えて!

一気にいろいろ実装

sudo su
cd ~

apt update
apt-get install git rsync gawk busybox bindfs

dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
systemctl disable dphys-swapfile

git clone https://github.com/josepsanzcamp/root-ro.git

rsync -va root-ro/rootfs/ /
mkinitramfs -o /boot/initrd.gz
echo -e "\n# root-ro\ninitramfs initrd.gz" >> /boot/config.txt

apt-get install mpd
apt-get install ffmpeg
apt-get install libsoxr-dev

/boot/config.txtの編集

nano /boot/config.txt

#以下記載内容
#uncomment to overclock the arm. 700 MHz is the default.
arm_freq=800    #Pi4の発熱対策で動作周波数下げてる

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
dtparam=i2s=on
#dtparam=spi=on

# Enable audio (loads snd_bcm2835)
#---dtparam=audio=on    #コメントアウト
dtparam=audio=off    #念の為のoff

[pi4]
# Run as fast as firmware / board allows
arm_boost=1

[all]
dtoverlay=dwc2,dr_mode=peripheral
dtoverlay=hifiberry-dacplus    #必要なドライバに変更すること
force_eeprom_read=0
#dtoverlay=disable-wifi    #WiFiを止めたければコメントアウト
dtoverlay=disable-bt    #Bluetoothは使わないので止めた
dtoverlay=disable-hdmi    #HDMIも必要ないので止めた

ninitramfs initrd.gz    #最終行になること

/etc/modulesの編集

nano /etc/modules

#以下記載内容
dwc2
libcomposite

/etc/rc.localの編集

参考文献では32bit/96Khzでの成功例が多い
24bit/192KHzなどでは何故かうまくいかない・・・

nano /etc/rc.local

#以下記載内容
sleep 5
sudo modprobe g_audio c_srate=96000 c_ssize=4 p_srate=96000 p_ssize=4
sleep 5
alsaloop -C hw:CARD=UAC2Gadget,DEV=0 -P hw:CARD=sndrpihifiberry,DEV=0 -f S32_LE -c 2 -r 96000 -S 0 -t 10000
#-rオプションは当方の環境では5000でも動く(2500はだめ)、ノイズが多いようなら数値を増やすがその分遅延する

exit 0    #最終行になること

なおCARD=UAC2Gadget,DEV=0やhw:CARD=sndrpihifiberry,DEV=0は自分の環境に合わせて変更する
たくさん出てくる場合もあるが必要なものを選択する

arecord -L    #-Cオプションに使うやつが出てくる
aplay -L    #-Pオプションに使うやつが出てくる

/etc/mpd.confの編集

nano /etc/mpd.conf

#記載はどこでも良いが重複するかもしれないから注意する
decoder {
    # plugin   "hybrid_dsd"
    plugin        "ffmpeg"
    enabled    "yes"
    # gapless  "no"
}

#An example of an ALSA output:
#
audio_output {
    type            "alsa"
    name            "My ALSA Device"
##device              "hw:0,0"        # optional
    mixer_type      "null"                  # optional
    mixer_device    "default"       # optional
    mixer_device    "default"       # optional
    mixer_control   "PCM"           # optional
    mixer_index     "0"             # optional
}

audio_output_format "384000:32:2"

resampler {
    plugin "soxr"
    quality "very high"
    threads "1"
}
reboot-ro    #全て終わったら再起動

リードオンリーになっているか確認

echo "howdy?" >> am_i_here
sudo reboot

ls    #さっき作ったam_i_hereがいなければ成功

編集が必要な場合

再起動後に編集などする場合は頭にsudoつけてください(nanoとかも)

  • 書き込み可能モードで再起動
    sudo reboot-rw

  • リードオンリーモードで再起動
    sudo reboot-ro

参考サイト

参考というか、ほぼパクリの繋ぎ合わせ
OTG(Gagdet mode): https://nw-electric.way-nifty.com/blog/2020/10/post-ca81ce.html
Read-only Root-FS: https://github.com/josepsanzcamp/root-ro?ssp=1&setlang=ja-JP&safesearch=off
SoXの設定: moOde
相談役: bingチャット

免責

「動かないぞ!」「壊れたんだが」「給料足りない」「休みが欲しい」その他もろもろの責任は負えません。自己責任でお願いします。

ダウンロード

「それでも構わない!おれは人柱になる!」「でも自分ではやりたくないかな!」という横着な変わり者のために、あくまでサンプルとしてイメージファイルを置いておきます。ファイル共有はしたことがないので、うまくダウンロードできなかったら潔く諦めてください。
(改変して個人で使うのは構いませんが、再配布はご容赦ください)
(ダウンロードへの直リンクも控えてください)

raspiod_001.7z(ファイルサイズ 677MB)

なお当方のは4GBのmicroSDカードに収まっていますが、イメージファイルの容量は何故か4.16GBあります。中身はもっと少ないはずなのに。
スマートなイメージの作り方わかる人がいたらわかりやすく教えてください。

補足

今回使っているi2s DACはnabe様が設計・製作したmsBerryDAC(+内蔵HPAを手実装済)ですが、内蔵HPA使用時にWiFiが有効だと誘導ノイズを拾うことがあります。銅箔テープなどをWiFiアンテナ周辺(今回は下積みなので基板裏側)やVRあたりに貼り付けて対策してください。もしアレならdtoverlay=disable-wifiで停止してしまっても良いかと思います。

この記事が気に入ったらサポートをしてみませんか?