RaspyFiとSONY PHA-2でDSDネイティブ再生 part 3

作成日2013年11月29日
更新日2013年12月 2日


このページは、試行錯誤を追記しているうちに収拾がつかなくなった part3β を再編集したものです。


さて前回は、 取りあえず音が出ることを確認し、持ち歩くための工作をしたことの日記でした。
その後、実際に持ち歩いて使いつつ、ハード、ソフト共、日々手を加えたりしています。
そして毎晩の様に余計な事して音が出なくなったり、Piを突然停止させたりしてる今日この頃です。

今回は、その後判明した事などを備忘録として残します。
一応、工作関係は一区切りついたので、これをVersion 1.1としました。

Version 1.1正面
Raspy
  • ポタアン用のシリコンバンドでPHA-2とバッテリを束ねた。ちょっとすっきり。
  • L字プラグをノイトリック に変えた。これならバンパーと干渉せずに半回転できる。
  • RGB発光LEDを内蔵し、ステータスが判るようにした。スマホからsshすりゃ判るんだけどね。
  • トップパネルにスペーサ噛ませてエアフローの改善を試みた。エアというかヒートというか...。
  • ネジを趣味で変えてみた。いや、全部趣味ですけど。

  • 見た目の変更点はこんな感じ。
    ノイトリックのプラグはかなり良く考えられた構造をしています。感心しちゃいました。
    Version 1.1 トップパネル
    Raspy Piの基盤を入れ替えてみた。今度は3.5mmジャックがスカイブルーだ。

    別に使いもしない3.5mmジャックの色にこだわった訳じゃありません。

    実は、この基板はMade in the UKなのです。

    最近のPiには、UK製造モデルがあることを海外のサイトで知りました。
    でも RSオンライン から普通に買ったのでは、製造国の指定など無理な気がします。
    そこでAmazonの商品写真からショップを絞り込み、直接問い合わせて手に入れました。
    UKモデルは Chinaモデルと違い質素な紙箱です。シーリング等も無くそのまま取り出せます。
    箱の外にMade in the UKシールが貼付されているので、だれでも確認可能です。

    当初のこだわりはUK製だと言うだけだったのですが...
    Made in the UK and CPU revision 000e
    Raspy 更に 調べてみるとPiのModel B Revision 2.0の512MB版のベンダーは複数あることが判明。
    /proc/cpuinfoのCPU revisionの示す値によりベンダーを判別できることが判りました。

    こんな感じです。
    '000d' => 'Model B Revision 2.0 512MB', (Egoman)
    '000e' => 'Model B Revision 2.0 512MB', (Sony)
    '000f' => 'Model B Revision 2.0 512MB', (Qisda)

    そうです。Sony製造のPiがあるのです。

    そして、この写真のPiは、revison=000e、つまりSony製です。

    これで使用したパーツ(Pi,PHA-2,Battery)全てがSony製になりました。
    いや、気持ちの問題だけなんですが...どうでも良い人にはどうでも良い話ですね。

    ちなみに外見からSony製かどうかを見分ける方法は不明です...。
    青いジャック=Sony製とも限らない様です。
    最初に使ったものは確か000f(Qisda)でした。
    それはMade in Chinaで、ジャックは黒でした。
    エアフロー改善と、こだわりのネジ
    Raspy
  • ネジは6角沈頭のステンレスにした。特に意味は無いけど。

    • このタイプのインチネジなんてその辺じゃ売ってないので、 鍋屋バイテック会社で通販。
      スペーサを入れるなら、サイズはNo.4-40UNCのL=5/16inがちょうど良い。
      型番は、 SNBS-#4-40x5/16です。

      スペーサはM2.6用ジュラコンスペーサ。
      但し#4-40ネジには細すぎるので、2.8mmまで内径を拡張してます。

      スペーサ入れないのであれば、L=1/4inがジャストです。
      ちなみに、5/16inは、pi基盤をケースに止めるボルトの入替え用に買ったものの流用です。

      あ、「穴」もインチサイズなんで、1/16inのレンチが必要です(忘れてて慌てた)。
  • 何故スペーサでトップパネルを持ち上げたのか?
    • 1週間程使ってみて、やはり熱対策は最重要課題でした。
      ギリギリのポーチに入れてるのがそもそもの問題なのですが。

      状況として...
      1時間程、電車内で使用したところ、CPU温度は65度以上になりました。
      70度を越えた記録も1回だけありました。
      ハード的には80度位が限界らしいですが、これじゃ寒冷時期専用DAPです。
      今は温度監視ツールを動かして72度を越えたら自動shutdownが掛かる様にしています。
      その後、部屋の中で3時間ほど放置してみたら....shutdown発動しちゃいました。

      と言う状態だったので、この加工をしたところ、5度程度の改善は見られました。
      充電しながら部屋で4時間動作させても65度近辺で安定してます。
      とは言え、それでもあまり好ましくない温度です。FANによる強制冷却も検討中。
    RGB発光LEDを内蔵してGPIOに接続し、動作状態のインジケータにした。
    Raspy パッと見て動作状態が分かるようにRGB発光のLEDを入れてみました。
    無理やりPiケースに押し込み、SDカード穴から発光するようにしています。
    写真はシアン発光中。

    RGB発光のチップLEDをCRDで10mAに電流制限して駆動しています。
    CRDだけだと赤が強すぎたので赤にだけ1kΩの抵抗入れてます。
    カソード側をまとめて1つのCRDで10mAに制限し、直接GPIOで駆動しています。

    7色プラス点滅とかさせてステータスを表示します。
    起動が完了し、PHA-2のステータス確認もOKならデモ発光後にシアン点灯とか
    shutdown中は赤点滅したり、CPU温度に応じて時々赤点滅入れたり、
    温度限界で緊急shutdown発動中は、最後の大騒ぎ明滅!
    ...など、RGBの0/1の組み合わせだけでも結構表現可能なもんです。

    音への影響を気にしなくていい状況(起動中とか、shutdown中とか)は調子にのって
    パタパタとGPIOをON/OFFしてるけど、起動後はシアンを常時点灯です。
    まぁ、それとは別に温度状態をチェックして点滅させるスクリプトも入れちゃってるけど。
    PHA-2への電源供給について
    Raspy Piの電源系は貧弱です。起動中にUSB機器を差すと電圧変動を吸収しきれずリブートしたりします。
    基本的に抜き差し不要なので直接の問題とはなりませんが、PHA-2がUSB機器として認識されない問題が出ていたので、問題切り分けの一つとしてPHA-2への電力供給だけをバッテリ直結にしてみたりしました。

    当初、pi基板自体の不安定さを疑い、China基板、UK基板2枚の3枚で試行してみました。
    しかし、有意な違いがあるとは考えにくいと思われた為、電源を直結してみました。

    最初はPHA-2のVccのみをバッテリと直結とし、Pi側のVccはopenにしました。
    これでもPHA-2の認識に「ほぼ」問題はなかったのですが、やはり100%ではありませんでした。
    電源を入れる順番やタイミング等の問題か?「音が出ない」ことがあります。
    程度としては、「忘れた頃に音が出ない!」と言う感じです。
    その場合でも、rebootすると何の問題も無かったように音が出たりします。

    続いてPi側のVccも消費させてみました。
    HDP-R10ではVccがopenだと機器の認識ができない状態だったので、可能性はあるかと。
    つまり、抵抗とLEDをMicroUSB内で接続する HDP-R10にUSBメモリ方式を入れてみました。

    しかし、やはり有意な違いは無いように思われ、今は普通のUSB結線に戻しています。

    戻した理由は、改造中にプラグが修理不能になったからと言うのもありますが...。
    ちなみに写真はPi側openのもの。2本のケーブルはMicroUSBプラグには負担が大きいです。


    この辺から佳境に入ります!!字ばっかりのデータです。


    「音が出ない」色々なケース

    同じ「音が出ない」と言う症状でも原因は何種類もあることが判りました。

    No. 症状 備考
    1 USB機器として認識していない。 lsusbしてもエントリが無い
    2 ALSAのデバイスとして認識していない。 /proc/asoundにエントリが無い
    3 mpdの出力デバイスと一致していない。 card0以外で認識されている
    4 mpdの再生時に出力エラーとなり、音が出ない。 デバイスがroot権限のみrw可能
    5 なぜかデバイスのmuteがOnとなっていて音が出ない。 1回だけ発生した。
      それぞれについて、原因と対策を述べます。

      1.USBの認識問題

      当初、USB機器としての認識不良の問題はPiの電力的に貧弱な事が原因ではないかと考えていましたが、
      電力的なもの以外にも要因があることが大分判ってきました。

      udevadm monitorでhotplugの状態をモニターしてみたところ、
      PHA-2の変わった動きが確認できました。
      PHA-2は、電源OFFでもONでもUSB機器として認識されます。
      但し、
      No. PHA-2電源 ベンダコード 機器コード SUBSYSTEM
      1 ON 054C 088C sound
      2 OFF 054C 088D hid
      PHA-2は電源がOFFの場合、HIDデバイスだと振る舞うと同時に、機器コードも違う値に変わります。
      別の機械のフリをするんですね。

      PHA-2の電源をOFF/ONすると、下記のイベントが発生します。

      No. Pi 電源遷移 PHA-2電源遷移 発生するイベント 備考
      1 OFF->ON 088D remove 観測者無し?
      2OFF->ON 088C の存在 eventでは無く状態確認か?
      3 ON->OFF 088C remove sound取り外しevent発生
      4 088D add HID取り付けevent発生
      5 OFF->ON 088D remove HID取り外しevent発生
      6 088C add sound取り付けevent発生
      7 ON->OFF 088C remove sound取り外しevent発生
      8 088D add HID取り付けevent発生

      この様に、PHA-2のOFF/ONに合わせてダイナミックに状態が切り替わります。
      但し、No.1,2に関してはPiとPHA-2の起動タイミングにより発生有無は不定です。
      OS起動時のネゴシエーションの流れまでは確認できていません。

      ホスト(Pi)から見ると、PHA-2の電源がONにされると、
      HID(マウスとかキーボード等の)デバイスがUSBポートから抜かれ、
      代わりに別のサウンドデバイスがUSBポートに差されたと認識することになります。

      電源OFF時にはHIDデバイスのフリをしてUSBポートから充電させるための仕組みでしょう。
      結構トリッキーな気がしますが、今時の機器ってそんなもんなんでしょうか。

      しかし、この動作に問題がありました。
      USB機器としてすら認識されていないケースでは、No.6が発生していません。
      つまりNo.5のHID取り外しイベントは発生しますが、sound機器が差されたイベントがありません。
      当然、lsusbで確認してもSony製品は差されていない状態です。

      OSであるRaspyfi(もしくはlinuxそのもの?)やudevの問題なのか。
      もしくはハードウェアであるRaspberry Piそのものの問題なのか、
      それともPHA-2のファーム制御の問題なのか....。

      それでも何が起きているかは解ったので、リカバリすればなんとかなりそうです。

      USB機器として認識してない場合でも、PHA-2のOFF/ONをすれば認識されますので、
      正しくaudio機器として認識されさえすれば、次のステップに進めます。

      2.ALSAのデバイスとして認識していない問題

      現時点ではPHA-2が正しくsoundデバイスとしてhotplug検出されれば、この問題はクリアされた可能性があります。
      でもまだ安心はできませんが。

      2013年12月2日追記
      やっぱり安心できませんでした。
      起動中にPHA-2をOFF/ONするのであれば問題無い様です。
      しかしpi起動後にPHA-2をONにした場合、ALSAのデバイスとして認識されないケースがあります。
      その場合は/usr/sbin/alsa reloadで認識可能な事を確認しました。
      起動時のチェックで認識していなければreload入れてリカバリすることにしました。

      3.mpdの出力デバイスと一致していない問題

      ALSAのオーディオデバイスは、下記の様にcard0, card1,...と名前が振られます。
      # ls -l /proc/asound

      上記はオリジナルとは違い、敢えて内蔵音源を認識させていない状態です。
      オリジナルでは、Raspberry Piの内蔵音源であるbcm2835もcard1として検出されます。

      問題は、card0,card1は認識された順番により振られる番号だと言う事です。
      これは、PHA-2の電源投入が遅れるとPHA-2がcard1になることがあるということです。実際あります。
      それ自体はALSA的には仕様通りですが、問題はRaspyFiのmpdがデフォルトではcard0しか認識しない事です。
      その結果、PHA-2がcard0以外でALSAに登録されると、そのままでは音が出ない状況に陥ります。

      /etc/mpd.confでは以下の様に出力デバイスを指定しています。
      ここでdeviceを"hw:0,0"と指定しているため、mpdはcard0しか使えません。
      RaspyFiのWeb-UIのソースをみると、deviceを変更する為のUIロジックも入っている様ですが、card番号が変わる度に設定変更が必要では困ります。

      card番号を0に固定する為の方法は、以下の様に色々考えられます。

        mpd.confのaudio_outputにplghwを指定する方法
        mpd側で回避する方法としては出力デバイスを"plghw:Amplifier,0"と記述する手もあります。
        plghwはcard番号のindexではなく、デバイス名称で指定できるので、この問題は回避できます。
        "Amplifier"と言うのは、PHA-2のデバイス名です。#もうちょっとなんとかならんかったのか。

        しかし、調べてみると"plghw"で指定した場合、ALSAの再生ロジックにも違いが出る様です。
        どこまで違うか確かめてはいませんが、plghwは積極的に使いたい方法ではなさそうです。
        mpd.confのaudio_outputを複数個書く方法
        別解として、audio_outputを2つ書き、"hw:0,0" "hw:1,0"の両方に出力させる事も可能です。
        でもスマートじゃないので没。
        強制的にUSBデバイスをcard0にする方法
        /etc/modprobe.d/alsa-base.confに
        options snd-usb-audio index=0
        を追加する。と言うのが一番シンプル。
        この問題自体が無くなる様に、内蔵音源デバイス自体をOSに認識させない方法
        /etc/modulesのsnd-bcm2835をコメントアウトします。
        この問題自体が無くなる様に、内蔵音源デバイス自体をALSAに認識させない方法
        /etc/modprobe.d/alsa-base-blacklist.confに追加する。

      当初は、内蔵音源デバイス自体をOSに認識させない方法を使っていました。

      しかしUSB認識に失敗したケースで/proc/asound自体が生成されない場合があったので、現時点ではUSBをcard0に強制するシンプルな方法
      /etc/modprobe.d/alsa-base.confにoptions snd-usb-audio index=0を記述する方法でtrial中です。
      でもUSB認識されないロジックが判明する前の処置だったので、どちらも違いは無いかもしれません。

      2013年12月2日追記
      これは後述するudevdが殺されている事が原因だった可能性と、ALSA自体が認識に失敗していた場合に発生した可能性がありそうです。
      このどちらかが原因だと考えられますので、方法はどちらでも問題無い気がします。

      4.mpdの再生時に出力エラーとなる問題

      次のステップは、hotplugの問題です。

      USBとして認識しなかった場合や、使用中にPHA-2の電源をOFFにした場合、電源をONにして正しくaudioデバイスとして認識されても、mpdからの音楽再生時にエラーとなり、音は出ません。

      hotplugの仕組みにより、自動的に/dev/sndにdeviceが作成される所までは問題ありません。
      しかし、このdeviceのaccess権がroot onlyで作成されてしまいます。
      これが原因でmpd(group audioに所属)はPHA-2に出力する権限がありません。
      これはALSAのバグですね。
      2013年12月2日追記
      ALSAのバグじゃなかった。詳細はこの項目の末尾へ記載

      この問題はhotplug動作後にdevice nodeのaccess権を変更すれば対処可能です。
      /etc/udev/rules.d/又は/lib/udev/rules.d/にルールを作成します。

      /etc/udev/rules.d/に39-usb-alsa.rulesを作る場合
      /lib/udev/rules.d/78-sound-card.rulesを改造する場合
      どちらも下のようなスクリプトを用意しておけば、PHA-2電源ONの際に呼び出されました。
      /root/bin/udev-hotplug.sh
      service udev restartとかしたらちゃんと動き出しました。
      まぁ、デバイス決め打ちしちゃってるので、もう少し細かくフィルタすべきかもしれません。

      2013年12月2日追記

      原因は、udevdをraspyfiが殺している事と判明。
      確かにhotplugが不安定な気はしていましたが、起動時には動作しているudevdがいつの間にか死んでいます。

      調査の結果、raspyfiの独自追加部分である/var/www/command/orion_optimize.shでkillしている事が判明。
      killallで皆殺しにしてます...。

      起動してしまえばhotplug不要!と言うことなんでしょうか。
      それとも音楽再生以外は全てを犠牲にすると言う事でしょうか。
      ちょっとストイックすぎる気もします。
      udevが動作することで音楽再生に何か問題が発生するのかもしれません...。
      何れにしても原因は解ったので、現時点ではudevdを活かしてみる事にしました。

      副次効果として、この変更を加える事でhotplug時のroot permission問題も無くなりました。
      つまりhotplug時に/dev/snd/以下のノードは期待通りaudio groupで生成されます。
      従ってudevのルールに変更を加える事も一切必要なくなりました。

      /var/www/command/orion_optimize.shに下記の変更を加えました。
      5.全チャネルmute問題
      レアだと思われるけど全チャネルにmuteが勝手に掛かるケースへの対処はこんな感じです
      起動時のステータスチェックの最後辺りに入れてます。
      発生頻度が高いようだったら、hotplug時にも対処要かもしれません。

    PHA-2とUSBの関係 電力編
    PHA-2側も認識問題の原因の一つなのかもしれません。充電仕様が結構特殊。

    今のところ下記が分かっています。

    1 充電には必ず付属のUSBケーブルを使えと取説に書いてある。結線は普通のUSBケーブルだった。
    2 USB-ACアダプタから充電するには、D+とD-がショートしていないケーブルではダメっぽい。
    3 PCに接続した状態で、PHA-2の電源をOFFにしないと充電されない。
    4 取説には、PCがスタンバイ状態だと充電されないと書いてある。
    5 Piが起動中にPHA-2の電源をOFFにすると充電される。仕様通りか。
    6 5の状態でPiをshutdownすると充電が止まる。仕様通り?っぽい。

    PHA-2にはチャージ状態を示すLEDがありますので、充電可否はLEDで判断しました。
    つまり起動したPCにPHA-2の電源をOFFにして繋げと言うことらしい。
    もしくは普通のスマホ同様の充電専用ケーブルでUSB用ACアダプタやモバイルバッテリから充電しろと。

    ちなみにバッテリに付属のSONYのUSB-ACアダプタは、アダプタ内部でD+とD-がショートしていました。
    これは、東芝のREGZAでも同様でしたが、この仕組みならケーブルは通常の結線のまま行けますね。

    ちょっと面倒くさい仕様みたいです。つまり使いながらの充電はできないらしい。
    というか、充電できないのは構わないのですが、ACアダプタで連続駆動できない?と言うことでしょうか?

    でもそれじゃ、パソコンのUSB-Audioアダプタとしては使えなくなるのでそんなはず無いか?

    そんなはずないだろうと、調べてみました。
    No. 供給元 ケーブル 状態 PHA-2
    の電源
    CHG
    LED
    電流値
    1 Pi ON 付属(普通のUSB) 使用中 ON OFF 285mA〜300mA
    2 Pi ON 付属(普通のUSB) PHA-2だけOFF OFF ON 400mA
    3 Pi OFF 付属(普通のUSB) shutdown後 ON OFF 0mA
    4 Pi OFF 付属(普通のUSB) shutdown後 OFF OFF OFF
    5 USB-AC D+D-ショート 充電専用 ON OFF 0mA
    6 USB-AC D+D-ショート 充電専用 OFF ON 800mA
    7 USB-AC 付属(普通のUSB) ---- ON OFF 0mA
    8 USB-AC 付属(普通のUSB) ---- OFF BLINK N/A

    やはりUSB-Audioアダプタとして使用する場合も、300mA程度の電流が流れます。
    300mAがPiの供給限界?でもNo.2の結果では400mA出せていますので、そうではなさそうです。
    PHA-2の動作に必要な電流は300mA程度と考えられるのでしょうか。

    どうやら、USB-Audioアダプタとして連続使用は可能な様です。

    そして同時に、この事実はPHA-2がホスト機器の電力を吸い取って動作している事も示しています。

    PHA-2とUSBの関係 認識編
    #lsusbの出力です。
    Device 004がPHA-2です。
    というか、HI-DISCのUSBメモリって、実はKingstonだったのか。

    PHA-2とUSBの関係 認識編 さらに詳細
    lsusb -vで取得した詳細情報です。500行以上あります。
    lsusb -vの結果
    これはPHA-2の入力セレクタSWを「PC接続モード」にした場合の結果です。
    間違って「walkman接続モード」になってると、電源をOFFにした時と同様にHIDデバイスとして認識されます。
    Audio deviceとして認識されないので、壊れたかと結構アセります。
    当然、音も出ません。

    ここで、
    と言う行から、USB Audioとして使ってる時はSelf Powered扱いであることが判ります。
    でも0mAだよと言いつつ、電力吸い取っていることは、前述の通りです。

    ちなみに入力セレクタ間違ったときは、HIDデバイス且つ、MaxPower 500mAでした。

    PHA-2とALSA(mpd)の関係 volume編
    volumeをコントロールするmpdのパラメータmixer_typeにはdisabled, software, hardwareが指定できます。
    デフォルトではdisabled。つまりmpdからは音量の操作ができないので不便。
    softwareは音のデータを変えることになるので論外。
    hardwareでコントロール出来ることがベストだが、そのままだと上手く動かない。

    下記の方法でDSD以外はコントロールできる事を確認。
    この設定でalsamixerの'Sony Clock Selector'とリアルタイムに連動する。

    PHA-2には3つのvolume control interfaceがあるようだ。
    そのうち2つが'Sony Clock Selector'と連動し、もう一つは'Sony Clock Selector 1'に振られている。
    使い分けはamixerコマンドによると前者がfront left,rightで、後者はMONOらしい...?

    この設定によりwavファイルの音量は調整できたが、dsfファイルは1目盛絞っただけで音が消える。
    これでは音量調整ではなくてON/OFFだ。DSDだけダメとは。
    もう一つのvolume(MONO)でも同じ状態だった。

    asound.stateの変更等で調整可能なのか要調査。

    /etc/mpd.conf
    mixer_controlに入れるべきデバイス名は、amixer -c 0 で確認した。
    使えるコントロールは前述の通り2組,3つのvolumeチャネル
    # amixer -c 0
    alsamixerの出力結果は下記。
    # alsamixer
    alsamixer

    RaspyFiとmpdの事 USBメモリ編
    RaspyFiではデフォルトで10個のUSBメモリが差されても使えるようになっています。
    そしてそれらは実際に差されている時だけ、自動的にマウントされる仕組みです。
    とても便利なのですが、mpd側は実際にUSBメモリが存在すると思って参照してしまいエラーを吐きます。
    /var/log/mpd/mpd.log
    mpd.logには再生したファイル名なども記録されている様ですが、起動の度に上記ログが出て鬱陶しい。
    /etc/auto.usbを下記の様に修正した。
    まぁ、2個もマウントできれば十分でしょう。

    今のところ、この様な状況です。

    リカバリ含め大体安定して来た感じです。

    DSDの曲間ポップノイズと、音量調整不可についてはまぁ、許容しています。
    ただ、全チャネル突然muteなど新たなトラブルも発生してるので、この先まだ何かあるかもしれません。

    とりあえずは容量256GB(USBメモリ)+50GB(SDXC側の残り)と言う大容量(サイズも)DSDネイティブ再生可能なデジタルオーディオプレイヤーに仕上げることができました。

    ...夏場はヤバいかもなぁ。

    そういえばPCM-D100も発売されてます。
    発売前日にヨドバシ店頭のガラスケース内に既に箱があり、入荷していること見つけちゃったんだけど...
    今のところ、買いに走らずに済んでいますが...。


    戻る

    inserted by FC2 system