初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

Raspberry Pi 3とポタアンでNASの音楽を再生するネットワークオーディオプレーヤーを作った(その2)

安西先生「諦めたらそこでお小遣い無駄になりますよ。」

前回までのあらすじ

osa030.hatenablog.com

ひとことで言うと

スマホにポタアンを付けて音楽を聴いていたのだけれども自宅でしか聴かないのにそれだと重くね?っちゅうことでRaspberry Pi 3を用いた新たなソリューションを検討したのだがカンタンにはいかなかった。お父さんのお小遣いは
一体どうなってしまうのか?

構成

やりたい構成をおさらい。

f:id:osa030:20160816212342j:plain

QNAP 音源ファイル(mp3)が格納されている
Raspberry Pi 3 NAS上の音源ファイルを再生する
Anker PowerCore 20100 Raspberry Pi 3に電源供給する
DENON DA-10 USB-DAC兼ポタアンとして音声出力する
Smartphone Raspberry Pi 3を操作する
Ponkotsu 音楽を楽しむ

こんな感じでスマホを片手に音楽を楽しむのが最終形態だ。その為の要となるのが「Raspberry Pi 3」であり、これをネットワークオーデイオプレーヤー(NAP)としてイチから設定するのが今回の目標。

OSインストール

今回は公式のコチラ。

www.raspberrypi.org

"デスクトップなんて飾りですよ。"ということで「RASPBIAN JESSIE LITE」をチョイス。

イメージ書き込んだmicroSDとLANケーブルを接続してRaspberry Pi 3を起動。Raspbianも「raspberrypi.local」でアクセスできるという情報を見つけたが、

$ ping raspberrypi.local
ping 要求ではホスト raspberrypi.local が見つかりませんでした。ホスト名を確認して
もう一度実行してください。

ということで、DHCPのアドレス割当範囲でping乱れ打ちで見つける。

以降の作業は漢は黙ってssh接続。接続に用いるソフトはお好みでどうぞ。

Raspbianの場合は以下アカウントでログインする。

user pi
pass raspberry

環境更新

各種環境を最新にする。

2016/08/20更新) ファーム更新後にパッケージ更新をするとカーネルが古く戻されるので実施する順番を変えました。

パッケージ更新

$ sudo apt-get update
$ sudo apt-get upgrade

ファーム更新

$ sudo apt-get install rpi-update
$ sudo rpi-update
$ sudo sync
$ sudo reboot

ネットワーク設定

WiFiの設定。「SSID」と「PASS」は各自の環境に合わせて変更すること。

チャンネル設定

無線LAN(2.4GHz)のチャンネル設定は各国によって異なるのだが、デフォルトだと12chと13chが使えない(US設定?)

変更前
$ sudo iwlist wlan0 channel
wlan0     11 channels in total; available frequencies :
          Channel 01 : 2.412 GHz
          Channel 02 : 2.417 GHz
          Channel 03 : 2.422 GHz
          Channel 04 : 2.427 GHz
          Channel 05 : 2.432 GHz
          Channel 06 : 2.437 GHz
          Channel 07 : 2.442 GHz
          Channel 08 : 2.447 GHz
          Channel 09 : 2.452 GHz
          Channel 10 : 2.457 GHz
          Channel 11 : 2.462 GHz
          Current Frequency:2.447 GHz (Channel 8)
変更方法

「raspi-config」で設定する。

$ sudo raspi-config
  • 「5 Internationalisation Option」

f:id:osa030:20160816141603j:plain

  • 「I4 Change Wi-fi Country」

f:id:osa030:20160816141612j:plain

  • 「JP Japan」

f:id:osa030:20160816141621j:plain

メイン画面に戻って<Finish>で変更を保存してリブート。

変更後
$ sudo iwlist wlan0 channel
wlan0     14 channels in total; available frequencies :
          Channel 01 : 2.412 GHz
          Channel 02 : 2.417 GHz
          Channel 03 : 2.422 GHz
          Channel 04 : 2.427 GHz
          Channel 05 : 2.432 GHz
          Channel 06 : 2.437 GHz
          Channel 07 : 2.442 GHz
          Channel 08 : 2.447 GHz
          Channel 09 : 2.452 GHz
          Channel 10 : 2.457 GHz
          Channel 11 : 2.462 GHz
          Channel 12 : 2.467 GHz
          Channel 13 : 2.472 GHz
          Channel 14 : 2.484 GHz
          Current Frequency:2.447 GHz (Channel 8)

