12
19
2016
BeagleBone + Botic で簡単DSD Native 再生(その6)
BeagleBone Botic 環境の改善
先ずは『電源ブチッ!!!』から

Rapsberry Pi 用に購入してあったミニUPS “Galileo 7” を流用することにした
とりあえず、MPDやRoonで問題無く再生できるようになったので、次はBBB/BBG Botic環境の改善について紹介しようと思う.先ずは、このままではAudio装置としては全く使いものにならないので、最低限何時でも『電源ブチッ!!!』ができるような対策を施さなければならないだろう.
Linux剥き出しのコンピュータシステムなんてAudio装置の仲間入りさせる訳には行かない.組み込み系のシステムでは電源ブチッ!!!でも壊れないような仕組みが備わっているが、通常のLinuxでは稼働中に電源ブチッ!!!を行うと、殆どの場合ファイルシステムが壊れてとても厄介な事になる.lightMPDなどのアプローチは素晴らしいが、如何せんユーザレベルでおいそれと手を出すことができないのが難点だ.
できればlightMPDのようなソフトウェア的なアプローチが出来れば良いのだが、先ずはハードウェアで何とかする事を考えよう.幸いなことに BeagleBone Black/Green では Power Button SW が基板上に設けられており、BoticなどのBeagleBone用のディストリビューションはこのPower Button SWを数秒間押下するだけで自動的に強制シャットダウンして電源が切断されるようになっている.
このSWはCapeなどの拡張基板を載せてしまうと指で簡単に押せなくなってしまうのが難点だが、このSWを直接押下しなくとも、拡張端子 P9 の#9番ピンにこのSWの信号が接続されており、このピンを “Low” 側に落とすことでSWの押下と同じ事を実現可能だ.
今回導入するのは、この Power Button SW を外部の電源監視装置経由で ON/OFF させる事で、電源断時のシャットダウン制御を行うことを考える.何となく難しそうな仕組みが必要と思うかもしれないが、要は家庭用のPCやサーバ用途で使われているUPS装置と同じような物を導入して、BeagleBoneを制御してしまおうと言う魂胆だ.
勿論、UPSと言ってもPC用やサーバ用のAC電源を前提とした大袈裟な物ではなく、モバイルバッテリーや乾電池などで動作させることのできる超小型UPS装置を使うことになる.今回使用した超小型UPS装置 “Galelio 7” はRaspberry Pi用に開発されたもののようだが、 “Galelio 7” 自体は汎用性が高いので BeagleBoneなどの +5V単一電源で動作可能な小型コンピュータ類は何でも対応可能だ.
この超小型UPS装置 “Galelio 7” については、以前の記事『Raspberry Pi の電源対策』で紹介しているので、製品についてはそちらの記事を参照して欲しい.
“Galelio 7” と BeagleBone Black/Green との組みあわせ方法
“Galelio 7″の動作シーケンスについては、Galileo 7 製品ドキュメントか、先の記事『Raspberry Pi の電源対策』に書かれているので、先ずはその内容を理解して欲しい.

Galelio 7 の動作試験中