13chと14chが利用可能になった。

WiFi接続設定

Raspberry Pi 3の内蔵WiFiは「IEEE 802.11bgn」なので接続するWiFiのアクセスポイントも2.4GHzで接続できるモノでないと駄目。

$ sudo -s
# wpa_passphrase SSID PASS > /etc/wpa_supplicant/wpa_supplicant.conf

接続対象のアクセスポイントがステルスSSIDの場合は「scan_ssid=1」を追記しないと駄目。

# vi /etc/wpa_supplicant/wpa_supplicant.conf
  • /etc/wpa_supplicant/wpa_supplicant.conf
network={
        ssid="SSID"
        #psk="PASS"
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        scan_ssid=1
}

WiFiデバイス設定

デフォルトだとWiFiのパワー・マネージメントが有効なので、後々困らないように無効化。

# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
# vi /etc/network/interfaces

「wireless-power off」を追記する。

  • /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet manual
    wireless-power off
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

固定IP設定

Debian「jessie」からは固定IP設定は「/etc/network/interfaces」ではなくなったらしい。知らんかった。

# vi /etc/dhcpcd.conf

末尾に追記する。以下は各自の環境にあわせて変更。

IPアドレス 192.168.0.xx
ネットマスク 24(255.255.255.0)
デフォルトゲートウェイ 192.168.0.1
DNSサーバ 8.8.8.8
  • /etc/dhcpcd.conf
# static ip for wlan0
interface wlan0
static ip_address=192.168.0.xx/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8
# reboot

リブート後にWiFiに設定した固定IPでssh接続してパワー・マネージメントが無効なら問題なし

$ sudo iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"SSID"
          Mode:Managed  Frequency:2.447 GHz  Access Point: xx:xx:xx:xx:xx:xx
          Bit Rate=72.2 Mb/s   Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=70/70  Signal level=-22 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

ということでネットワーク設定完了。

Bluetooth無効化

ついでに今回の構成では使うことはないのでBluetoothを停止しておく。

停止前
$ lsmod | grep bt
btbcm                   5929  1 hci_uart
bluetooth             326105  22 bnep,btbcm,hci_uart
$ systemctl status hciuart
● hciuart.service - Configure Bluetooth Modems connected by UART
   Loaded: loaded (/lib/systemd/system/hciuart.service; enabled)
   Active: active (running) since Tue 2016-08-16 01:56:57 UTC; 7min ago
  Process: 310 ExecStart=/usr/bin/hciattach /dev/serial1 bcm43xx 921600 noflow - (code=exited, status=0/SUCCESS)
 Main PID: 563 (hciattach)
   CGroup: /system.slice/hciuart.service
           └─563 /usr/bin/hciattach /dev/serial1 bcm43xx 921600 noflow -
$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; enabled)
   Active: active (running) since Tue 2016-08-16 01:56:57 UTC; 5min ago
     Docs: man:bluetoothd(8)
 Main PID: 575 (bluetoothd)
   Status: "Running"
   CGroup: /system.slice/bluetooth.service
           └─575 /usr/lib/bluetooth/bluetoothd
停止設定
$ sudo systemctl disable hciuart
$ sudo systemctl disable bluetooth
$ sudo vi /boot/config.txt

末尾に以下を追記

  • /boot/config.txt
# Dsiable bluetooth
dtoverlay=pi3-disable-bt

「config.txt」は起動時に適用されるのでリブート

停止後
$ lsmod | grep bt
$ systemctl status hciuart
● hciuart.service - Configure Bluetooth Modems connected by UART
   Loaded: loaded (/lib/systemd/system/hciuart.service; disabled)
   Active: inactive (dead)
$ systemctl status bluetooth
● bluetooth.service - Bluetooth service
   Loaded: loaded (/lib/systemd/system/bluetooth.service; disabled)
   Active: inactive (dead)
     Docs: man:bluetoothd(8)

以上でネットワーク設定は完了。正しく行えていればLANケーブルを抜いてもWiFiの固定IP経由でssh接続できるはずだ。

NASマウント設定

次はNAS上のディレクトリをRaspberry Pi 3から参照できるようにする設定。

マウント先のNASを以下とした場合の例。以下は各自の環境にあわせて変更。

IP 192.168.0.yyy
Path Multimedia/Music
username ponkotsu
password syorou

認証が不要の場合はオプションから外すだけだと思われる。

$ sudo mkdir /mnt/nas
$ sudo vi /etc/fstab
  • fstab
//192.168.0.yyy/Multimedia/Music /mnt/nas cifs username=ponkotsu,password=syorou,iocharset=utf8,ro,uid=1000,gid=1000,defaults 0 0

マウント先のディレクトリを作成して、「fstab」にNASマウント設定を追記する。なお、オプションは適当なので後で見直す必要があるかも。

ブート設定の変更

これだけだと、WiFiでのネットワーク接続が完了する前にマウント操作が実行されてマウントに失敗するケースがある。そこで、ネットワーク接続完了までブート完了にしないように変更。

$ sudo raspi-config
  • 「4 Wait for Network at Boot」

f:id:osa030:20160816161827j:plain

  • 「Yes」

f:id:osa030:20160816161947j:plain

メイン画面に戻って<Finish>で変更を保存。

$ sudo reboot

再起動して自動マウントされるか確認。

$ ls /mnt/nas | more
くるり
アン・ルイス
サンボマスター
いきものがかり
サカナクション
ポルノグラフィティ
きゃりーぱみゅぱみゅ
ミッシェル・ガン・エレファント
1986オメガトライブ/カルロス・トシキ&オメガトライブ
10-FEET

マウントしたディレクトリ内のフォルダ名やファイル名が文字化けしてなければマウントのオプションは多分OK。

オーデイオ設定

USB-DACの利用が前提なので余計なものは無効化しておく。

内蔵サウンドカードの無効化

$ sudo vi /boot/config.txt

以下をコメントアウトすると「snd_bcm2835」がロードされないので無効化される。

  • config.txt
# Enable audio (loads snd_bcm2835)
# dtparam=audio=on

「config.txt」は起動時に適用されるのでリブート

$ lsmod | grep snd_bcm
$ aplay -l
aplay: device_list:268: no soundcards found...

これで無効化されている。

USB-DAC(ポタアン)の確認

Raspberry Pi 3でDA-10が認識されるかの確認。

$ dmesg
[  255.359286] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[  255.459983] usb 1-1.2: New USB device found, idVendor=154e, idProduct=1003
[  255.460003] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  255.460015] usb 1-1.2: Product: DA-10
[  255.460027] usb 1-1.2: Manufacturer: D & M Holdings Inc.
[  255.468751] hid-generic 0003:154E:1003.0001: hiddev0,hidraw0: USB HID v1.10 Device [D & M Holdings Inc. DA-10] on usb-3f980000.usb-1.2/input2
[  255.987621] usbcore: registered new interface driver snd-usb-audio

USB接続して電源をONにするとUSBデバイスとして検出された。

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: DA10 [DA-10], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

ALSAのサウンドデバイスとしても認識されている。ということで特に特別な設定は不要だった。

MPDインストール

VolumioやRuneAudio、その他のオーデイオ系ディストリビューションはMPDを用いて音源再生しているので、今回もそれにならいMPDを手動でインストールして設定する。

www.musicpd.org

$ sudo apt-get install mpd mpc

mpcというのはmpdを操作するためのコマンドラインインタフェース(CLI)。

ディレクトリ設定

マウントしたNASのディレクトリをMPDから閲覧できるようにシンボリックリンクを作成。

$ sudo ln -s /mnt/nas /var/lib/mpd/music/.

データベースの更新

MPDはデータベースで楽曲を管理するのでデータベース更新してNASのディレクトリ上の楽曲を登録する。