BeagleBone側のP9コネクターの電源部と接続する
今回の要点としては、電源断検出やUPSから手動でのシャットダウン要求が発せられた場合に、CN8のStatus(#2ピンまたはCN5のStatusピン)信号が Low -> High(3.3V)に遷移するので、この Status 信号を利用して、BeagleBoneのPower Button SWを ON (P9 : pin #9 を “Low” 状態へ遷移させる)仕組み(インタフェース)を作るだけだ.
極めて単純な仕組みなのだが、ちょっと厄介なのは UPS側の Status信号が “Hi” active であることと、BeagleBoneのPower Button SW が 電源の ON/OFF を繰り返すトグルSWになっており、押下状態( “Low” )のままだと、電源断後に直ぐ “ON” シーケンスに移ってしまい、再起動してしまうことだ.電源断後に再び電源が入らないようにさせるための何らかの対策が必要だ.
BeagleBoneのピン#9に印加されている電圧を測ってみると+2.7V程だった.このピン#9をどの位の時間”Low” に保つ必要があるのかハッキリしないが、ピン#9をほんの一瞬GNDに落とすだけでもパワーオン/シャットダウンシーケンスに入ることが確認できたので、数十ミリ秒程度 “Low” 状態を保てば良さそうだ.
74HC123などのワンショットのモノマルチバイブレータを使うのが手っ取り早いのだが、もう1種類ロジックICを追加しなければならないので、今の基板上には載せるスペースが全く取れない.仕方が無いので現状の3個のロジックICの組みあわせで無理矢理組んでみることにした.
“Galelio 7” はバッテリー駆動状態に入ると、CN5のStatusピンが “Low” → “Hi” に遷移するので、その信号をインバータ(74HC04)に送り反転させた後、3ステートバッファ(74HC126)に送る.BeagleBoneのPower ON/OFF SWピン(P9-#9pin)との間に3ステートバッファを設けたのは、電源がOFFになった際に、Power ON/OFF SWピンが “Low” の状態に陥るのを防ぐためだ.
BeagleBone側の電源がOFFになった状態でも、この時点ではUPSから電源供給は続いており、Power ON/OFF SWピンが “Low” の状態では再びBeagleBoneの電源がONになってしまうからだ.3ステートバッファのOEポートがBeagleBoneの+3.3V電源につながっているので、BeagleBoneの電源が切れると、OEが “Low” となるので、バッファの出力ポートは “Hi-Z”ハイインピーダンス状態になり、Power ON/OFF SWピンが通常の”Hi” 状態を保つことになるので、意図せぬ再電源ONを回避することができる.
BeagleBoneの電源が切れてから数秒経過後に”Galelio 7″ 側もUPS動作を停止し、バッテリーからの電源供給もOFFになる.この状態で双方が完全にOFFの状態(正確にはUPS側は “Shutdown/PowerOn Switch” からの入力待ちの待機状態)となる.
BeagleBoneを再び起動するには、UPS供給側の電源(J1)をOFF→ONに遷移させるか、UPS側に電源が供給されている状態(UPS側で強制”Shutdown”処理した状態)であれば 単純に”Shutdown/PowerOn Switch” を押せば良い.
この辺のUPSの動きは、IT系のエンジニアリング経験が無いとピンと来ないかも知れないが、わざと停電状態を作ったり、”Shutdown/PowerOn Switch”を押下してみたりしながら実験してみて欲しい.
【追記】試作3号機では IC1 のインバータをオープンコレクタ(ドレイン)タイプの 74HC05 に変更している. 74HC05 を用いるときは5kΩ程度の抵抗を介して直接するように変更した.この抵抗の値が低すぎると#9 pinの電圧が下がりすぎて電源OFF後に再び電源SWがON状態になってしまうので、この辺の値はトライアンドエラーで適切な値を決める必要がある.
IC1 のインバータをオープンコレクタタイプにすると、インジケータ用の各種LED(44.1KHz/48.0KHz、Cape Enable, DSD ON)を直接繋いで点灯させることができるので、水晶発振器のクロック切り替え用に1回路しか使っていなかった残りの回路を流用できるので都合が良い.但し、オープンコレクタなので、水晶発振器のクロック切り替え用の出力端子を適切な抵抗でプルアップしておく事を忘れないように.
Mini UPS “Galelio 7″とBeagleBone の結線

“Galelio 7″とBeagleBone の結線

“Galelio 7″とBeagleBone の結線(オープンコレクタタイプのインバータの場合)
Galelio 7と組み合わせるバッテリー
Galelio 7が想定するバッテリーのタイプは、所謂モバイルバッテリーと呼ばれているスマートフォン充電用のLiイオンバッテリーだ.このタイプのバッテリーは入出力とも+5Vになっており、RaspberryPiやBeagleBoneなどの外部供給電源として都合が良い.
実際に小型のスティックタイプのモバイルバッテリー(2,600mAH: Max 1A: 自動シャットダウン機能無し)を接続してみたが、電源が貧弱?すぎて電圧不足に陥ってしまうようで、バッテリーに切り替わった途端に落ちてしまう.最大1Aの供給能力では足りないのかそれとも電圧が低いのか、いずれにしてもまともに利用するには2A以上の電源供給能力のあるモバイルバッテリーが必要だろう.
(注:モバイルバッテリーの大部分の機種はオートパワーオフ機能が付いており、このような機種は今回の用途としては使用できないので注意が必要だ.出力コネクタを繋げば常に電源が供給され続ける機種以外は基本的に使用できないと思って良いだろう.この手のモバイルバッテリは殆ど出回っていないが、ラジコン屋さんの世界では7.2V出力のLiイオンバッテリーやNi-MHバッテリーが広く出回っているようなので、このバッテリーを使って5.0Vに降圧させて使うという手もあるだろう.何れにしてもシャットダウンのためのバッテリーシステムに煩わされることになるだろう.)
モバイルバッテリーを使う上で気になる点として、Liイオンバッテリーのセル電圧は通常 3.6〜3.7Vなので、+5V出力を行うためには何らかの昇圧回路が必要だ.この手の安価なモバイルバッテリーでは簡易なDC-DCコンバータを利用していると思われ、発生するノイズなどお構いなしの世界だろう.緊急時の臨時電源とは言え、Hi-Fiオーディオの世界にノイズ発生源を持ち込むのはできる限り避けたいところだ.
念のためGalelio 7とモバイルバッテリーの組みあわせで、供給電源にどのようなノイズが加わるのか簡単に探ってみた.先ずは、Galelio 7とモバイルバッテリーを繋ぎ、BeagleBoneをOFFにした状態で、+5V出力ラインのノイズをオシロスコープで観察して見た.

Liイオンタイプのモバイルバッテリから供給した際の電源ノイズ [ Battery Operation ]

ニッケル水素充電池から供給した際の電源ノイズ [ Battery Operation ]

通常運用時の電源ノイズ [ Normal Operation ]

BeagleBoneが稼働すると電源廻りのノイズは凄いことに...
やはり、Liイオンタイプのモバイルバッテリはニッケル水素充電池の場合よりも圧倒的にノイズが多い.どちらもスパイク状のノイズが見られるが、このノイズはバッテリー駆動中だけに現れるもので、電源が給電ポート(J1)から供給されている場合は、このノイズは観察されないので、通常の運用時にはそれ程問題にはならないだろう.
市販のモバイルバッテリを色々と探し回ったが、常時電源出力に対応している製品が見つからなかったので諦めてLi-ionバッテリで自作することにした.これなら電源容量や出力可能な電流の問題は回避できるのだが、自動充電の仕組みを組み込むのは厄介そうだ.Li-ionバッテリは取り扱いを間違えると発火したり爆発の恐れがあるのでその辺の安全対策も必要だ.自動充電の問題はさておいて、秋葉原で18650タイプのLi-ionバッテリ2本を購入し、+5V/+3.3V出力のバッテリー電源を作ってみた.でも18650タイプだと大きすぎて、コンパクトタイプのケースには組み込めそうもない.
Li-ionの他に、Li-Poの小型角形バッテリを使えばサイズの問題は何とかなりそうだが、相変わらず充電問題はつきまとう.秋月電子で 5.4V 25F というスーパーキャパシタ(電気二重層コンデンサ)を手に入れたので、バッテリーの代わりにスーパキャパシタを使うという手も考えられそうだ.ただ、25Fのスーパーキャパシタだと初期充電電流の問題があり、単純に電源ラインに組み込むことはできそうにもない.初期受電電流を低く抑えながら25Fの大容量を満たすのは結構大変そうだ.
Li-ionバッテリは過放電や過充電防止の保護回路を付けないととても危険だ.今回は実験なので保護回路は省いているが、実運用で使うには必ず保護回路を組み込むことを肝に銘じておいて欲しい.

とりあえずLi-ionバッテリ2本でバックアップ用の+5V/3.3V電源を作ってみた
【追記】Seeed Studio の LiPo Rider Proで問題解決?
UPSのバッテリーバック用の電源として適切な物を探していたら、Seeed Studio から “LiPo Rider Pro” というLiポリマーバッテリー充電器兼5V 安定化電源が発売されていたので試しに購入してみた.UPSのバックアップ電源用なので、勝手にバッテリーに充電してくれて外部からの電源供給が止まってもバッテリー電源で5V給電を続けてくれる.使い方としてはノートPCをACアダプタとの組みあわせで使うイメージに近い.今回の目的はLinux OSがシャットダウンするまでの短時間(数秒程度)用途なので、Liポリマーバッテリーも小容量で済む.ちなみにLiPo Rider Proのお値段も $14.95 U.S. (千石電商で1,750円) 程なので、400mAhのLiポリマーバッテリ(750円)と合わせてもモバイルバッテリーと大差ない.

Seeed Studio の LiPo Rider Pro はモバイルバッテリーと同じような使い方ができそうだ
Micro SDカード起動から内蔵eMMC起動へ変更する
BeagleBoneではデフォルトで内蔵のeMMCと呼ばれているフラッシュメモリ領域から優先的にOSの起動が行われるように設定されている.内蔵のeMMCにはメーカー出荷の段階で、最初からAngstrom Linux がインストールされており、電源を入れるとこのAngstrom Linux が起動されてしまう.
BeagleBoneではこの内蔵のeMMC以外のブータブルデバイスからOSを起動させることが可能だが、Micro SDカードからOSを起動させるには、S2スイッチを押しながら電源を投入させる必要がある.このS2スイッチはCapeボードを上に載せてしまうと指で簡単に押すことができなくなってしまうので、Micro SDカードからOSを起動させることが難しくなってしまう.

BeagleBone Black System Rev C.1 Reference Manual P108 より引用
このS2スイッチは、マニュアルの108ページ Fig.63 に記載されているように、S2スイッチを押すと100オームの抵抗を介して SYSBOOT[2] (P8拡張端子のpin#43 : LCD_DATA2/GPIO2_8 )がD-GND側に落ちるようになっている.つまりP8拡張端子のpin#43を100オームの抵抗を介してD-GNDと接続しておけば良い.但し、このピンは GPIO2_8 やLCD_DATA2 などでも使用されるので、他の用途にこのピンを使う場合には、OS起動後にこのピンを開放(切り離す)する必要がある.
恒常的にMicro SDカードからOSを起動させるのであればこの方法でも良いのだが、Micro SDカードをOSの起動ボリュームに使用する事は信頼性や性能面から不安が残る.そこで今回は、デフォルトでeMMCフラッシュストレージにインストールされているAngstrom Linuxを消して、その代わりに Botic を入れてしまおうという計画だ.
Linuxのブートメカニズムに関する専門知識がない限り、Linuxのブートシーケンスの制御は難しい.幸いなことに Boticには ”/opt/scripts/tools/” 配下に便利なユーティリティーツールが用意されており、その中に 現在起動中のシステムをそっくりeMMCフラッシュストレージにコピーしてくれるシェルスクリプトがある.
それでは、早速その便利なスクリプトを使ってeMMCフラッシュストレージに Botic をコピーして見る事にする.尚、今回は最初 Botic 7 環境でこのスクリプトを使って実験を行ってみたが、コピーまでは上手く行くが、その後のOS起動時に OS カーネルイメージを読み込むデバイス名(/dev/mmcblk0p0)がSDカードからeMMC側に切り替わってくれなく、uEnv.txt のカーネル起動デバイスを “/dev/mmcblk1p0” に変更しないと上手く起動してくれなかった.恐らくBotic 7 では Micro SDカードからブートさせるために、何らかの方法でブートデバイスに対して操作を加えてしまっているのだろう.
Botic 4 ではこの問題は発生しなかったので、今回はBotic 4 での実行結果を紹介する.Botic 4 で一旦 eMMC側にシステムをコピーしておき、その後に Botic 7 にアップデートすれば良いだろう.(注:eMMC上のBotic 4 をBotic 7に先の記事『BeagleBone + Botic で簡単DSD Native 再生(その2)』で紹介した方法でアップデートするとブートデバイスの関係でBoticが起動しなくなる.この対策方法についてはこの後で紹介する.)
上記の実行例ではeMMCへのコピースクリプト"/opt/scripts/tools/eMMC/generic-eMMC-flasher-12mb.sh" をそのまま実行すると、途中で /dev/mmcblk0p1 が既にマウントされているとして怒られてしまうので、最初に /dev/mmcblk0p1 をアンマウントしてから、generic-eMMC-flasher-12mb.sh を実行する必要があるようだ.
エラーが発生していなければ次回の起動からMicro SDカードを抜いた状態で電源をONするだけで eMMCにコピーされた Botic が起動されるだろう.
eMMC上の Botic 4 を Botic 7 にアップデートしたら起動しなくなってしまった.
どうやらBotic 7 にアップデートすると、eMMC上のルートパーティションをデバイス名"/dev/mmcblk0p2 " で参照しようとして失敗しているようだ.Botic 4 の場合は eMMC上にシステムをコピーし、eMMCから起動した場合でも、eMMCが "/dev/mmcblk0" として認識されているが、Botic 7 にアップデートしてしまうと、eMMCのデバイス名が "/dev/mmcblk1" として認識されてしまうことが原因のようだ.
このような事が起きる根本的な原因はまだ不明だが、とりあえずこの問題を回避する方法が見つかったので紹介しておく.
【対処方法】先ず、手元にあるMicro SD カードからBoticシステムを起動させる.このときMicro SD カードが、"/dev/mmcblk0" に割り当てられていることを確認しておく.また、eMMCが"/dev/mmcblk1"として認識されていることも確認しておく.
/tmp配下に"boot"などの適当な名前でディレクトリを作成し、eMMC上の Botic 7 のブートパーティション "/dev/mmcblk1p1" を一旦このディレクトリにマウントする.マウント後に "uEnv.txt" ファイルを編集し、その中のデバイス名(番号)に該当する部分を "0" → "1" に修正する.システムをシャットダウンし、Micro SD カードを抜き、再び起動させると今度は無事 Botic 7 が立ちあがるだろう.
修正後の "uEnv.txt" ファイルは次の様になるだろう.
再起動後に Botic 7 が eMMC から起動されていることを確認.
Botic 7 を eMMCからブートするとブート用のFATパーティションが見えなくなる
Botic 7 を eMMCブートに変更すると、これまで見えていた(マウントされていた)ブート用のFATパーティションがマウントされずに見えなくなる.動作上は特に問題は無いが、Boticカーネルオプションを変更するためには、ブートパーティションデバイス "/dev/mmcblk1p1" を 一次的に"/tmp/boot" や "/boot/uboot" などにマウントしてから編集を行う必要がある.
これ以外にも、ブートパーティションデバイス "/dev/mmcblk1p1" は FATパーティションなので、MacやWindowsでは、BeagleBoneをUSBクライアントコネクタ側(BeagleBone Black: Mini USB Type-B, BeagleBone Green : Micro USB )に接続するだけで、"/dev/mmcblk1p1"がマスストレージデバイスとして認識(外付けハードディスクなどと同じ扱い)されるので、MacやPC上から直接編集することが可能だ.

クライアント側のUSBポートをMacやWindowsに接続する

MacやWindowsではBeagleBoneのFATパーティションは
USBマスストレージクラスデバイスとして認識される