$ mpc update
Updating DB (#2) ...
volume: 77%   repeat: off   random: off   single: off   consume: off

「mpc update」で手動でデータベース更新できる。

 $ mpc status
Updating DB (#2) ...
volume: 77%   repeat: off   random: off   single: off   consume: off

「mpc status」でデータベース更新中かわかる。

$ mpc ls nas
nas/The Black Crowes
nas/The Strokes
nas/SPYAIR
nas/Velvet Revolver
nas/Dave Navarro
nas/サンボマスター
nas/NoFX
(snip)

「mpc ls」で現在データベースに登録されている楽曲がわかる。

$ mpc status
volume: 77%   repeat: off   random: off   single: off   consume: off

更新が完了すると"Updating DB"の出力がなくなる。

MPDの設定

インストール直後のMPDはマシン内からしかアクセスできず、再生するサウンドデバイスの設定もされていない。ので設定を変更する。

$ sudo vi /etc/mpd.conf
--- mpd.conf.org        2016-08-15 14:24:43.175650809 +0000
+++ mpd.conf    2016-08-15 14:25:59.285650780 +0000
@@ -80,7 +80,7 @@
 # to have mpd listen on every address
 #
 # For network
-bind_to_address                "localhost"
+bind_to_address                "0.0.0.0"
 #
 # And for Unix Socket
 #bind_to_address               "/run/mpd/socket"
@@ -88,7 +88,7 @@
 # This setting is the TCP port that is desired for the daemon to get assigned
 # to.
 #
-#port                          "6600"
+port                           "6600"
 #
 # This setting controls the type of information which is logged. Available
 # setting arguments are "default", "secure" or "verbose". The "verbose" setting
@@ -210,8 +210,8 @@
 #
 audio_output {
        type            "alsa"
-       name            "My ALSA Device"
-#      device          "hw:0,0"        # optional
+       name            "DENON DA-10"
+       device          "hw:1,0"
 #      mixer_type      "hardware"      # optional
 #      mixer_device    "default"       # optional
 #      mixer_control   "PCM"           # optional

「audio_output」の「device」は「aplay -l」で出力された情報を基に設定する。今回は以下となるので、

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: DA10 [DA-10], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1
device 0

deviceに「hw:1,0」を指定する。

$ sudo service mpd restart

設定反映するためにmpdを再起動。

再生確認

MPD自体は楽曲再生に特化したサーバソフトなのでブラウザから操作するためのUIは公式に提供されない。勿論sshでmpcコマンドを使えば操作できるのだがそんなことスマホからするのは流石に厳しい。世の中には沢山のMPD操作用アプリが存在するのでそれを利用すればよい。

MPDroid(Androidアプリ)

https://play.google.com/store/apps/details?id=com.namelessdev.mpdroid&hl=japlay.google.com

今回はXperia Z3(SOL26)から操作したいのでコチラをインストール。

「Settings」からMPDのIPをアドレスとポート番号を設定

Host 192.168.0.xx(Raspberry Pi 3のIPアドレス)
Port 6600

f:id:osa030:20160815233654p:plain

データベースに登録された楽曲が表示される。

f:id:osa030:20160815233702p:plain

曲を選択して再生を開始するとRaspberry Pi 3に接続されたDA-10から音が出力される。

ふう。完成だ。

第2形態

いつまでもRaspberry Pi 3を裸運用するのは面倒なのでケースにいれよう。

f:id:osa030:20160816174312j:plain

Amazonの製品写真と違ってアクリル板が曇っているが、実は説明書がついてなかったので保護シート付きのまま組み立ててしまった時の写真だ。保護シートとればツルツルだし黒の板もダンボール色と言われているのは保護シートなので安心してほしい*1

f:id:osa030:20160816174332j:plain

こんな感じで接続して…

f:id:osa030:20160816174352j:plain

こうやって聴くのだ!

備考

とりあえず環境はできたのだが、どうもRaspberry Pi 3の内蔵WiFiは電波が弱いらしく、電波状況次第でNAS上の音源の再生が停止してしまうケースに遭遇した*2。今後ファーム更新で改善されるかもしれないし、基板構造上の問題で解決しない可能性もある。その場合は内蔵WiFiは使わずにUSBタイプを使うほうが良いかもしれない。有線LANで運用する場合には問題ないと思うが、WiFi運用を検討している場合は注意してほしい。

*1:気付かずに保護シートをマッキーで黒く塗ったのは内緒だ

*2:事象発生時にiwconfigでみると「Tx excessive retries」が増加しているので何かしら無線レベルで問題があると判断している